Предлагаю начальную версию оптимального запроса и кода (из источника взят только макет). Начнем с того, что стандартные алгоритмы типовых конфигураций не оптимальны. Единственное, что пока не переписаны функции из модуля общего назначения для номера докмента и прочая мелочь в коде. Так, думаю, что для больших документов и тем более пачкой отправляемых на печать (в процессе разработки) многократные обращения к базе нежелательны:
Функция Печать() Экспорт // упрощенно Таб = Новый ТабличныйДокумент; Таб.ОриентацияСтраницы = ОриентацияСтраницы.Портрет; Таб.АвтоМасштаб = Ложь; Таб.МасштабПечати = 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. Подобные задачи стали возникать в связи с трудоустройством в г. Москва, где приходится обрабатывать большие объемы данных, и требуется оптимизация.