При необходимости изменить печатную форму документа (например, документа «Реализация товаров и услуг») разработчики и администраторы 1С часто сталкиваются с вопросом: обязательно ли создавать внешнюю печатную форму (ВПФ), можно ли просто скопировать экспортные процедуры из модуля менеджера документа или достаточно отредактировать макет в режиме «1С:Предприятие»?
Разберем детально, как устроена печать в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), почему простое копирование процедур из модуля менеджера во внешнюю обработку приводит к ошибкам, и какие варианты решения задачи существуют.
Проанализируем сначала самый простой сценарий. Если в печатной форме необходимо изменить только статический текст (например, фиксированную надпись, добавить логотип компании или поменять шрифт), создавать отдельную внешнюю обработку или расширение не нужно.
В конфигурациях 1С предусмотрен встроенный механизм пользовательских макетов печати:
Важное ограничение: если текст в ячейке формируется программно (в макете указан параметр, например, Заголовок, значение которого вычисляется в коде и перезаписывает содержимое ячейки при выводе области), изменение статического текста в пользовательском макете не даст результата. В таком случае требуется изменение программной логики.
Частая ошибка начинающих разработчиков — попытка создать внешнюю обработку, скопировать туда макет и весь код процедуры формирования из модуля менеджера документа. Выясним причину, по которой этот подход вызывает ошибки выполнения:
УправлениеПечатью.МакетПечатнойФормы("Документ.РеализацияТоваровУслуг.ПФ_MXL_..."). В контексте внешней обработки макет должен извлекаться локально с помощью метода ЭтотОбъект.ПолучитьМакет("ИмяМакета").Обработка.ПечатьОбщихФорм) или общие модули.СведенияОВнешнейОбработке() и процедуру печати со строго определенной сигнатурой параметров.Рассмотрим наиболее надежный и современный способ модификации печатных форм без снятия конфигурации с поддержки. Расширение позволяет сохранить доступ ко всем общим модулям, процедурам менеджера документа и избежать дублирования больших блоков типового кода.
Разберем по шагам порядок действий при разработке расширения:
Документ.РеализацияТоваровУслуг) и его макет печати.&Вместо или &ИзменениеИКонтроль.ПараметрыПечати.Заголовок) и выводим обновленный табличный документ.Если по условиям задачи требуется именно внешняя обработка (ВПФ), подключенная через справочник дополнительных отчетов и обработок, можно применить технику перехвата и постобработки готового табличного документа без копирования громоздких запросов.
Посмотрим на пример структуры модуля объекта внешней печатной формы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Накладная (с измененным заголовком)'");
Команда.Идентификатор = "НакладнаяСвойЗаголовок";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСервера();
Команда.Модификатор = "ПечатьДокументов";
Возврат ПараметрыРегистрации;
КонецФункции
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
// Получаем печатную форму штатными механизмами конфигурации
ПечатнаяФорма = УправлениеПечатью.СформироватьПечатнуюФорму(
"Документ.РеализацияТоваровУслуг",
"Накладная",
МассивОбъектов,
ПараметрыПечати
);
// Выполняем постобработку: находим типовой текст заголовка и заменяем его
НайденнаяОбласть = ПечатнаяФорма.НайтиТекст("Расходная накладная");
Если НайденнаяОбласть <> Неопределено Тогда
НайденнаяОбласть.Текст = "Накладная на передачу товара (специальная)";
КонецЕсли;
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"НакладнаяСвойЗаголовок",
"Накладная (с измененным заголовком)",
ПечатнаяФорма
);
КонецПроцедуры
Подобный подход избавляет от необходимости переносить из конфигурации десятки связанных функций и запросов формирования табличной части и реквизитов накладной.
Если заголовок требует сложного алгоритма расчета на основе данных документа, а макет должен быть полностью переработан, проанализируем третий путь: вызов экспортных функций подготовки данных из модуля менеджера с выводом в собственный макет ВПФ.
В этом случае внешняя обработка вызывает типовую функцию сбора данных документа (например, Документы.РеализацияТоваровУслуг.ДанныеДляПечатиНакладной(...)), получает подготовленную структуру или таблицу значений, после чего процедура печати обращается к локальному макету внешней обработки через ЭтотОбъект.ПолучитьМакет("ПФ_MXL_Накладная") и заполняет его полученными данными с необходимыми модификациями.
Помните: при подключении ВПФ платформа по умолчанию использует безопасный режим, что ограничивает выполнение некоторых привилегированных операций. Если обработке требуются полные права, соответствующий флаг необходимо настроить при регистрации обработки в режиме предприятия.