При сопровождении и доработке конфигураций 1С часто возникает задача изменения печатных форм документов. Чтобы сохранить конфигурацию на поддержке и упростить процесс последующих обновлений, изменения рекомендуется вносить с помощью внешних печатных форм (ВПФ). В этой статье мы подробно разберем, как адаптировать типовую печатную форму под внешнюю обработку (формат .epf) на примере современных конфигураций, работающих на базе Библиотеки стандартных подсистем (БСП), таких как «Бухгалтерия строительной организации 3.1».
В современных конфигурациях 1С просто скопировать код формирования печатной формы во внешнюю обработку недостаточно. Вся работа с ВПФ жестко регламентирована механизмами БСП. В модуле объекта вашей внешней обработки обязательно должны присутствовать две экспортные процедуры:
СведенияОВнешнейОбработке() — функция, которая регистрирует обработку в справочнике «Дополнительные отчеты и обработки». Она передает системе информацию о том, к какому документу привязывается форма, как она называется в меню «Печать», безопасный ли режим используется и какие команды должны выполняться.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) — основная точка входа, вызываемая БСП при нажатии пользователем кнопки печати. Сюда передаются ссылки на печатаемые объекты.Рассмотрим пример стандартного шаблона функции СведенияОВнешнейОбработке для интеграции в систему:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Наименование = "Внешняя печатная форма (Адаптированная)";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Часто требуется Ложь, если используются внешние компоненты или специфический доступ к файлам
// Указываем документы, к которым привязываем форму
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
// Настройка команды печати
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать: Моя внешняя форма";
НоваяКоманда.Идентификатор = "ВнешняяПечатнаяФорма";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Выясним, где хранится логика формирования печатной формы в типовом решении. Как правило, в управляемых формах алгоритм генерации табличного документа расположен в модуле менеджера соответствующего документа. Разберем процесс переноса по шагам.
Шаг 1. Локализация кода в конфигураторе. Откроем конфигуратор, найдем интересующий нас документ (например, РеализацияТоваровУслуг), перейдем в его модуль менеджера и найдем экспортную процедуру Печать или вспомогательные функции, формирующие ТабличныйДокумент (например, СформироватьПечатнуюФорму...).
Шаг 2. Создание внешней обработки. Создадим новую внешнюю обработку в конфигураторе и сохраним ее на диск. В модуле объекта этой обработки пропишем обязательную функцию СведенияОВнешнейОбработке, структуру которой мы рассмотрели выше.
Шаг 3. Реализация процедуры Печать. Добавим в модуль объекта экспортную процедуру Печать. Ее задача — принять управление от БСП, вызвать алгоритм заполнения макета и вернуть готовый результат в коллекцию печатных форм:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПараметрыПечати = Новый Структура;
// Получаем строку коллекции для заполнения табличного документа
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ВнешняяПечатнаяФорма");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатныйДокумент(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
ПечатнаяФорма.СинонимМакета = "Внешняя печатная форма";
КонецЕсли;
КонецПроцедуры
Шаг 4. Перенос макета. Найдем в ветке метаданных документа макет печатной формы (тип ТабличныйДокумент). Скопируем его и вставим в макеты создаваемой внешней обработки с тем же именем.
Шаг 5. Адаптация кода формирования макета. Скопируем функцию построения табличного документа (например, СформироватьПечатныйДокумент) из модуля менеджера документа в модуль объекта внешней обработки. На этом этапе крайне важно устранить ошибки контекста выполнения:
ПолучитьМакет("ИмяМакета"). Во внешней обработке этот контекст недоступен, поэтому код необходимо заменить на ЭтотОбъект.ПолучитьМакет("ИмяМакета").ФизическиеЛица.ФиоФизическогоЛица) переносить не нужно, они продолжат корректно работать из контекста внешней обработки на сервере.Рассмотрим ситуацию, когда в типовую печатную форму требуется внести минимальные изменения: добавить одну колонку, поменять логотип организации или вывести дополнительный реквизит. В таких случаях полное копирование массивных запросов и алгоритмов заполнения нецелесообразно, так как при обновлении конфигурации вы потеряете преимущества автоматического обновления логики сбора данных.
Проанализируем альтернативный метод решения задачи. В процедуре Печать нашей ВПФ мы можем программно вызвать формирование исходного табличного документа силами самой конфигурации, перехватить полученный результат, точечно модифицировать его и вывести пользователю:
Функция СформироватьПечатныйДокументЛениво(МассивОбъектов, ОбъектыПечати)
// Инициализируем коллекцию печатных форм для вызова типового механизма
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ТиповойИдентификаторМакет");
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Вызываем типовую печать из модуля менеджера документа
Документы.РеализацияТоваровУслуг.Печать(МассивОбъектов, ПараметрыВывода, КоллекцияПечатныхФорм, ОбъектыПечати);
СтрокаПечати = КоллекцияПечатныхФорм.Найти("ТиповойИдентификаторМакет", "Имя");
Если СтрокаПечати <> Неопределено Тогда
ТабДок = СтрокаПечати.ТабличныйДокумент;
// Пример точечной модификации: найдем ячейку с текстом и изменим её значение
Область = ТабДок.НайтиТекст("Итого к оплате:");
Если Область <> Неопределено Тогда
Область.Текст = "Всего к оплате (с учетом скидки):";
Область.Шрифт = Новый Шрифт(Область.Шрифт, , , Истина); // Сделаем текст жирным
КонецЕсли;
Возврат ТабДок;
КонецЕсли;
Возврат Новый ТабличныйДокумент;
КонецФункции
Такой подход гарантирует стабильность работы формы при обновлениях конфигурации: если разработчики 1С оптимизируют или изменят структуру запроса в модуле менеджера, ваша внешняя печатная форма продолжит работать без ошибок, накладывая изменения на уже готовый табличный документ.
Посмотрим на практическую сторону разработки. При подключении обработки в информационную базу через механизм «Дополнительные отчеты и обработки», 1С загружает файл .epf в справочник в виде двоичных данных и при выполнении запускает его из временной папки на сервере. Вследствие этого точки останова, расставленные в исходном файле на диске, не будут срабатывать в конфигураторе.
Рассмотрим два надежных способа обхода этой проблемы:
&НаСервере
Процедура ВыполнитьПечатьНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаДокумент);
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("Имя");
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
// Добавляем строку для результата
СтрокаФормы = КоллекцияПечатныхФорм.Добавить();
СтрокаФормы.Имя = "ВнешняяПечатнаяФорма";
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Вызываем процедуру отладки напрямую
ОбъектОбработки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Выводим полученный табдок на форму для визуального контроля
ТабДокРезультат = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецПроцедуры
В некоторых сценариях перед формированием печатного документа пользователю необходимо задать уточняющие параметры (например, выбрать ответственное лицо для подписи, указать дату формирования или установить флаг вывода цен без НДС). Для реализации такого поведения стандартный серверный вызов не подойдет.
Разберем, как изменить логику работы ВПФ для вывода интерактивного окна параметров:
СведенияОВнешнейОбработке() при создании команды укажем тип действия ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода() вместо вызова серверного метода.Печать(ИдентификаторКоманды, ОбъектыНазначения). Именно она будет вызываться платформой при клике по кнопке меню печатной формы.Применение данных методик позволяет эффективно решать задачи любой сложности по адаптации и кастомизации печатных форм, обеспечивая чистоту конфигурации и удобство ее поддержки в будущем.