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