Динамическое изменение функции формирования табличного документа внешней обработки без конфигуратора.

01.09.15

Разработка - Механизмы платформы 1С

Продолжение направления статьи "УТ 11. Динамическое изменение MXL-макета внешней печатной формы" в режиме 1С.
http://infostart.ru/public/92500/
Там рассказывалось, как изменять макеты внешних печатных форм.
В этой статье я динамически изменяю процедуру формирования Табличного документа.

Цель направления исследования: одна-две внешние обработки, 5-10 алгоритмов заполнения табличного документа, 20-50-100 макетов MXL.
И все менять удобно и визуально(кроме добавления 2-х обработок)

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

Наименование Файл Версия Размер
ТоварныйЧекУТ11 - копия.epf
.epf 19,06Kb
27
.epf 19,06Kb 27 Скачать

В общем, добавляем справочник абАлгоритмы, добавляем реквизит Алгоритм, вид Строка неограниченной длины.

Наименование элемента справочника СформироватьПечатнуюФорму

В этот реквизит в режиме 1С предприятие добавляем следующий код

//Значение Реквизита начало

    //Инициализируем и устанавливаем параметры таблибличного документа для печати
    //ТабДокумент = Новый ТабличныйДокумент;
   
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Товарный_Чек";
   
ТабДокумент.АвтоМасштаб = Истина;
   
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;

   
Колонка = ФормированиеПечатныхФорм.ИмяДополнительнойКолонки();
   
ВыводитьКоды = ЗначениеЗаполнено(Колонка);

   
ПервыйДокумент = Истина;

   
//Делаем запрос к объектам, указанным в массиве МассивОбъектов
   
Запрос = Новый Запрос;
   
Запрос.УстановитьПараметр("МассивДокументов", МассивОбъектов);

   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   ДокЧек.Номер                     КАК Номер,
    |   ДокЧек.Дата                      КАК Дата,
    |   ДокЧек.Ссылка                    КАК Ссылка,
    |   ДокЧек.КассаККМ                  КАК КассаККМ,
    |   ДокЧек.Валюта                    КАК Валюта,
    |   ДокЧек.ЦенаВключаетНДС           КАК ЦенаВключаетНДС,
    |   ДокЧек.КассаККМ.Представление    КАК Покупатель,
    |   ДокЧек.НомерЧекаККМ              КАК НомерЧекаККМ,
    |   ДокЧек.Склад.Представление       КАК Магазин,
    |   ДокЧек.Организация               КАК Организация,
    |   ДокЧек.Организация.Префикс       КАК Префикс,
    |   ДокЧек.Организация.Представление КАК Поставщик,
    |   ДокЧек.СуммаДокумента            КАК СуммаДокумента,
    |   ДокЧек.Товары.(
    |       НомерСтроки                     КАК НомерСтроки,
    |       Номенклатура                    КАК Номенклатура,
    |       Номенклатура.Представление      КАК Товар,
    |       Номенклатура.НаименованиеПолное КАК ТоварПолноеНаименование,
    |       Номенклатура.Код                КАК Код,
    |       Номенклатура.Артикул            КАК Артикул,
    |       Характеристика                  КАК Характеристика,
    |       КоличествоУпаковок              КАК Количество,
    |       Номенклатура.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
    |       Цена КАК Цена,
    |       ДокЧек.Товары.КоличествоУпаковок * ДокЧек.Товары.Цена - ДокЧек.Товары.Сумма КАК Скидка,
    |       Сумма    КАК Сумма,
    |       СуммаНДС КАК СуммаНДС
    |   )
    |ИЗ
    |   Документ.ЧекККМ КАК ДокЧек
    |ГДЕ
    |   ДокЧек.Ссылка В (&МассивДокументов)
    |"
;

   
Выборка = Запрос.Выполнить().Выбрать();

   
//Обработка результата запроса и формирование табличного документа
   
Пока Выборка.Следующий() Цикл

       
// Макет необходимо получать для каждого документа в выборке, т.к. размеры колонок изменяются динамически
       
Макет = ПолучитьМакет("ПФ_MXL_ТоварныйЧек");

        Если Не
ПервыйДокумент Тогда
           
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;

       
ПервыйДокумент = Ложь;
       
НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;

       
// Выводим шапку накладной.
       
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
       
ОбластьМакета.Параметры.ТекстЗаголовка = ФормированиеПечатныхФорм.СформироватьЗаголовокДокумента(Выборка, "Товарный чек");
       
ОбластьМакета.Параметры.НомерЧекаККМ = Выборка.НомерЧекаККМ;
       
ТабДокумент.Вывести(ОбластьМакета);

       
ОбластьМакета = Макет.ПолучитьОбласть("Поставщик");
       
ПредставлениеПоставщика = ФормированиеПечатныхФорм.ОписаниеОрганизации(ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Выборка.Организация, Выборка.Дата), "ПолноеНаименование,ИНН,ЮридическийАдрес,Телефоны");
       
ОбластьМакета.Параметры.ПредставлениеПоставщика = ПредставлениеПоставщика;
       
ОбластьМакета.Параметры.Поставщик = Выборка.Организация;
       
ТабДокумент.Вывести(ОбластьМакета);

       
ОбластьМакета = Макет.ПолучитьОбласть("Магазин");
       
ОбластьМакета.Параметры.Магазин = Выборка.Магазин;
       
ТабДокумент.Вывести(ОбластьМакета);

       
ЕстьСкидки = Ложь;
       
ЕстьНДС = Ложь;
       
ВыборкаСтрокТовары = Выборка.Товары.Выбрать();
        Пока
ВыборкаСтрокТовары.Следующий() Цикл
            Если
ВыборкаСтрокТовары.Скидка <> 0 Тогда
               
ЕстьСкидки = Истина;
            КонецЕсли;
            Если
ВыборкаСтрокТовары.СуммаНДС <> 0 Тогда
               
ЕстьНДС = Истина;
            КонецЕсли;
        КонецЦикла;

       
ОбластьНомера   = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
       
ОбластьКодов    = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
       
ОбластьАртикулов= Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаАртикулов");
       
ОбластьДанных   = Макет.ПолучитьОбласть("ШапкаТаблицы|Данные");
       
ОбластьСкидок   = Макет.ПолучитьОбласть("ШапкаТаблицы|Скидка");
       
ОбластьСуммыНДС = Макет.ПолучитьОбласть("ШапкаТаблицы|СуммаНДС");
       
ОбластьСуммы    = Макет.ПолучитьОбласть("ШапкаТаблицы|Сумма");

       
ТабДокумент.Вывести(ОбластьНомера);
        Если
ВыводитьКоды Тогда
           
ОбластьКодов.Параметры.ИмяКолонкиКодов = Колонка;
           
ТабДокумент.Присоединить(ОбластьКодов);
        КонецЕсли;

       
ТабДокумент.Присоединить(ОбластьАртикулов);

       
ТабДокумент.Присоединить(ОбластьДанных);
        Если
ЕстьСкидки Тогда
           
ТабДокумент.Присоединить(ОбластьСкидок);
        КонецЕсли;
        Если
ЕстьНДС Тогда
           
ТабДокумент.Присоединить(ОбластьСуммыНДС);
        КонецЕсли;

       
ТабДокумент.Присоединить(ОбластьСуммы);

       
ОбластьКолонкаТовар = Макет.Область("Товар");
        Если Не
ВыводитьКоды Тогда
           
ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки
                                              + Макет.Область("КолонкаКодов").ШиринаКолонки;
        КонецЕсли;
        Если Не
ЕстьСкидки Тогда
           
ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки
                                              + Макет.Область("СуммаБезСкидки").ШиринаКолонки
                                              + Макет.Область("СуммаСкидки").ШиринаКолонки;
        КонецЕсли;

       
ОбластьНомера   = Макет.ПолучитьОбласть("Строка|НомерСтроки");
       
ОбластьКодов    = Макет.ПолучитьОбласть("Строка|КолонкаКодов");
       
ОбластьАртикулов= Макет.ПолучитьОбласть("Строка|КолонкаАртикулов");
       
ОбластьДанных   = Макет.ПолучитьОбласть("Строка|Данные");
       
ОбластьСкидок   = Макет.ПолучитьОбласть("Строка|Скидка");
       
ОбластьСуммыНДС = Макет.ПолучитьОбласть("Строка|СуммаНДС");
       
ОбластьСуммы    = Макет.ПолучитьОбласть("Строка|Сумма");

       
Сумма          = 0;
       
ВсегоСкидок    = 0;
       
ВсегоБезСкидок = 0;

       
ВыборкаСтрокТовары = Выборка.Товары.Выбрать();
        Пока
ВыборкаСтрокТовары.Следующий() Цикл
            Если Не
ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
               
Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
                Продолжить;
            КонецЕсли;

           
ОбластьНомера.Параметры.Заполнить(ВыборкаСтрокТовары);
           
ТабДокумент.Вывести(ОбластьНомера);

            Если
ВыводитьКоды Тогда
                Если
Колонка = "Артикул" Тогда
                   
ОбластьКодов.Параметры.Артикул = ВыборкаСтрокТовары.Артикул;
                Иначе
                   
ОбластьКодов.Параметры.Артикул = ВыборкаСтрокТовары.Код;
                КонецЕсли;
               
ТабДокумент.Присоединить(ОбластьКодов);
            КонецЕсли;

           
ОбластьАртикулов.Параметры.Артикул = ВыборкаСтрокТовары.Артикул;
           
ТабДокумент.Присоединить(ОбластьАртикулов);

           
ОбластьДанных.Параметры.Заполнить(ВыборкаСтрокТовары);
           
ОбластьДанных.Параметры.Товар = ?(Не ЗначениеЗаполнено(ВыборкаСтрокТовары.ТоварПолноеНаименование),
                                           
ВыборкаСтрокТовары.Товар, ВыборкаСтрокТовары.ТоварПолноеНаименование);

        
// + ФормированиеПечатныхФорм.ПредставлениеХарактеристик(ВыборкаСтрокТовары);

           
ТабДокумент.Присоединить(ОбластьДанных);

            Если
ЕстьСкидки Тогда
               
ОбластьСкидок.Параметры.Скидка         = ВыборкаСтрокТовары.Скидка;
               
ОбластьСкидок.Параметры.СуммаБезСкидки = ВыборкаСтрокТовары.Сумма + ВыборкаСтрокТовары.Скидка;
               
ТабДокумент.Присоединить(ОбластьСкидок);
            КонецЕсли;

            Если
ЕстьНДС Тогда
               
ОбластьСуммыНДС.Параметры.СуммаНДС = ВыборкаСтрокТовары.СуммаНДС;
               
ТабДокумент.Присоединить(ОбластьСуммыНДС);
            КонецЕсли;

            Если Не
Выборка.ЦенаВключаетНДС Тогда
               
СуммаСНДС = ВыборкаСтрокТовары.Сумма + ВыборкаСтрокТовары.СуммаНДС;
            Иначе
               
СуммаСНДС = ВыборкаСтрокТовары.Сумма;
            КонецЕсли;

           
ОбластьСуммы.Параметры.Сумма = СуммаСНДС;
           
ТабДокумент.Присоединить(ОбластьСуммы);

           
ВсегоСкидок    = ВсегоСкидок    + ВыборкаСтрокТовары.Скидка;
           
ВсегоБезСкидок = ВсегоБезСкидок + ВыборкаСтрокТовары.Сумма + ВыборкаСтрокТовары.Скидка;

        КонецЦикла;

       
Товары = Выборка.Товары.Выгрузить();

       
// Вывести Итого.
       
ОбластьНомера   = Макет.ПолучитьОбласть("Итого|НомерСтроки");
       
ОбластьКодов    = Макет.ПолучитьОбласть("Итого|КолонкаКодов");
       
ОбластьАртикулов= Макет.ПолучитьОбласть("Итого|КолонкаАртикулов");
       
ОбластьДанных   = Макет.ПолучитьОбласть("Итого|Данные");
       
ОбластьСкидок   = Макет.ПолучитьОбласть("Итого|Скидка");
       
ОбластьСуммы    = Макет.ПолучитьОбласть("Итого|Сумма");
       
ОбластьСуммыНДС = Макет.ПолучитьОбласть("Итого|СуммаНДС");

       
ТабДокумент.Вывести(ОбластьНомера);
        Если
ВыводитьКоды Тогда
           
ТабДокумент.Присоединить(ОбластьКодов);
        КонецЕсли;
       
ТабДокумент.Присоединить(ОбластьАртикулов);
       
ТабДокумент.Присоединить(ОбластьДанных);
        Если
ЕстьСкидки Тогда
           
ОбластьСкидок.Параметры.ВсегоСкидок    = ВсегоСкидок;
           
ОбластьСкидок.Параметры.ВсегоБезСкидок = ВсегоБезСкидок;
           
ТабДокумент.Присоединить(ОбластьСкидок);
        КонецЕсли;

       
СуммаНДС = Товары.Итог("СуммаНДС");
       
Сумма    = Товары.Итог("Сумма");

        Если
ЕстьНДС Тогда
           
ОбластьСуммыНДС.Параметры.СуммаНДС = СуммаНДС;
           
ТабДокумент.Присоединить(ОбластьСуммыНДС);
        КонецЕсли;

        Если Не
Выборка.ЦенаВключаетНДС Тогда
           
СуммаДокумента = Сумма + СуммаНДС;
        Иначе
           
СуммаДокумента = Сумма;
        КонецЕсли;

       
ОбластьСуммы.Параметры.Сумма = СуммаДокумента;
       
ТабДокумент.Присоединить(ОбластьСуммы);

       
// Вывести Сумму прописью.
       
ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописью");
       
ОбластьМакета.Параметры.ИтоговаяСтрока = "Всего наименований " + ВыборкаСтрокТовары.Количество()
                                               +
", на сумму " + ФормированиеПечатныхФорм.ФорматСумм(Выборка.СуммаДокумента);
       
ОбластьМакета.Параметры.СуммаПрописью  = "";
       
//ФормированиеПечатныхФорм.СформироватьСуммуПрописью(Выборка.СуммаДокумента, Выборка.Валюта);
       
ТабДокумент.Вывести(ОбластьМакета);

       
// Вывести подписи.
       
ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
       
ОбластьМакета.Параметры.Заполнить(Выборка);
       
ТабДокумент.Вывести(ОбластьМакета);

       
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, НомерСтрокиНачало, ОбъектыПечати, Выборка.Ссылка);

    КонецЦикла;

   
//Возврат ТабДокумент;
    //ПоместитьВоВременноеХранилище(ТабДокумент, "аааТабДокумент");

//Значение реквизита окончание

//*********************************************************************************************

Код функции СформироватьПечатнуюФормуТоварногоЧека

Функция СформироватьПечатнуюФормуТоварногоЧека(МассивОбъектов, ОбъектыПечати)

   
////Инициализируем и устанавливаем параметры таблибличного документа для печати
   
ТабДокумент = Новый ТабличныйДокумент;   

    //Так сделано для упрощения примера, у меня один объект в справочнике

    абОбъект=Справочники.абАлгоритмы.НайтиПоНаименованию("СформироватьПечатнуюФорму");
   
абТекст=абОбъект.Алгоритм;

    Выполнить(
абТекст);

    Возврат
ТабДокумент;
  
КонецФункции
// СформироватьПечатнуюФормуТоварногоЧека()

 

Профит, можем изменять функцию формирования табличного документа без конфигуратора.

Если еще использовать механизм динамического изменения макетов(необязательно как я его пытался реализовать, а допустим все сразу хранится в регистре сведений), то имеем достаточно неплохой механизм.


P.S. заготовку печатной формы для экспериментов взял тут //infostart.ru/public/73548/ .

 


Иполнитель: 2012 г. www.rt-finance.ru

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4512    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5289    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8819    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15984    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. anton.fly7 173 13.10.11 11:28 Сейчас в теме
еде полной для красоты выводить на форму текст процедуры разукрашеным ))))
2. Magister 134 13.10.11 11:38 Сейчас в теме
Ничего так, хорошенькая дырочка получается. Если, конечно, не дать прав на изменение кода только админу.
3. Поручик 4670 13.10.11 11:52 Сейчас в теме
(2) Я тоже сразу не мог понять, что же мне не нравится в этом методе.
4. gavrikprog 117 13.10.11 12:00 Сейчас в теме
Ну с правами то не проблемка решить, можно создать роль специально для этого
5. fomix 33 13.10.11 12:59 Сейчас в теме
6. gavrikprog 117 13.10.11 16:54 Сейчас в теме
Сделал все-таки решение - до ума доведу - опубликую.

Только хиленько народ голосует, видимо не надо.
7. fomix 33 18.10.11 10:25 Сейчас в теме
(6) Скорее всего этот способ не всем подходит - т.к. надо кромсать типовую конфу. Легче внешними печатными формами это реализовать!
8. aspirator23 339 21.10.11 07:29 Сейчас в теме
Аналогичную задачу решал через при внешние обработки.
Есть только основная обработка - она неизменна.
В ней только задаются входные параметры.
Их может быть сколь угодно и любого типа.
В этой обработке есть поле где указана ссылка на дополнительную внешнюю обработку.
А вот в них и лежит весь код. Обработки могут быть какие угодно.
В них весь код. В дополнительную внешнюю обработку передаются параметры.
Мне показалось так удобно. Ничего не трогаю, только при необходимости, под разные задачи указываю разные дополнительные внешние обработки.
Дополнительные обработки легко отлаживать.
Оставьте свое сообщение