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