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

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

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

Шаг 1. Регистрация внешней обработки в системе

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


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    
    // Указываем документы, в которых появится кнопка печати
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.ЗаказКлиента");
    ПараметрыРегистрации.Назначение = МассивНазначений;
    
    ПараметрыРегистрации.Наименование = "Моя внешняя печатная форма";
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    // Настройка команд
    ТаблицаКоманд = ПараметрыРегистрации.Команды;
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = "Печать тестовой формы";
    НоваяКоманда.Идентификатор = "ТестоваяПечать";
    
    // ВАЖНЫЙ МОМЕНТ: Использование
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL"; // Позволяет системе автоматически открыть окно предпросмотра
    
    Возврат ПараметрыРегистрации;
КонецФункции

Разберем критическую ошибку: в сообщении автора темы изначально было указано Использование = "ОткрытиеФормы". Для внешних печатных форм БСП ожидает именно ВызовСерверногоМетода. Если оставить «ОткрытиеФормы», система просто попытается открыть основную форму обработки, которая у вас, скорее всего, пустая, и не вызовет процедуру Печать.

Шаг 2. Реализация процедуры печати и получение макета

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

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


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

Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояФорма";
    
    // Получаем макет из состава внешней обработки
    Макет = ПолучитьМакет("МакетОбработки");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    // Здесь мы можем обойти массив объектов и заполнить параметры
    Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
        // Пример заполнения: ОбластьШапка.Параметры.Номер = СсылкаНаОбъект.Номер;
        ТабДокумент.Вывести(ОбластьШапка);
        
        // Если печатаем несколько документов, добавляем разрыв страницы
        Если МассивОбъектов.Количество() > 1 Тогда
            ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
    КонецЦикла;
    
    Возврат ТабДокумент;
КонецФункции

Шаг 3. Подключение формы к нетиповым (самописным) документам

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

Проанализируем ситуацию: если документ создан вами с нуля, он должен «сообщить» подсистеме печати о своем существовании. Существует два способа сделать это:

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

Шаг 4. Работа с внешними макетами (загрузка с диска)

Иногда возникает вопрос: можно ли хранить макет не внутри обработки, а отдельным файлом на жестком диске (HD)? Рассмотрим, как это реализовать. Это полезно, когда дизайн печатной формы часто меняется, и вы не хотите каждый раз перезагружать обработку в базу.

Для этого мы используем объект ТабличныйДокумент и его метод Прочитать. Посмотрим на пример кода:


ПутьКМакету = "C:\1C_Templates\MyLayout.mxl";
ФайлМакета = Новый Файл(ПутьКМакету);

Если ФайлМакета.Существует() Тогда
    ВнешнийМакет = Новый ТабличныйДокумент;
    ВнешнийМакет.Прочитать(ПутьКМакету);
    
    // Теперь мы можем работать с ВнешнийМакет как с обычным макетом
    Область = ВнешнийМакет.ПолучитьОбласть("Заголовок");
    // ... дальнейшая логика заполнения
Иначе
    Сообщить("Файл макета не найден по пути: " + ПутьКМакету);
КонецЕсли;

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

Полезные советы по отладке

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

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

← На главную