Подобный подход можно использовать для распределения, например,
- по партиям при списании количества товара
- оплаты по заказам, если оплата пришла по договору вцелом
Минусом данного решения является ресурсоёмкость запроса. За основу взято классическое решение запроса с нарастающим итогом. К нему добавлен запрос, преобразующий нарастающий итог в текущее сальдо.
// Заказ собираем в одну таблицу с колонками "Заказ", "Товар", "СуммаЗаказано", "СуммаОплачено"
// колонку "СуммаОплачено" в запросе по заказам заполняем нулями
ВЫБРАТЬ
"Заказ № 1" КАК заказ,
"сапоги гусарские" КАК товар,
100 КАК суммаЗаказано,
0 КАК СуммаОплачено
ПОМЕСТИТЬ табКоличеств
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Заказ № 1",
"валенки Здоровье",
50,
0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Заказ № 1",
"туфельки Золушка",
60,
0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Заказ № 222",
"сапоги гусарские",
200,
0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Заказ № 222",
"туфельки Золушка",
20,
0
ОБЪЕДИНИТЬ ВСЕ
// К запросу по заказам снизу добавляем суммы оплат. При этом колонки Товар и СуммаЗаказано заполняем пустыми значениями.
// но не просто пустыми, а такими, чтобы при сортировке становились ДО значений из таблицы заказов.
// Для колонки Товар в реальном запросе следует использовать Значение(Справочник.Номенклатура.ПустаяСсылка), для колонки Сумма следует использовать 0
ВЫБРАТЬ
"Заказ № 1",
"",
0,
175
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Заказ № 222",
"",
0,
210
;
////////////////////////////////////////////////////////////////////////////////
// Намазываем оплату на товары. Получаем сальдо нарастающим итогом.
ВЫБРАТЬ РАЗЛИЧНЫЕ
табКоличеств.заказ,
табКоличеств.товар,
МИНИМУМ(табКоличеств.суммаЗаказано) КАК суммаЗаказано,
СУММА(табКоличеств1.суммаЗаказано) КАК суммаЗаказаноНарастающим,
МИНИМУМ(табКоличеств.СуммаОплачено) КАК суммаОплачено,
СУММА(табКоличеств1.суммаЗаказано - табКоличеств1.СуммаОплачено) КАК СальдоОплаченоНарастающим
ПОМЕСТИТЬ СальдоНарастающим
ИЗ
табКоличеств КАК табКоличеств
ЛЕВОЕ СОЕДИНЕНИЕ табКоличеств КАК табКоличеств1
ПО табКоличеств.заказ = табКоличеств1.заказ
И табКоличеств.товар >= табКоличеств1.товар
СГРУППИРОВАТЬ ПО
табКоличеств.заказ,
табКоличеств.товар
;
////////////////////////////////////////////////////////////////////////////////
// Превращаем нарастающее сальдо в простое. При этом получем в колонке СальдоПотовару 0 - нет задолженности, число - сумма задолженности
ВЫБРАТЬ
СальдоНарастающим.заказ,
СальдоНарастающим.товар,
СальдоНарастающим.суммаЗаказано,
ВЫБОР
КОГДА СальдоНарастающим.СальдоОплаченоНарастающим > 0
ТОГДА ВЫБОР
КОГДА СальдоНарастающим.СальдоОплаченоНарастающим > СальдоНарастающим.суммаЗаказано
ТОГДА СальдоНарастающим.суммаЗаказано
ИНАЧЕ СальдоНарастающим.СальдоОплаченоНарастающим
КОНЕЦ
ИНАЧЕ 0
КОНЕЦ КАК СальдоПотовару
ИЗ
СальдоНарастающим КАК СальдоНарастающим
УПОРЯДОЧИТЬ ПО
СальдоНарастающим.заказ,
СальдоНарастающим.товар