Для упрощения использовалось только "Количество".
Нашел похожее в статье //infostart.ru/1c/articles/68225/
Но у меня немного другое - конечная таблица соединяется не сама с собой, а с товарами из ТЧ документа списания, "Выбор Когда" без вложенного "Выбор Когда", условия связи другие. Думаю, тут там немного другая задача решалась.
Теперь о теоретической задаче:
У нас проводится документ, например, Реализация товаров и услуг. При проведении мы должны сделать необходимые контроли остатков, списания партий. Для этого мы должны подготовить сначала таблицы, которые будут использоваться под эти задачи. Одна из таких таблиц - "Товары" с Номенклатурой и Количеством - нужна для списания партий.
Считаем, что партия в регистре состоит из одного типа документов (поэтому не используем "Выразить")
Кроме реализации списанием может быть любой другой документ. Поэтому Функция получения таблицы для формирования движений должна быть общего плана.
Итак, сама функция:
//Функция возвращает Таблицу значений, подготовленную для формирования движений по расходу для ФИФО, либо ЛИФО
//МоментВремени - момент времени документа
//МенеджерВТ - Менеджер временных таблиц, в котором есть подготовленная ВТ "Товары"
//ИмяРегистраПартУчета - Имя регистра, по которому нужно найти партии
//ФИФО - булево. Если Истина, то списание по ФИФО, если Ложь, то по ЛИФО.
Функция ПолучитьТаблицуДляСписанияПартий(МоментВремени, МенеджерВТ, ИмяРегистраПартУчета, ФИФО = Истина) Экспорт
Если ФИФО Тогда
ФИФО_ЛИФО = ">=";
Иначе
ФИФО_ЛИФО = "<="; //ЛИФО
КонецЕсли;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
//"ВЫБРАТЬ
//| внешТовары.Номенклатура КАК Номенклатура,
//| внешТовары.Количество КАК Количество
//|ПОМЕСТИТЬ внешТовары
//|ИЗ
//| &Товары КАК внешТовары
//|;
//|
//|////////////////////////////////////////////////////////////////////////////////
//|ВЫБРАТЬ
//| Товары.Номенклатура КАК Номенклатура,
//| СУММА(Товары.Количество) КАК Количество
//|ПОМЕСТИТЬ Товары
//|ИЗ
//| внешТовары КАК Товары
//|
//|СГРУППИРОВАТЬ ПО
//| Товары.Номенклатура
//|
//|ИМЕЮЩИЕ
//| СУММА(Товары.Количество) > 0
//|
//|ИНДЕКСИРОВАТЬ ПО
//| Номенклатура
//|;
//|
//|////////////////////////////////////////////////////////////////////////////////
"ВЫБРАТЬ
| РегистрПартУчетаОстатки.Номенклатура КАК Номенклатура,
| РегистрПартУчетаОстатки.КоличествоОстаток КАК КоличествоОстаток,
| РегистрПартУчетаОстатки.Партия КАК Партия,
| РегистрПартУчетаОстатки.Партия.МоментВремени КАК ПартияМоментВремени
|ПОМЕСТИТЬ ПартииВНаличии
|ИЗ
| ТоварыБезСклада КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления." + ИмяРегистраПартУчета + ".Остатки(&МоментВремени, ) КАК РегистрПартУчетаОстатки
| ПО Товары.Номенклатура = РегистрПартУчетаОстатки.Номенклатура
|ГДЕ
| Товары.Количество > 0
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПартииВНаличии.Номенклатура КАК Номенклатура,
| ПартииВНаличии.КоличествоОстаток КАК КоличествоОстаток,
| ПартииВНаличии.Партия КАК Партия,
| СУММА(ПартииВНаличииКопия.КоличествоОстаток) - ПартииВНаличии.КоличествоОстаток КАК КоличествоДо
|ПОМЕСТИТЬ ПартииСОстаткомДоПосле
|ИЗ
| ПартииВНаличии КАК ПартииВНаличии
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПартииВНаличии КАК ПартииВНаличииКопия
| ПО ПартииВНаличии.Номенклатура = ПартииВНаличииКопия.Номенклатура
| И ПартииВНаличии.ПартияМоментВремени " + ФИФО_ЛИФО + " ПартииВНаличииКопия.ПартияМоментВремени
|
|СГРУППИРОВАТЬ ПО
| ПартииВНаличии.Партия,
| ПартииВНаличии.Номенклатура,
| ПартииВНаличии.КоличествоОстаток,
| ПартииВНаличии.ПартияМоментВремени
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПартииСОстаткомДоПосле.Номенклатура КАК Номенклатура,
| ПартииСОстаткомДоПосле.Партия КАК Партия,
| ВЫБОР
| КОГДА ПартииСОстаткомДоПосле.КоличествоОстаток <= Товары.Количество - ПартииСОстаткомДоПосле.КоличествоДо
| ТОГДА ПартииСОстаткомДоПосле.КоличествоОстаток
| ИНАЧЕ Товары.Количество - ПартииСОстаткомДоПосле.КоличествоДо
| КОНЕЦ КАК Количество
|ИЗ
| Товары КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПартииСОстаткомДоПосле КАК ПартииСОстаткомДоПосле
| ПО Товары.Номенклатура = ПартииСОстаткомДоПосле.Номенклатура
| И Товары.Количество > ПартииСОстаткомДоПосле.КоличествоДо";
Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени, ВидГраницы.Исключая));
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Закомментированная часть запроса - это для того, чтобы было понятно, что за состав в таблице "Товары" (которая в моем примере уже хранится в Менеджере временных таблиц)
Ну и как пример последующего использования:
//Подготовка таблицы товаров
МенеджерВТ = ВашОбщийМодуль.ПодготовитьМенеджерВТ_Товары(ЭтотОбъект, "Товары");
//Получение таблицы значений, подготовленной для списания Партий товаров по методу ФИФО/ЛИФО
ТаблицаДляСписания = ОМ_РаботаСПартиями.ПолучитьТаблицуДляСписанияПартий(МоментВремени(), МенеджерВТ, "ПартииТоваров"); //ФИФО, для ЛИФО - добавить ЛОЖЬ в конце
// регистр ПартииТоваров Расход
Движения.ПартииТоваров.Записывать = Истина;
ВидДвижения = ВидДвиженияНакопления.Расход;
Для Каждого ТекСтрокаТовары Из ТаблицаДляСписания Цикл
Движение = Движения.ПартииТоваров.Добавить();
Движение.ВидДвижения = ВидДвижения;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Партия = ТекСтрокаТовары.Партия;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
Бонусом подготовка Менеджера ВТ:
Функция ПодготовитьМенеджерВТ_Товары(Источник, ИмяТЧ) Экспорт
Запрос = Новый Запрос;
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| внешТовары.Номенклатура КАК Номенклатура,
| внешТовары.Склад КАК Склад,
| внешТовары.Количество КАК Количество
|ПОМЕСТИТЬ внешТовары
|ИЗ
| &Товары КАК внешТовары
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| внешТовары.Номенклатура КАК Номенклатура,
| внешТовары.Склад КАК Склад,
| СУММА(внешТовары.Количество) КАК Количество
|ПОМЕСТИТЬ Товары
|ИЗ
| внешТовары КАК внешТовары
|ГДЕ
| внешТовары.Номенклатура.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
| И внешТовары.Количество > 0
|
|СГРУППИРОВАТЬ ПО
| внешТовары.Номенклатура, внешТовары.Склад
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура, Склад
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
|ПОМЕСТИТЬ ТоварыБезСклада
|ИЗ
| Товары КАК Товары
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура";
Запрос.УстановитьПараметр("Товары", Источник[ИмяТЧ].Выгрузить());
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Выполнить(); //Получили отформатированную таблицу товаров
Возврат МенеджерВТ;
КонецФункции