Запрос Показывающий Остатки В Разрезе Дат Поступления.

Helen234423

New member
19.09.2013
1
0
#1
Добрый день.
Есть такой вопрос.. Конфигурация УТ 10. В заказе поставщику добавлен реквизит в табличную часть товары "планируемая дата поступления". Нужен запрос, который будет показывать остаток по всем датам поступления для конкретного заказа поставщику. Проблема в том, что изменять регистр заказа поставщикам НЕЛЬЗЯ!.
Пример вопроса: Мы ожидаем поступление товаров -
Товар1 в кол-ве 12 шт 23.09.2013
Товар1 в кол-ве 10 шт 29.09.2013
Документом поступления товаров зафиксирован приход 14 шт Товара1 25.09.2013.
Запрос должен показать, что осталось получить 8 шт 29.09.2013.

Буду благодарна за любую подсказку в этом направлении.
 

puh14

Well-known member
11.07.2008
1 412
0
#2
Боюсь что запросом вы сможете вытащить только максимальную дату. Для отработки других вариантов проще сделать постобработку результатов запроса. например тот случай что вы описали:

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

КонецЦикла;
С полученной тз можно делать что угодно - перебирать, скормить СКД.

Запрос не оптимален ( просто мне так быстрее писать было и идея понагляднее), можно сделать и одним зпроосом, с последующим обходам по группировкам, где проводить такие-же действия с ТЗ.

Еще можно поиграться с ВычислитьВыражение в СКД - там можно проводить подобные циклические действия, но тут гораздо больше времени писать.

И кстати - для чего это надо?