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