Разработка внешних печатных форм (ВПФ) — одна из самых частых задач для программиста 1С. Использование механизма Библиотеки стандартных подсистем (БСП) позволяет добавлять новые печатные формы в конфигурацию, не изменяя её структуру. Однако при первой попытке реализации разработчики часто сталкиваются с тем, что команда печати появляется в интерфейсе, но при нажатии на неё открывается пустая форма или не происходит никаких действий. В этой статье мы подробно разберем, как избежать типичных ошибок и правильно настроить механизм печати.
Первым делом проанализируем функцию СведенияОВнешнейОбработке. Это точка входа, через которую система 1С понимает, что перед ней не просто обработка, а именно печатная форма, и к каким документам она должна быть «привязана». Рассмотрим правильный пример кода для регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
// Указываем документы, в которых появится кнопка печати
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Назначение = МассивНазначений;
ПараметрыРегистрации.Наименование = "Моя внешняя печатная форма";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Настройка команд
ТаблицаКоманд = ПараметрыРегистрации.Команды;
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Печать тестовой формы";
НоваяКоманда.Идентификатор = "ТестоваяПечать";
// ВАЖНЫЙ МОМЕНТ: Использование
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL"; // Позволяет системе автоматически открыть окно предпросмотра
Возврат ПараметрыРегистрации;
КонецФункции
Разберем критическую ошибку: в сообщении автора темы изначально было указано Использование = "ОткрытиеФормы". Для внешних печатных форм БСП ожидает именно ВызовСерверногоМетода. Если оставить «ОткрытиеФормы», система просто попытается открыть основную форму обработки, которая у вас, скорее всего, пустая, и не вызовет процедуру Печать.
Теперь перейдем к исполняемой части. Система вызывает экспортную процедуру Печать, расположенную в модуле объекта обработки. Здесь мы должны сформировать табличный документ и передать его обратно в коллекцию форм.
Рассмотрим, как правильно получить макет и вывести его. Обратите внимание на разницу между УправлениеПечатью.МакетПечатнойФормы и обычным ПолучитьМакет. При работе во внешней обработке надежнее использовать ЭтотОбъект.ПолучитьМакет, так как макет встроен непосредственно в обработку.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем, что наша команда есть в коллекции
ПараметрыПечати = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ТестоваяПечать");
Если ПараметрыПечати <> Неопределено Тогда
// Формируем табличный документ
ТабДок = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
// Передаем результат в коллекцию для отображения пользователю
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"ТестоваяПечать",
"Печать тестовой формы",
ТабДок);
КонецЕсли;
КонецПроцедуры
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояФорма";
// Получаем макет из состава внешней обработки
Макет = ПолучитьМакет("МакетОбработки");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Здесь мы можем обойти массив объектов и заполнить параметры
Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
// Пример заполнения: ОбластьШапка.Параметры.Номер = СсылкаНаОбъект.Номер;
ТабДокумент.Вывести(ОбластьШапка);
// Если печатаем несколько документов, добавляем разрыв страницы
Если МассивОбъектов.Количество() > 1 Тогда
ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЦикла;
Возврат ТабДокумент;
КонецФункции
Выясним причину, по которой внешняя печатная форма может не появляться в меню «Печать» нестандартного документа, даже если он указан в Назначении. В конфигурациях на базе БСП существует механизм регистрации объектов, поддерживающих команды печати.
Проанализируем ситуацию: если документ создан вами с нуля, он должен «сообщить» подсистеме печати о своем существовании. Существует два способа сделать это:
ДобавитьКомандыПечати(КомандыПечати). Даже если она будет пустой внутри, само её наличие позволит БСП «увидеть» этот документ и прикрепить к нему внешние формы.УправлениеПечатьюПредопределяемый, в функцию ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов). Там достаточно добавить строку: СписокОбъектов.Добавить(Документы.МойНетиповойДокумент);. Это принудительно включает ваш документ в список тех, где доступно меню печати.Иногда возникает вопрос: можно ли хранить макет не внутри обработки, а отдельным файлом на жестком диске (HD)? Рассмотрим, как это реализовать. Это полезно, когда дизайн печатной формы часто меняется, и вы не хотите каждый раз перезагружать обработку в базу.
Для этого мы используем объект ТабличныйДокумент и его метод Прочитать. Посмотрим на пример кода:
ПутьКМакету = "C:\1C_Templates\MyLayout.mxl";
ФайлМакета = Новый Файл(ПутьКМакету);
Если ФайлМакета.Существует() Тогда
ВнешнийМакет = Новый ТабличныйДокумент;
ВнешнийМакет.Прочитать(ПутьКМакету);
// Теперь мы можем работать с ВнешнийМакет как с обычным макетом
Область = ВнешнийМакет.ПолучитьОбласть("Заголовок");
// ... дальнейшая логика заполнения
Иначе
Сообщить("Файл макета не найден по пути: " + ПутьКМакету);
КонецЕсли;
Важно: При работе в клиент-серверном варианте помните, что путь к файлу должен быть доступен серверу 1С (пользователю, под которым запущен кластер). Также, если вы используете Безопасный режим, доступ к файловой системе будет заблокирован, пока вы не пропишете соответствующие разрешения в параметрах регистрации.
Рассмотрим способы отладки кода внешней печатной формы, так как обычные точки останова в ней могут не срабатывать:
Печать, передавая в неё массив с одной ссылкой на реальный документ. Это позволит вам запустить обработку через «Файл - Открыть» и спокойно пройтись отладчиком по коду.ВнешниеОбработки.Создать: В коде типовой конфигурации можно временно прописать создание обработки напрямую из файла на диске, чтобы не перезагружать её в справочник после каждого изменения.ЗаписьЖурналаРегистрации для вывода значений переменных на разных этапах формирования таблицы.Проанализировав все шаги, мы видим, что создание ВПФ — это строгая последовательность действий. Главное — правильно настроить тип команды (ВызовСерверногоМетода), корректно обращаться к макету внутри объекта и не забывать про регистрацию нетиповых документов в общей экосистеме БСП.