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