Как автоматически заполнить реквизит «СсылкаНаОбъект» при открытии формы внешней обработки или печатной формы в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке внешних печатных форм (ВПФ) или дополнительных обработок в среде 1С:Предприятие 8.3 на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: открыть форму обработки для ввода дополнительных параметров перед печатью и автоматически подставить в реквизит форму ссылку на тот документ, из которого была вызвана команда.

Если разработчик пытается обратиться к свойству ВладелецФормы, он сталкивается с тем, что оно равно Неопределено или не содержит нужных реквизитов. Разберем по шагам, почему так происходит, как правильно получить ссылку на исходный документ и какие варианты реализации существуют в БСП.

Причина возникновения проблемы

Проанализируем архитектуру работы внешних обработок в БСП. Когда для команды внешней обработки выбран тип вызова ОткрытиеФормы (метод ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы()), подсистема дополнительных отчетов и обработок открывает форму программно. При этом свойство ВладелецФормы не связывается с формой документа напрямую, либо не содержит объектных данных в привычном виде. Вся контекстная информация передается платформой и БСП через структуру параметров открываемой формы.

Вариант 1. Штатный способ БСП через параметры формы (Рекомендуемый)

Рассмотрим наиболее надежный и стандартный способ получения ссылки на целевой документ. Подсистема БСП при открытии формы обработки передает структуру параметров, в которой содержится массив ОбъектыНазначения. В этом массиве находятся ссылки на документы или элементы справочников, из которых была вызвана команда.

Для оптимизации клиент-серверного взаимодействия обработку параметров следует выполнять на сервере в обработчике ПриСозданииНаСервере, а не на клиенте в ПриОткрытии. Это исключает лишние серверные вызовы.

Посмотрим на пример кода в модуле формы внешней обработки:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие параметра ОбъектыНазначения, передаваемого БСП
    Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
        Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
            // Заполняем реквизит формы СсылкаНаОбъект первым элементом массива
            Объект.СсылкаНаОбъект = Параметры.ОбъектыНазначения[0];
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Преимущества данного подхода:

  1. Код стабильно работает как при вызове из формы отдельного документа, так и при вызове из формы списка (динамического списка или журнала).
  2. Не происходит лишних вызовов между клиентом и сервером при открытии окна.
  3. Сохраняется полная совместимость со стандартами разработки БСП.

Вариант 2. Получение ключа через владельца формы (Решение из практики)

Разберем вариант, который иногда применяется разработчиками при вызове формы напрямую из открытой формы документа. В этом случае ссылка извлекается через свойство Ключ в параметрах владельца формы:


&НаСервере
Процедура УстановитьСсылкуНаОбъектНаСервере(Ссылка)
    Объект.СсылкаНаОбъект = Ссылка;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    Если (ЭтаФорма.ВладелецФормы <> Неопределено) И (ЭтаФорма.ВладелецФормы.Параметры.Свойство("Ключ")) Тогда
        УстановитьСсылкуНаОбъектНаСервере(ЭтаФорма.ВладелецФормы.Параметры.Ключ);
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание: данный способ имеет существенные ограничения. Он работает исключительно тогда, когда команда вызвана из уже записанного документа (где параметр Ключ заполнен). При запуске обработки из списка документов или журнала обращение к ЭтаФорма.ВладелецФормы.Параметры.Ключ не вернет ссылку на текущую строку.

Вариант 3. Классическая ВПФ без формы диалога

Если для формирования печатного документа не требуется интерактивный ввод дополнительных данных от пользователя, создавать форму обработки вовсе не нужно. В стандартной концепции БСП печать выполняется без открытия формы через экспортную процедуру Печать в модуле объекта обработки.

В этом случае ссылки на выбранные документы передаются в процедуру в виде первого параметра МассивОбъектов:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Формируем табличный документ для каждого переданного объекта
    ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати);
    
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм, 
        "ИмяМакета", 
        "ПредставлениеПечатнойФормы", 
        ТабличныйДокумент
    );
    
КонецПроцедуры

Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати)
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("Макет");
    
    // Заполнение областей макета данными документа СсылкаНаОбъект
    
    Возврат ТабличныйДокумент;
    
КонецФункции

Альтернативные архитектурные решения

Если перед нами стоит задача дополнить типовой документ недостающими полями (например, сведениями о водителе или доверенности для накладной), выясним, какие типовые механизмы позволяют избежать создания промежуточных диалоговых форм:

  1. Дополнительные реквизиты и сведения: В типовых конфигурациях 1С (таких как 1C:Бухгалтерия, 1С:ERP, 1С:УТ) можно настроить дополнительные реквизиты для конкретного документа прямо в пользовательском режиме. Тогда значения вводятся непосредственно в документе, а стандартная ВПФ считывает их через модуль УправлениеСвойствами.
  2. Команда «СценарийВФорме»: При регистрации внешней обработки можно использовать тип команды СценарийВФорме, когда управление передается клиентскому коду, выполняющему необходимый опрос пользователя или открытие специализированных диалогов.
← На главную