Как сделать внешнюю печатную форму в БП 2.0 и вывести ее вызов на отдельную кнопку?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Переход с управляемых форм конфигурации «1С:Бухгалтерия предприятия 3.0» на обычные формы «1С:Бухгалтерия предприятия 2.0» (работающей на платформе 1С:Предприятие 8.2 или в режиме совместимости на 8.3) часто вызывает вопросы у разработчиков. Механизмы интеграции внешних печатных форм (ВПФ) в этих версиях существенно различаются. В этой статье мы подробно разберем, как создать внешнюю печатную форму для БП 2.0, зарегистрировать ее в системе и реализовать ее вызов по отдельной кнопке прямо на форме документа.

1. Архитектурные отличия БП 2.0 от современных конфигураций

В конфигурации «Бухгалтерия предприятия 2.0» не используется Библиотека стандартных подсистем (БСП) в том виде, в каком она представлена в БП 3.0. Здесь вы не найдете привычной экспортной функции СведенияОВнешнейОбработке(). Вместо этого вся работа с внешними печатными формами строится на использовании справочника ВнешниеОбработки и функций общего модуля УниверсальныеМеханизмы.

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

2. Структура файла внешней печатной формы (.epf) для БП 2.0

Давайте создадим внешнюю обработку с нуля и подготовим ее структуру. Для этого нам потребуется выполнить три обязательных шага:

  1. Создание реквизита для связи с объектом. В корне нашей внешней обработки необходимо добавить новый реквизит с именем СсылкаНаОбъект. Тип этого реквизита должен строго соответствовать ссылочному типу документа, для которого разрабатывается форма (например, ДокументСсылка.РеализацияТоваровУслуг). Если форма должна быть универсальной и подходить для разных документов, можно настроить составной тип данных.
  2. Разработка экспортной функции печати. В модуле объекта обработки обязательно должна присутствовать экспортная функция Печать(). Именно ее вызывает типовой механизм при нажатии пользователем кнопки печати. Функция должна возвращать сформированный табличный документ.
  3. Создание макета авторегистрации (необязательно, но крайне рекомендуется). Чтобы при загрузке обработки в базу данных система автоматически поняла, к какому документу привязать форму, создадим макет типа «Табличный документ» с именем Параметры_Авторегистрации.

Рассмотрим пример программного кода в модуле объекта нашей внешней печатной формы:


Функция Печать() Экспорт

    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояПечатнаяФорма";

    // Получаем макет, сохраненный в нашей внешней обработке
    Макет = ПолучитьМакет("МакетПечати");
    
    // Получаем области макета
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

    // Заполняем параметры шапки на основе реквизита СсылкаНаОбъект
    ОбластьШапка.Параметры.НомерДокумента = СсылкаНаОбъект.Номер;
    ОбластьШапка.Параметры.ДатаДокумента = Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy");
    ОбластьШапка.Параметры.Организация = СсылкаНаОбъект.Организация;
    ОбластьШапка.Параметры.Контрагент = СсылкаНаОбъект.Контрагент;
    
    ТабДокумент.Вывести(ОбластьШапка);

    // Пример обхода табличной части документа
    Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
        ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, СтрокаТЧ);
        ТабДокумент.Вывести(ОбластьСтрока);
    КонецЦикла;

    // Заполняем подвал
    ОбластьПодвал.Параметры.Всего = СсылкаНаОбъект.Товары.Итог("Сумма");
    ТабДокумент.Вывести(ОбластьПодвал);

    Возврат ТабДокумент;

КонецФункции

В макете авторегистрации Параметры_Авторегистрации создайте простую таблицу из двух колонок: «Полное имя объекта» (например, Документ.РеализацияТоваровУслуг) и «Имя табличной части» (оставьте пустым для обычной печатной формы).

3. Программный вызов ВПФ по отдельной кнопке на форме документа

Если перед вами стоит задача сделать вызов печатной формы максимально удобным и быстрым для пользователя, стандартное меню «Печать» может не подойти. Гораздо удобнее разместить отдельную кнопку непосредственно на форме документа. Обратите внимание, что такое решение требует изменения формы документа (если она типовая, ее придется снять с поддержки или разрешить редактирование).

Рассмотрим пошагово алгоритм, который должен выполняться при нажатии на нашу новую кнопку:

  1. Программа выполняет поиск нужного элемента в справочнике ВнешниеОбработки по его наименованию или коду.
  2. Из найденного элемента извлекаются двоичные данные файла обработки, сохраненные в хранилище значений.
  3. Двоичные данные сохраняются во временный файл на диске локального компьютера.
  4. Программа инициализирует объект внешней обработки из этого временного файла.
  5. В обязательный реквизит СсылкаНаОбъект передается ссылка на текущий документ.
  6. Вызывается экспортная функция Печать(), которая возвращает табличный документ.
  7. Табличный документ выводится на экран стандартным механизмом платформы.
  8. Временный файл корректно удаляется с диска во избежание засорения системы.

Проанализируем пример программного кода обработчика нажатия кнопки на форме документа:


Процедура ДействияФормыКнопкаМояПечать(Кнопка)
    
    // Проверим, записан ли документ. Печать незаписанного документа невозможна.
    Если ЭтотОбъект.Ссылка.Пустая() Тогда
        Предупреждение("Перед печатью документ необходимо записать!");
        Возврат;
    КонецЕсли;
    
    // 1. Поиск обработки в справочнике по точному наименованию
    ИмяПечатнойФормы = "Моя Внешняя Печатная Форма";
    СсылкаНаВПФ = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяПечатнойФормы);
    
    Если СсылкаНаВПФ.Пустая() Тогда
        ВызватьИсключение "В справочнике 'Внешние обработки' не найдена печатная форма '" + ИмяПечатнойФормы + "'!";
    КонецЕсли;
    
    Попытка
        // 2. Получение двоичных данных из хранилища значения
        ДвоичныеДанныеОбработки = СсылкаНаВПФ.ХранилищеВнешнейОбработки.Получить();
        
        // Формирование пути к временному файлу
        ИмяФайла = КаталогВременныхФайлов() + СсылкаНаВПФ.УникальныйИдентификатор() + ".epf";
        
        // Запись файла на диск
        ДвоичныеДанныеОбработки.Записать(ИмяФайла);
        
        // 3. Создание объекта внешней обработки
        ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
        
        // 4. Инициализация реквизита ссылки на документ
        ОбработкаОбъект.СсылкаНаОбъект = ЭтотОбъект.Ссылка;
        
        // 5. Вызов функции печати и получение табличного документа
        ТабДокумент = ОбработкаОбъект.Печать();
        
        // 6. Вывод печатной формы на экран с помощью встроенного механизма БП 2.0
        УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 1, Ложь, "Печать: " + ЭтотОбъект.Метаданные().Синоним);
        
        // 7. Обязательное удаление временного файла
        УдалитьФайлы(ИмяФайла);
        
    Исключение
        Сообщить("Произошла ошибка при выполнении внешней печати: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;
    
КонецПроцедуры

4. Лайфхак для быстрой отладки ВПФ в обычном приложении

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

Реализуем механизм самоотладки внутри самой обработки:

  1. Создайте у внешней обработки обычную форму и назначьте ее основной формой обработки.
  2. Разместите на форме поле ввода и свяжите его с реквизитом СсылкаНаОбъект. Настройте тип поля ввода в соответствии с типом вашего документа.
  3. Добавьте на форму кнопку «Выполнить печать» и пропишите следующий обработчик нажатия:

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

Теперь вам достаточно открыть вашу обработку через стандартное меню Файл - Открыть в режиме Предприятия, выбрать тестовый документ и нажать кнопку. Код будет выполняться напрямую, а в конфигураторе вы сможете полноценно использовать точки останова для пошаговой отладки алгоритма заполнения параметров макета.

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

← На главную