gifts2017

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

Опубликовал Константин Юрин (kostyaomsk) в раздел Печать - Пакетная печать

По служебной необходимости пришлось делать с нуля ВПФ Акт за поставщика для БП 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. Подобные задачи стали возникать в связи с трудоустройством в г. Москва, где приходится обрабатывать большие объемы данных, и требуется оптимизация.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Акт за поставщика для ПТУ
.epf 13,04Kb
31.05.16
8
.epf 1.0.0.0 13,04Kb 8 Скачать

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа