Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 06:02

Проблема с методом учета ТМЗ-ФИФО

Автор Zorro, 01 ноя 2019, 00:35

0 Пользователей и 1 гость просматривают эту тему.

Zorro

Приветствую всех программистов и тех кто только начал заниматься этим интересным но не простым делом.Есть шанс устроиться на работу стажером,дали задание,создать простую конфигурацию для торг организации,возникла проблема при написании части кода для списания товара по методу Фифо.Написал часть процедуры выдавало сообщение об ошибке если хотел списать больше чем нужно,но дописав сам метод фифо при отладке вообще не выдает никакой ошибки но при этом перестало вообще делать записи в регистре накопления товары и выдавать сообщение об ошибке,помогите разобраться а то уже предел.

Процедура ОбработкаПроведения(Отказ, Режим)
   
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   // регистр РегистрПродажи Приход
   Движения.РегистрПродажи.Записывать = Истина;
   Для Каждого ТекСтрокаТовары Из Товары Цикл
      Движение = Движения.РегистрПродажи.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
      Движение.Период = Дата;
      Движение.Контрагент = Контрагент;
      Движение.Договор = Договор;
      Движение.Склад = Склад;
      Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
      Движение.Сумма = ТекСтрокаТовары.Сумма;
   КонецЦикла;

   Движения.Записать();
   
      
   Если Режим = РежимПроведенияДокумента.Оперативный Тогда
      
      //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   РегистрТоварыОстатки.Товар,
      |   РегистрТоварыОстатки.Склад,
      |   РегистрТоварыОстатки.КоличествоОстаток КАК Количество
      |ИЗ
      |   РегистрНакопления.РегистрТовары.Остатки(
      |         ,
      |         Склад = &Склад
      |            И Товар В
      |               (ВЫБРАТЬ
      |                  РеализацияТоваровТовары.Номенклатура
      |               ИЗ
      |                  Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
      |               ГДЕ
      |                  РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК РегистрТоварыОстатки
      |ГДЕ
      |   РегистрТоварыОстатки.КоличествоОстаток < 0";
   
   Запрос.УстановитьПараметр("Склад", Склад);
   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   
   РезультатЗапроса = Запрос.Выполнить();
   
   Если Не РезультатЗапроса.Пустой() Тогда
   Отказ = Истина;
   
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить("Недостаточно товара "+ВыборкаДетальныеЗаписи.Товар+" в количестве "+ВыборкаДетальныеЗаписи.Количество);
   КонецЦикла;

   Если Не Отказ Тогда
      
   Запрос1= Новый Запрос;
   Запрос1Текст =
      "ВЫБРАТЬ
      |   РегистрТоварыОстатки.Товар,
      |   РегистрТоварыОстатки.КоличествоОстаток,
      |   РегистрТоварыОстатки.СтоимостьОстаток,
      |   РегистрТоварыОстатки.Партия КАК Партия,
      |   РеализацияТоваров.Товары.(
      |      Номенклатура,
      |      Количество
      |   )
      |ИЗ
      |   РегистрНакопления.РегистрТовары.Остатки(
      |         &МоментВремени,
      |         Товар В
      |            (ВЫБРАТЬ
      |               РеализацияТоваровТовары.Номенклатура
      |            ИЗ
      |               Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
      |            ГДЕ
      |               РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК РегистрТоварыОстатки,
      |   Документ.РеализацияТоваров КАК РеализацияТоваров
      |
      |УПОРЯДОЧИТЬ ПО
      |   Партия";
   
   Запрос1.УстановитьПараметр("МоментВремени", МоментВремени());


   Запрос1.УстановитьПараметр("Ссылка", Ссылка);

   
   РезультатЗапроса1= Запрос.Выполнить();
   
   ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();
   
   Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
      ОсталосьСписать=ВыборкаДетальныеЗаписи1.Количество;
      ВыборкаПартии=ВыборкаДетальныеЗаписи1.Выбрать();
      Пока ВыборкаПартии.Следующий() И ОсталосьСписать <> 0 Цикл
      Списать = Мин(ОсталосьСписать,ВыборкаПартии.КоличествоОстаток);
      Себестоимость = Списать*ВыборкаПартии.СтоимостьОстаток/ВыборкаПартии.КоличествоОстаток;
      
      
    Движения.РегистрТовары.Записывать = Истина;
   Для Каждого ТекСтрокаТовары Из Товары Цикл
      Движение = Движения.РегистрТовары.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.Склад = Склад;
      Движение.Товар = ТекСтрокаТовары.Номенклатура;
      Движение.Количество = Списать;
      Движение.Стоимость = Себестоимость;
      Движение.Партия = ВыборкаПартии.Партия;   
      
      ОсталосьСписать=ОсталосьСписать-Списать;
   КонецЦикла;

           
КонецЦикла;

КонецЦикла;

   
   
      КонецЕсли;
       
   КонецЕсли;
   
      КонецЕсли;

   
                                                                                                          

   
КонецПроцедуры


bsn-chita

Читайте Чистова у него есть статья про проведение документов. Вы скорее всего пытаетесь написать проведение по новой методике, но первым действием пишите в РегистрПродажи, а по идее должны писать в "упрощенный" регистр в котором хранятся только остатки в количественном виде. И уже по нему и идет анализ ушли ли в минус или нет. Далее странное условие на то что делать проведение если режим оперативный(так как если он не оперативный нет ни какого алгоритма). То есть все ваши перепроведения за вчера или ранее будут пролетать насквозь. И далее бегло глянул у вас не появляется второго "полного" регистра(со стоимостью) а используете первый РегистрТовары.
По итогу то что вы написали работать будет только если оперативное проведение(работать и работать правильно разные вещи).
У вас должны быть регистры: ОстаткиТоваров(Товар,Количество) и СтоимостьТоваров(Товар,Количество ...). По первому вы быстро принимаете решение возможно ли проведение и читаете это все у Чистова там довольно подробно и хорошо это описано.

Zorro

Спасибо за совет и ответ,смотрел 13 его видео урок но это помогло отчасти,пытался сделать но придется читать,иначе так и буду плавать.Но скажите разве обязательно делать два регистра для колич и стоим учетов,разве нельзя читать информацию с одного объединенного регистра?

bsn-chita

Цитата: Zorro от 01 ноя 2019, 17:59
Спасибо за совет и ответ,смотрел 13 его видео урок но это помогло отчасти,пытался сделать но придется читать,иначе так и буду плавать.Но скажите разве обязательно делать два регистра для колич и стоим учетов,разве нельзя читать информацию с одного объединенного регистра?
По видео иногда сложно что то делать потому что одна тема может быть растянута на 2-3 урока. У него есть хорошая статья именно про проведение с пояснениями что и зачем. Можно делать и на одном регистре это будет по старой методике. Так как вам дали задание то думаю ожидают что решение будет именно по новой методике.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск