Как настроить списание товара по сроку годности в регистре ТоварыНаСкладах?

1. user2121788 10.06.25 10:21 Сейчас в теме
При таком варианте запроса и последующей его обработкой,
списания Количества товара происходят неверно, но Партии, Суммы и ГоденДо заполняются правильно. (см. в скриншоте)

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

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

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

Показать


Как сделать чтобы товар списывался по сериям, сначала товар с ближайшей датой годности, но чтобы при этом партии соответствовали этим списаниям?
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1910619 10.06.25 15:20 Сейчас в теме
А на оборот не пробовал сделать?
Попробуй сделать упорядочивание по "ПоступлениеТоваровТовары.ГоденДо" (верхний кусок запроса)
до того как положишь данные во временную таблицу.

Посмотри обязательно результат до того как положишь его во временную таблицу, и после.

Вопрос зачем брать "Документ.РеализацияТоваровУслуг" если в регистре вроде есть требующие данные?
3. Snoocher 12.06.25 08:41 Сейчас в теме
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
    |        ПО РеализацияТоваровУслугТовары.Номенклатура = ПоступлениеТоваровТовары.Номенклатура
    |ГДЕ

списания Количества товара происходят неверно

В при таком соединении мы получим все поступления по номенклатуре которая в реализации и появляются дубли
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот