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

Движения по документам Реализации не отражаются в регистре накопления ОстаткиТов

Автор НикNik, 10 июн 2022, 15:09

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

НикNik

Всем Добрый день :btbzdb: . Не могу понять, почему движение документа Реализации отражается в регистре накопления ОстаткиТоваров, количество и сумма нет. Документы Поступления отражаются все данные, всё норм.

//Получаем метод списания себестоимости
МетодСписанияСебестоимости = УчетнаяПолитика.МетодСписанияСебестоимости(Дата);


Если МетодСписанияСебестоимости = Неопределено Тогда 

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не указан метод списания себестоимости в учетной политике";
Сообщение.Сообщить();

Отказ = Истина;
Возврат;

КонецЕсли; 

//Удаление движения
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Записать();

//Взводим флажок
Движения.ОстаткиТоваров.Записывать = Истина;

//Блокировка данных
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();

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

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

РезультатЗапроса = Запрос.Выполнить();

ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаНоменклатура.Следующий() Цикл

Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда 

Отказ = Истина;

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Недостаточно товара %1 в количестве %2",
ВыборкаНоменклатура.НоменклатураПредставление,
ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоОстаток);
Сообщение.Сообщить();

КонецЕсли;

Если Отказ Тогда
Продолжить;
КонецЕсли;

КоличествоСписать = ВыборкаНоменклатура.Количество;

ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Количество = Мин(КоличествоСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);

Если Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Себестоимость = ВыборкаДетальныеЗаписи.СуммаПоступленияОстаток;
Иначе
Себестоимость = Количество / ВыборкаДетальныеЗаписи.КоличествоОстаток * ВыборкаДетальныеЗаписи.СуммаПоступленияОстаток;
КонецЕсли;

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

КоличествоСписать = КоличествоСписать - Количество; 

Если КоличествоСписать <= 0 Тогда
Прервать;
КонецЕсли;
 
КонецЦикла; 

КонецЦикла;


LexaK

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

НикNik

LexaK, спасибо за ответ. Вы правы, отладчиком, к сожалению, пользоваться пока не умею.

LexaK

НикNik, наверно подразумевалось использование партий (задача списать по ФИФО)
если в регистре есть измерение Партия то его надо включить в запрос и включить итоги по Номенклатура и Количество
вот примерный запрос, (могут быть ошибки, так как без проверки) для этого запроса остаются ваши циклы, какие были
   Запрос.Текст =
   "ВЫБРАТЬ
   |   РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
   |   СУММА(РеализацияТоваровТовары.Количество) КАК Количество
   |ПОМЕСТИТЬ ВТ_ДокТЧ
   |ИЗ
   |   Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
   |ГДЕ
   |   РеализацияТоваровТовары.Ссылка = &Ссылка
   |
   |СГРУППИРОВАТЬ ПО
   |   РеализацияТоваровТовары.Номенклатура
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Номенклатура
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВТ_ДокТЧ.Номенклатура КАК Номенклатура,
   |   ВТ_ДокТЧ.Номенклатура.Представление КАК НоменклатураПредставление,
   |   ВТ_ДокТЧ.Количество КАК Количество,
   |   ЕСТЬNULL(ОстаткиТоваровОстатки.Партия, Неопределено) КАК Партия, //как там она у вас называется?
   |   ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
   |   ЕСТЬNULL(ОстаткиТоваровОстатки.СуммаПоступленияОстаток, 0) КАК СуммаПоступленияОстаток
   |ИЗ
   |   ВТ_ДокТЧ КАК ВТ_ДокТЧ
   |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
   |            &МоментВремени,
   |            Номенклатура В
   |               (ВЫБРАТЬ
   |                  ВТ_ДокТЧ.Номенклатура КАК Номенклатура
   |               ИЗ
   |                  ВТ_ДокТЧ КАК ВТ_ДокТЧ)) КАК ОстаткиТоваровОстатки
   |      ПО ВТ_ДокТЧ.Номенклатура = ОстаткиТоваровОстатки.Номенклатура
   |УПОРЯДОЧИТЬ ПО
   |//именно нужна явная сортировка партии по дате для ФИФО
   | ОстаткиТоваровОстатки.Партия.Дата //убыв - если для ЛИФО
   |ИТОГИ
   |//формируем первый уровень Номенклатура - Количество (по документу то что надо списать
   | Сумма(Количество),
   | Сумма(КоличествоОстаток)
   |ПО
   | Номенклатура   
   ";
 
 
если помогло нажмите: Спасибо!

НикNik


Теги:

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

Рейтинг@Mail.ru

Поиск