Внешняя печатная форма с отладкой (шаблон) для управляемых форм




Шаблон обработки предназначен для разработки внешних печатных форм с удобным механизмом отладки.
Пример внешней печатной формы «Счет на оплату покупателю» для БП 3.0.64.28

Процесс отладки внешней печатной формы достаточно трудоёмкий, здесь на Инфостарте есть различные отладчики внешних печатных форм, но они тоже имеют некоторые недостатки, вот решил "наваять свою нетленку" на эту тему 🙂

Обработка представляет из себя внешнюю печатную форму, которая подключается типовым механизмом "Печатные формы, отчеты и обработки", но если в режиме Предприятия открыть обработку через Меню, Файл, Открыть, то откроется окно отладки этой печатной формы.

В открытой обработке указываем Объект печати и Имя печатной формы, нажимаем кнопку [Печать] и видим что получилось.

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

Если при формировании печатной формы выявились ошибки, то они выходят в сообщении. Для явного отображения ошибки нужно ещё раз нажать кнопку [Печать]

В режиме отладки все точки останова отрабатываются корректно, т.к. не используются другие обработки.

Описание обработки берётся из реквизитов обработки

Название печатной формы прописывается в СИНОНИМЕ МАКЕТА, т.е. одна обработка может содержать в себе несколько печатных форм.

 

Имя процедуры печати формируется из ИМЕНИ МАКЕТА в таком виде: "Печать_"+ИмяМакета

Места, где нужно вставлять свои программные модули, отмечены %изм%

 

Прикрепленная обработка  настроена на документ ПриемНаРаботу и работает в ЗУП 3.1 и БП 3.0, для других конфигураций протестировать "сходу" не получится 🙁

В общем и целом в обработке нет ничего революционного, но её использование очень облегчает отладку печатных форм.

В обработке используются наработки других авторов, но за давностью у кого что взял не вспомню, но всё равно огромное вам спасибо 😉

Обновление 19.07.2024.
Добавил внешнюю печатную форму счета с синей печатью.
Пришлось это сделать т.к. 1С опять учудила и теперь вывод синей печати настраивается флажком (раньше была отдельная печатная форма) и теперь чтобы отправить счет на e-mail приходится сначала выводить форму счета, потом ставить флажок и только потом отправлять 🙁  и флажок (редиска) запоминается и при печати ТОРГ-12 тоже выводит синюю печать… надеюсь они исправятся, а пока буду использовать ВПФ

24 Comments

  1. strange2007

    Просто спрошу: А чем не устраивает обычный отчёт с реквизитами-параметрами, который вызывает нужную проц-у из модуля объекта? Отладка стопроцентная и никаких трудоёмких действий.

    Просто для тех, кому нужна отладка, может расскажете плюсы Вашей разработки?

    Reply
  2. Mx00

    (2) не скажу про все внешние отладочные отчеты, видимо мне не повезло 🙂 но то, что использовал требовало каждый раз перевыбирать файл обработки иначе вешний отчет вызывал что-то из кэша и точка остановки не срабатывала. Ну и закрывать окно печатной формы приходится постоянно. Вот сейчас проверил обработку https://infostart.ru/public/138731/ — не сработала точка остановки — разбираться в чужом коде «не наш путь» — сделал своё и решил поделиться

    Reply
  3. webandroid

    (2) А чем не устраивает обычный отчёт с реквизитами-параметрами,

    А можно подробнее, что за отчет?

    Reply
  4. strange2007

    (4) Например, надо создать отлаживаемую печатную форму для документа. Делаю отчёт, где в модуле объекта формирую утверждённую ф-ию «печать», формата

    Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, ЭтоОтладка=Ложь) Экспорт

    В этой ф-ии формирую отчёт по правилам БСП.

    Далее создаю реквизиты «ПоОбъекту», который имеет тип любого документа и «ИмяМакета», который просто строка. Далее на форме в первый реквизит выбираю нужный документ, а во второй вписываю имя нужного макета. Ещё на форму кидаю таб.док-т, на который всё буду выводить. В модуле формы пишу что-то вроде

    &НаСервере
    Процедура ОтладкаСрв()
    Перем МассивОбъектов, ОбъектыПечати, ПечФормы, ЭлементКоллекции;
    Перем ПараметрыХЗ;
    Перем ВыводимыйТабДок;
    
    // Тут что-то будет само формироваться. Сам не знаю что
    ОбъектыПечати = Новый СписокЗначений;
    
    // Объект то нихрена не объект, а ссылка
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.ПоОбъекту);
    
    // Печатная форма должна быть в ТЗ. О как!
    ПечФормы = Новый ТаблицаЗначений;
    ПечФормы.Колонки.Добавить(«ИмяВРЕГ»);
    ПечФормы.Колонки.Добавить(«ИмяМакета»);
    ПечФормы.Колонки.Добавить(«ИмяФайлаПечатнойФормы»);
    ПечФормы.Колонки.Добавить(«Картинка»);
    ПечФормы.Колонки.Добавить(«ПолныйПутьКМакету»);
    ПечФормы.Колонки.Добавить(«СинонимМакета»);
    ПечФормы.Колонки.Добавить(«ТабличныйДокумент»);
    ПечФормы.Колонки.Добавить(«Экземпляров»);
    
    ЭлементКоллекции = ПечФормы.Добавить();
    ЭлементКоллекции.ИмяМакета = Объект.ИмяМакета;
    ЭлементКоллекции.ИмяВРЕГ = ВРег(ЭлементКоллекции.ИмяМакета);
    ЭлементКоллекции.Экземпляров = 1;
    
    // Вызов самой печати
    ВыводимыйТабДок = РеквизитФормыВЗначение(«Объект»).Печать(МассивОбъектов, ПечФормы, ОбъектыПечати, ПараметрыХЗ, Истина);
    
    // Показ полученного
    ТабДок.Очистить();
    ТабДок.Вывести(ВыводимыйТабДок);
    
    КонецПроцедуры

    Показать

    Готово. Образец для отладки любых печатных форм готов. Если в БСП что-то поменяют, то достаточно изменить утверждённую функцию и вызов к ней.

    Просто вот честно, не понимаю чего там сложного. На всё про всё минут 10-30 первый раз уходит, а потом вообще нисколько.

    По такому же алгоритму набросал и остальные шаблоны.

    Reply
  5. Mx00

    (5) Всё так, только не понятно это описание самой обработки внешней печатной формы или дополнительной обработки для отладки?

    Reply
  6. strange2007

    (6) Сама внешняя печатная форма. Настраиваете её, отлаживаете и потом «скармливаете» БСП.

    Я так понимаю забрал у кого-то хлеб? Да?

    Reply
  7. Mx00

    (7) Хлеб берут не тут 🙂

    Да моя обработка именно это и делает, плюс переоткрытие одной кнопкой, а не Меню,Файл,Открыть как у тебя 🙂

    запоминание последнего объекта и удобный механизм нескольких макетов… ничего сложного, но всё для удобства

    я так и написал в описании «В общем и целом в обработке нет ничего революционного, но её использование очень облегчает отладку печатных форм»

    Наверно все продвинутые себе такое уже сделали, один я мучился дополнительными обработками отладки 😉

    Reply
  8. strange2007

    (8) В таком случае, Максим, я спокоен, т.к. Ваша разработка предназначена как раз для тех, кто не сможет из моих выкладок выявить что-то полезное для себя.

    Reply
  9. Mx00

    (9) Я тоже успокоился — ни кому это не нужно 🙂

    думал ещё выложить внешнюю обработку заполнения документов с (само)отладкой, но это так же никому не будет интересно 🙂

    Reply
  10. Alex_E

    (3) Как-то забросилась та обработка за ненадобностью, уже давно использую https://infostart.ru/public/535969/

    Reply
  11. Mx00

    (11) Благодарю, полезная информация, возьму себе на вооружение, но моя обработка не про копирование типовых и их изменение, а про создание своих, где логика типовых не сильно помогает 🙂

    Reply
  12. Alex_E

    (12) Создав из типовой ПФ ВПФ с помощью констурктора имеем заготовку с отладкой, в которой меняем заполнение табличного документа на любой — получаем созданную свою форму с формой для отладки, но…., тут на, как говорится — на вкус и цвет ….

    Reply
  13. Mx00

    (13) Да, разобрался, тебе осталось только прикрутить кнопку [Переоткрыть], очень удобно при отладке не нужно закрывать и открывать ВПФ

    Reply
  14. unichkin

    Все гораздо проще) https://infostart.ru/public/573461/

    Reply
  15. Mx00

    (15) Вот я бы не сказал, что это проще — на время отладки нужно обработку изменить, а перед тем как загружать обратно изменить, это очень не удобно ИМХО.

    Reply
  16. unichkin

    (16) Нет, обработка дорабатывается один раз — вставляется вызов внешней, который можно сразу удалить. Перед тем как загружать обратно ничего менять не нужно. Разве что безопасный режим — но он на работоспособность не влияет.

    Reply
  17. Mx00

    (17) как вариант «замороченной» отладки очень хорошо, но это подходит когда печатная форма делается «в один проход», т.е. сделал и больше не дорабатываешь. У меня пример трудового договора и пока будут отработаны все варианты условий может пройти много времени и постоянно менять вызов обработки, да ещё с прописыванием пути в самой обработке — не вариант. Но для отладки какой-нибудь чужой обработки буду пользоваться 🙂

    Reply
  18. unichkin

    (18) А его не надо менять «постоянно») Как нужно дорабатывать — делаем вызов один раз, потом загружаем в ИБ как есть — вызов внешней будет закомментирован. При последующих доработках его надо раскомментировать, вот и все. Я пробовал, когда еще сам был начинающим внешние отладчики — сейчас могу с уверенностью сказать что «замороченная» отладка — это как раз про них.

    Единственное, где это может быть неудобно — если есть 100500 экспортных методов, т.к. отладка точечная. При таком варианте еще можно сказать что внешний отладчик удобнее — но вообще, странно если у одной внешней обработки настолько большой программный интерфейс.. Я с таким не сталкивался — обычно алгоритмы детализированы.

    Reply
  19. Aleksey81

    Превосходный шаблон!!! Спасибо!

    Reply
  20. Roman_Go
    КоллекцияПечатныхФорм=РеквизитФормыВЗначение(«Объект»).ПолучитьКоллекциюПечатныхФорм();
    Для Каждого ТекПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
    Если ТекПечатнаяФорма.СинонимМакета<>Объект.ИмяПечатнойФормы Тогда
    КоллекцияПечатныхФорм.Удалить(ТекПечатнаяФорма);
    КонецЕсли;
    КонецЦикла;

    вот это работает неправильно, нужно менять. Нельзя удалять строки в перебираемой таблице значений, кое что может и остаться.

    Вот так что ли:

    МассивКУдалению = Новый Массив;
    КоллекцияПечатныхФорм=РеквизитФормыВЗначение(«Объект»).ПолучитьКоллекциюПечатныхФорм();
    Для Каждого ТекПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
    Если ТекПечатнаяФорма.СинонимМакета<>Объект.ИмяПечатнойФормы Тогда
    МассивКУдалению.Добавить(ТекПечатнаяФорма);
    КонецЕсли;
    КонецЦикла;
    Для Каждого Элемент из МассивКУдалению цикл
    КоллекцияПечатныхФорм.Удалить(Элемент);
    КонецЦикла;
    

    Показать

    а в целом спасибо.

    Reply
  21. Roman_Go

    (13) а я вот ничего не понял, куда зайти что нажать, чтобы что-то удобное создать :)?

    я ручками писал. О каком конструкторе идет речь?

    Reply
  22. Alex_E
  23. Mx00

    (21) да, я согласен, что не правильно — в печатной форме счета уже сделано по другому, а в «шаблоне» забыл поправить, сейчас исправлюсь 🙂

    теперь там сделано так:

    в модуле объекта функция ПолучитьКоллекциюПечатныхФорм обзавелась параметром

    Функция ПолучитьКоллекциюПечатныхФорм(ФильтрПоСинониму=»*») Экспорт
    КоллекцияПечатныхФорм=Неопределено;
    Для Каждого ТекМакет Из ЭтотОбъект.Метаданные().Макеты Цикл
    Если ЗначениеЗаполнено(ТекМакет.Синоним) И Тип(ПолучитьМакет(ТекМакет.Имя))=Тип(«ТабличныйДокумент») Тогда
    Если ФильтрПоСинониму=»*» Тогда // Все печатные формы
    ИначеЕсли ТекМакет.Синоним=ФильтрПоСинониму Тогда // Фильтр совпадает с синонимом текущей печатной формы
    Иначе
    Продолжить; // пропускаем текущую печатную форму
    КонецЕсли;
    Если КоллекцияПечатныхФорм=Неопределено Тогда // Создадим ТЗ КоллекцияПечатныхФорм
    КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ТекМакет.Имя);
    СтрокаКоллекцияПечатныхФорм=КоллекцияПечатныхФорм[0]; // выберем первую строку
    Иначе
    СтрокаКоллекцияПечатныхФорм=КоллекцияПечатныхФорм.Добавить();
    КонецЕсли;
    СтрокаКоллекцияПечатныхФорм.ИмяМакета=ТекМакет.Имя;
    СтрокаКоллекцияПечатныхФорм.ИмяВРЕГ=ВРег(СтрокаКоллекцияПечатныхФорм.ИмяМакета);
    СтрокаКоллекцияПечатныхФорм.СинонимМакета=ТекМакет.Синоним;
    КонецЕсли;
    КонецЦикла;
    Возврат КоллекцияПечатныхФорм;
    КонецФункции
    

    Показать

    а в модуле обработки нет удаления

    КоллекцияПечатныхФорм=РеквизитФормыВЗначение(«Объект»).ПолучитьКоллекциюПечатныхФорм(Объект.ИмяПечатнойФормы);
    

    благодарю за баг-репорт

    Reply
  24. Mx00

    и тем кто дочитает то этого комментария 🙂

    отличие обработок «шаблон» и «счет»:

    в «шаблоне» все данные для печати предварительно собираются в структуре ПараметрыДляПечати

    а в «счете» данные для печати собираются в таблице значений (использовал типовой механизм ТаблицаСведений=ПечатьТорговыхДокументов.ПолучитьОписаниеСчетаНаОплату();

    Reply

Leave a Comment

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