Разработка внешней печатной формы (ВПФ) — одна из наиболее частых задач при адаптации типовых конфигураций под нужды бизнеса. Внешние печатные формы позволяют изменять макеты и логику формирования печатных документов без внесения изменений в само конфигурационное дерево, что существенно облегчает последующее обновление программы.
В этой статье мы подробно разберем, как создать внешнюю печатную форму с нуля, правильно организовать структуру модуля обработки, а также с какими трудностями можно столкнуться при переносе логики печати между разными конфигурациями, например из «Зарплата и Управление Персоналом» в «Бухгалтерию предприятия».
Проанализируем ситуацию, когда необходимо взять за основу готовую печатную форму из одной конфигурации (например, ЗУП) и адаптировать её под другую (например, БУХ). На этом этапе часто возникают следующие сложности:
СсылкаНаОбъект. Если ему задан строго один тип документа (например, ДокументСсылка.РеализацияТоваровУслуг), назначить эту форму для документа другого типа не удастся без изменения типа реквизита на составной или универсальный.Рассмотрим стандартную последовательность действий при разработке новой ВПФ на платформе 1С:Предприятие 8.2:
СсылкаНаОбъект. В качестве типа значения укажем ссылку на тот документ или справочник, для которого разрабатывается форма (например, ДокументСсылка.АктОбОказанииПроизводственныхУслуг или составной тип).Поле ввода, связав его с реквизитом СсылкаНаОбъект. Это необходимо для удобной отладки.Выясним, как правильно организовать программный код внутри модуля объекта внешней обработки. Для интеграции со стандартным механизмом печати обычных форм 8.2 модуль объекта должен содержать экспортную функцию Печать(), возвращающую заполненный ТабличныйДокумент.
Рекомендуется разделять получение данных и построение печатной формы на отдельные логические функции, как это реализовано в типовых конфигурациях 1С:
Функция Печать() Экспорт
ПараметрыПечати = ПолучитьПараметрыПечати();
ТабДокумент = СформироватьТабличныйДокумент(ПараметрыПечати);
Возврат ТабДокумент;
КонецФункции
Разберем подробнее структуру функций получения данных и заполнения макета:
Функция ПолучитьПараметрыПечати()
Параметры = Новый Структура;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Организация КАК Организация,
| Док.Контрагент КАК Контрагент
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Ссылка = &СсылкаНаОбъект";
Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Параметры.Вставить("Номер", Выборка.Номер);
Параметры.Вставить("Дата", Выборка.Дата);
Параметры.Вставить("Организация", Выборка.Организация);
Параметры.Вставить("Контрагент", Выборка.Контрагент);
КонецЕсли;
Возврат Параметры;
КонецФункции
Функция СформироватьТабличныйДокумент(ПараметрыПечати)
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Заполнить(ПараметрыПечати);
ТабДокумент.Вывести(ОбластьШапка);
Возврат ТабДокумент;
КонецФункции
Когда внешняя печатная форма уже зарегистрирована в информационной базе в справочнике дополнительных обработок, платформа запускает её из служебных хранилищ. В таком режиме отладка точки останова в Конфигураторе не сработает напрямую, а ошибки будут выводиться в штатное окно сообщений без возможности пошагового прохода по коду.
Чтобы эффективно отладить код, используем созданную форму обработки:
СсылкаНаОбъект выберем реальный документ из информационной базы.
&НаКлиенте
Процедура НажатиеКнопкиПечать(Команда)
// Получаем объект обработки и вызываем экспортную функцию
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ТабДок = ОбъектОбработки.Печать();
ТабДок.Показать();
КонецПроцедуры
При таком подходе точка останова, поставленная в модуле объекта обработки, успешно сработает в Конфигураторе, и мы сможем проанализировать значения промежуточных переменных, структур и результатов выполнения запросов.