Акт выполненных работ за поставщика для документа Поступление товаров и услуг для Бухгалтерия предприятия 2.0 (2.0.65.30) с оптимизацией для пакетной печати




По служебной необходимости пришлось делать с нуля ВПФ Акт за поставщика для БП 2.0.65 с условием оптимизации — а именно пакетный запрос, никаких обращений к базе через точку и прочим. Прилагаю первоначальную версию кода. Буду рад любым замечаниям и предложениям по оптимизации запроса и прочей критике.

Предлагаю начальную версию оптимального запроса и кода (из источника взят только макет). Начнем с того, что стандартные алгоритмы типовых конфигураций не оптимальны. Единственное, что пока не переписаны функции из модуля общего назначения для номера докмента и прочая мелочь в коде. Так, думаю, что для больших документов и тем более пачкой отправляемых на печать (в процессе разработки) многократные обращения к базе нежелательны:

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

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *