Как правильно создать и встроить внешнюю печатную форму в 1С:Предприятие 8.3

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

При разработке в среде 1С:Предприятие 8.3 на базе современных типовых конфигураций (таких как Управление торговлей 11, ERP 2.5 или Бухгалтерия предприятия 3.0) часто возникает задача создания собственной печатной формы. У разработчика есть два пути: внести изменения непосредственно в конфигурацию или создать внешнюю обработку. В данной статье мы подробно рассмотрим, как реализовать оба подхода, разберем структуру кода и выясним, почему «внешний» способ зачастую является более предпочтительным.

Понимание механизма БСП

Прежде чем мы перейдем к написанию кода, давайте разберем, как система «узнает» о существовании новой печатной формы. В современных конфигурациях используется Библиотека стандартных подсистем (БСП). Она реализует механизм динамического формирования меню «Печать». Это означает, что нам не нужно вручную рисовать кнопки на формах документов. Достаточно зарегистрировать нашу обработку в справочнике «Дополнительные отчеты и обработки» или прописать команду в модуле менеджера объекта, и система сама выведет кнопку в нужном месте.

Вариант 1. Создание внешней печатной формы (без изменения конфигурации)

Это наиболее гибкий метод. Рассмотрим пошагово процесс создания такой обработки. Основная логика должна быть сосредоточена в Модуле объекта обработки.

Для того чтобы система приняла внешнюю обработку как печатную форму, в модуле объекта обязательно должна присутствовать экспортная функция СведенияОВнешнейОбработке. Проанализируем пример ее реализации:


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

    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); 
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Счет-договор (Внешний)");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма счет-договор");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Добавление команды печати
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = "Счет-договор";
    НоваяКоманда.Идентификатор = "СчетДоговор"; // Уникальный ID команды
    НоваяКоманда.Использование = "ВызовСерверногоМетода"; // Способ вызова
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL"; // Важно для вывода в стандартное окно

    ПараметрыРегистрации.Вставить("Команд", ТаблицаКоманд);
    
    Возврат ПараметрыРегистрации;
КонецФункции

Разберем ключевые параметры. Поле Вид со значением ПечатнаяФорма сообщает системе, что обработку нужно искать в меню печати. Поле Модификатор со значением ПечатьMXL — это критически важный момент. Он указывает системе, что результатом выполнения команды будет табличный документ, который нужно открыть в стандартном окне предварительного просмотра БСП со всеми сопутствующими функциями (отправка по почте, сохранение в PDF).

Реализация процедуры Печать

После регистрации нам необходимо описать саму логику формирования документа. Для этого в том же модуле объекта создается экспортная процедура Печать. Рассмотрим ее структуру:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Проверяем, есть ли наша команда в коллекции запрошенных форм
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетДоговор");
    
    Если ПечатнаяФорма <> Неопределено Тогда
        // Формируем табличный документ
        ПечатнаяФорма.ТабличныйДокумент = СформироватьСчетДоговор(МассивОбъектов, ОбъектыПечати);
        ПечатнаяФорма.ПолныйПутьКМакету = ""; // Для внешних форм заполнять не обязательно
    КонецЕсли;
    
КонецПроцедуры

В этой процедуре параметр МассивОбъектов содержит ссылки на документы, которые пользователь выбрал для печати. Функция СформироватьСчетДоговор (которую вы пишете самостоятельно) должна возвращать объект типа ТабличныйДокумент. Именно в ней происходит запрос к базе данных, получение реквизитов и заполнение областей макета.

Вариант 2. «Встраивание» формы внутрь конфигурации

Если вы решили, что печатная форма должна стать частью конфигурации (например, для упрощения поддержки или если она является основной для бизнеса), алгоритм действий меняется. Выясним, как это сделать правильно, следуя стандартам разработки 1С.

  1. Перенос макета: Откройте вашу внешнюю обработку, скопируйте макет и вставьте его в раздел «Макеты» соответствующего документа (например, ЗаказКлиента).
  2. Модуль менеджера: Вся логика печати встроенных форм в БСП располагается в модуле менеджера объекта. Найдите в нем процедуру ДобавитьКомандыПечати.
  3. Регистрация команды: Добавьте в эту процедуру код регистрации вашей команды:

Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "СчетДоговорВнутренний";
    КомандаПечати.Представление = НСтр("ru = 'Счет-договор (внутренний)'");
    КомандаПечати.Порядок = 10;
    КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка";
КонецПроцедуры

Затем в процедуре Печать модуля менеджера добавьте условие Если ИдентификаторКоманды = "СчетДоговорВнутренний" Тогда... и вызовите функцию формирования табличного документа.

Отладка внешних печатных форм

Многие начинающие программисты сталкиваются с тем, что внешнюю форму сложно отлаживать: точки останова в модуле объекта не срабатывают, когда форма запущена через «Дополнительные обработки». Рассмотрим эффективный метод решения этой проблемы.

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


&НаКлиенте
Процедура ОтладитьПечать(Команда)
    МассивСсылок = Новый Массив;
    МассивСсылок.Добавить(Объект.СсылкаНаОбъект);
    
    // Вызываем серверный метод отладки
    ВыполнитьПечатьНаСервере(МассивСсылок);
КонецПроцедуры

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

Этот прием позволяет открывать обработку через меню Файл -> Открыть, выбирать тестовый документ и пользоваться всеми преимуществами отладчика 1С (клавиши F9, F10, F11), не тратя время на постоянную перезагрузку файла в справочник «Дополнительные обработки».

Ошибки и нюансы работы с Безопасным режимом

Проанализируем ситуацию: ваша форма должна сохранить PDF-копию счета на диск или обратиться к стороннему COM-объекту. Если в СведенияОВнешнейОбработке указано БезопасныйРежим = Истина, система заблокирует эти действия.

Важно: Если вам требуются привилегированные операции, устанавливайте БезопасныйРежим = Ложь. Однако помните, что при подключении такой обработки в базу администратор должен будет подтвердить доверие к этому файлу.

Заключение

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

← На главную