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