новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
Яндекс-директ

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

  • Добавить свою разработку
 
Константин
Связаться с автором
10.04.2017 00:49:06
-2
ВПФ "Акт выполненных работ" за поставщика для документа Поступление товаров и услуг для Бухгалтерия предприятия 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. Подобные задачи стали возникать в связи с трудоустройством в г. Москва, где приходится обрабатывать большие объемы данных, и требуется оптимизация.

Ключевые слова:   ВПФ   Акт выполненных работ   акт выполненных услуг   Бухгалтерия 2.0   БП 2.0   печать   печатная форма   акт за поставщика   акт   печатная форма   пакетная печать   оптимизация пакетной печати   внешняя печатная форма   внешняя печатная форма акт выполненных работ   ВПФ акт
Файлы для скачивания
  • 99р
    • АктЗаПоставщика.epf (13Kb)
    • ВПФ "Акт выполненных работ" за поставщика для документа Поступление товаров и услуг для Бухгалтерия предприятия 2.0 (2.0.65.30) с оптимизацией для пакетной печати
    • ВПФ "Акт выполненных работ" за поставщика для документа Поступление товаров и услуг для Бухгалтерия предприятия 2.0 (2.0.65.30) с оптимизацией для пакетной печати
    • дата загрузки: 10.04.2017 00:57:20
0
    ≡ к списку разработок
    Яндекс-директ