Предлагаю начальную версию оптимального запроса и кода (из источника взят только макет). Начнем с того, что стандартные алгоритмы типовых конфигураций не оптимальны. Единственное, что пока не переписаны функции из модуля общего назначения для номера докмента и прочая мелочь в коде. Так, думаю, что для больших документов и тем более пачкой отправляемых на печать (в процессе разработки) многократные обращения к базе нежелательны:
Функция Печать() Экспорт
// упрощенно
Таб = Новый ТабличныйДокумент;
Таб.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Таб.АвтоМасштаб = Ложь;
Таб.МасштабПечати = 100;
Таб.ИмяПараметровПечати = "Акт_за_поставщика_ВПФ";
Таб.ПолеСлева = 10;
Таб.ПолеСправа = 10;
Таб.ПолеСверху = 10;
Таб.ПолеСнизу = 10;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДокСсылка", СсылкаНаОбъект);
Запрос.Текст =
"ВЫБРАТЬ
| Док.Номер,
| Док.Дата,
| ЕСТЬNULL(Док.Контрагент.НаименованиеПолное, ""<НЕ ЗАПОЛНЕН>"") КАК Исполнитель,
| ЕСТЬNULL(Док.Организация.НаименованиеПолное, ""<НЕ ЗАПОЛНЕН>"") КАК Заказчик,
| Док.СуммаДокумента
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Док
|ГДЕ
| Док.Ссылка = &ДокСсылка
| И Док.Проведен
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧДок.НомерСтроки КАК НомерСтроки,
| ВЫРАЗИТЬ(ТЧДок.Содержание КАК СТРОКА(1000)) КАК Товар,
| ТЧДок.Цена,
| ТЧДок.Сумма КАК Сумма,
| ТЧДок.СуммаНДС КАК СуммаНДС,
| ТЧДок.Количество КАК Количество,
| ЕСТЬNULL(ТЧДок.Номенклатура.БазоваяЕдиницаИзмерения.НаименованиеПолное, ""<НЕ УКАЗАНА>"") КАК ЕдиницаИзмерения,
| ВЫБОР
| КОГДА ТЧДок.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ПометкаНДС
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Услуги КАК ТЧДок
|ГДЕ
| ТЧДок.Ссылка = &ДокСсылка
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|ИТОГИ
| МАКСИМУМ(НомерСтроки),
| СУММА(Сумма),
| СУММА(СуммаНДС),
| СУММА(Количество),
| МАКСИМУМ(ПометкаНДС)
|ПО
| ОБЩИЕ";
РезультатПакетногоЗапроса = Запрос.ВыполнитьПакет();
РезультатШапкаДокумента = РезультатПакетногоЗапроса[0];
РезультатТЧДокумента = РезультатПакетногоЗапроса[1];
Если РезультатШапкаДокумента.Пустой() Тогда
Сообщить("Ошибка при печати документа "+СсылкаНаОбъект+". Возможно, документ не проведен или помечен на удаление", СтатусСообщения.Важное);
Возврат Таб;
КонецЕсли;
Если РезультатТЧДокумента.Пустой() Тогда
Сообщить("Ошибка при печати документа "+СсылкаНаОбъект+". Документ АКТ должен содержать хотя бы одну услугу (таб. часть 'Услуги')", СтатусСообщения.Важное);
Возврат Таб;
КонецЕсли;
Макет = ПолучитьМакет("Акт");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ВыборкаШапкаДокумента = РезультатШапкаДокумента.Выбрать();
ВыборкаШапкаДокумента.Следующий();
ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Акт № "+
ОбщегоНазначения.ПолучитьНомерНаПечать(СсылкаНаОбъект)+
" от "+Формат(ВыборкаШапкаДокумента.Дата, "ДЛФ=DD");
Таб.Вывести(ОбластьЗаголовок);
ОбластьИсполнитель = Макет.ПолучитьОбласть("Поставщик");
ОбластьИсполнитель.Параметры.ПредставлениеПоставщика = ВыборкаШапкаДокумента.Исполнитель; // Исполнитель
Таб.Вывести(ОбластьИсполнитель);
ОбластьЗаказчик = Макет.ПолучитьОбласть("Покупатель");
ОбластьЗаказчик.Параметры.ПредставлениеПолучателя = ВыборкаШапкаДокумента.Заказчик; // Заказчик
Таб.Вывести(ОбластьЗаказчик);
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
Таб.Вывести(ОбластьШапкаТаблицы);
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ВыборкаИтоги = РезультатТЧДокумента.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаИтоги.Следующий();
Выборка = ВыборкаИтоги.Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ Таб.ПроверитьВывод(ОбластьСтрока) Тогда
Таб.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ОбластьСтрока.Параметры.Заполнить(Выборка);
Таб.Вывести(ОбластьСтрока);
КонецЦикла;
ОбластьИтого = Макет.ПолучитьОбласть("Итого");
ОбластьИтого.Параметры.Всего = ""+ Формат(ВыборкаШапкаДокумента.СуммаДокумента, "ЧЦ=15; ЧДЦ=2");
Таб.Вывести(ОбластьИтого);
ОбластьИтогоНДС = Макет.ПолучитьОбласть("ИтогоНДС");
Если ВыборкаИтоги.ПометкаНДС = 0 Тогда
ОбластьИтогоНДС.Параметры.НДС = "Без НДС"; // В документе по всем строкам установлено БезНДС
Иначе
ОбластьИтогоНДС.Параметры.НДС = "В том числе НДС";
ОбластьИтогоНДС.Параметры.ВсегоНДС = ""+ Формат(ВыборкаИтоги.СуммаНДС, "ЧЦ=15; ЧДЦ=2");
КонецЕсли;
Таб.Вывести(ОбластьИтогоНДС);
ОбластьСуммаПрописью = Макет.ПолучитьОбласть("СуммаПрописью");
ОбластьСуммаПрописью.Параметры.ИтоговаяСтрока = "Всего оказано услуг "+ВыборкаИтоги.Количество+" на сумму "+
Формат(ВыборкаШапкаДокумента.СуммаДокумента, "ЧЦ=15; ЧДЦ=2")+" руб.";
ОбластьСуммаПрописью.Параметры.СуммаПрописью = ""+ПолучитьДеньгиПрописью(ВыборкаШапкаДокумента.СуммаДокумента);
Таб.Вывести(ОбластьСуммаПрописью);
ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");
ОбластьПодписи.Параметры.ДолжностьИНазваниеОрганизации = ""+ВыборкаШапкаДокумента.Исполнитель;
Таб.Вывести(ОбластьПодписи);
Возврат Таб;
КонецФункции
Функция ПолучитьДеньгиПрописью(парСумма)
ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета="рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
Возврат ЧислоПрописью(парСумма, ФормСтрока, ПарПредмета);
КонецФункции
Исходный документ ПТУ для тестирования, где все строки табличной части услуги без НДС:
Внешний вид печатной формы акта и документ для тестирования следующие (без НДС):
Буду рад замечаниям и предложениям тех, кто тоже занялся оптимизацией запросов и кода.
P.S. Подобные задачи стали возникать в связи с трудоустройством в г. Москва, где приходится обрабатывать большие объемы данных, и требуется оптимизация.