Как автоматически заполнить реквизит ссылки на документ при открытии формы внешней печатной формы?

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

При разработке внешних печатных форм (ВПФ) в среде 1С:Предприятие на управляемых формах (например, в «1С:Бухгалтерии предприятия 3.0» на базе Библиотеки стандартных подсистем) часто возникает задача: перед формированием печатного документа открыть интерактивную форму обработки для настройки параметров, выбора дополнительных условий или сопоставления данных. При этом основной реквизит обработки, хранящий ссылку на исходный документ (например, СсылкаНаОбъект), должен быть заполнен автоматически в момент открытия.

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

В чем заключается проблема

Когда внешняя обработка регистрируется в системе с типом команды ОткрытиеФормы, разработчики нередко пытаются получить ссылку на документ стандартными клиентскими методами — например, через свойство ВладелецФормы. Однако на этапе инициализации или открытия формы свойство ВладелецФормы может возвращать Неопределено либо не содержать прямого обращения к данным объекта через ВладелецФормы.Объект.Ссылка, что приводит к ошибкам выполнения.

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


Функция СведенияОВнешнейОбработке() Экспорт
    
    РегистрационныеДанные = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.0.0.0");
    РегистрационныеДанные.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    РегистрационныеДанные.Версия = "1.0";
    РегистрационныеДанные.Назначение.Добавить("Документ.ПоступлениеТоваровУслуг");
    
    НоваяКоманда = РегистрационныеДанные.Команды.Добавить();
    НоваяКоманда.Представление = "Накладная с дополнительными параметрами";
    НоваяКоманда.Идентификатор = "ПечатьНакладной";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат РегистрационныеДанные;
    
КонецФункции

Выясним причину проблемы и рассмотрим способы передачи контекста документа в открываемую форму.

Способ 1. Получение ссылки через параметры формы-владельца

Если печатная форма всегда вызывается из открытой формы документа (формы объекта), ссылка на текущий документ содержится в параметре Ключ формы-владельца. Мы можем безопасно проверить наличие свойства и установить значение реквизита обработки при событии ПриОткрытии.

Разберем программную реализацию в модуле управляемой формы внешней обработки:


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

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

Важные ограничения данного метода:

  1. Код работает только при вызове из формы отдельного документа. Если пользователь запускает печать из формы списка документов или журнала, параметр Ключ у формы-владельца отсутствует, так как списковые формы передают выделенные строки в других свойствах.
  2. Для нового, еще не записанного документа значение Ключ будет пустым.
  3. При отладке обработки через меню «Файл — Открыть» форма не имеет владельца, поэтому обязательно требуется проверка ВладелецФормы <> Неопределено.

Способ 2. Штатная передача параметров БСП через «ОбъектыНазначения»

При использовании типа команды ОткрытиеФормы подсистема дополнительных отчетов и обработок БСП автоматически передает в открываемую форму структуру параметров, содержащую массив ссылок ОбъектыНазначения.

Чтобы форма внешней обработки корректно принимала эти данные, выполним следующие шаги:

  1. В конфигураторе на вкладке Параметры управляемой формы внешней обработки создадим параметр ОбъектыНазначения с типом Произвольный.
  2. В обработчике ПриСозданииНаСервере модуля формы прочитаем переданный массив и заполним реквизит:

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

Этот способ является более универсальным, так как корректно отрабатывает как при вызове из формы объекта, так и при групповой печати из формы списка документов.

Способ 3. Использование команды «ВызовКлиентскогоМетода» (рекомендуемый стандарт БСП)

Если для формирования печатной формы требуется интерактивный ввод данных пользователем, стандарт разработки БСП рекомендует использовать команду с типом ВызовКлиентскогоМетода вместо ОткрытиеФормы. Это обеспечивает полный контроль над процессом формирования и выводом на печать.

Рассмотрим реализацию по шагам:

  1. В функции СведенияОВнешнейОбработке() указываем тип команды:
    
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
    
  2. В модуле основной формы обработки объявляем экспортную клиентскую процедуру Печать:
    
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
                
        // Открываем диалоговую форму настройки и передаем массив объектов
        ПараметрыОткрытия = Новый Структура("ОбъектыНазначения", ОбъектыНазначения);
        ОткрытьФорму("ВнешняяОбработка.ВПФ_Накладная.Форма.ФормаНастройки", ПараметрыОткрытия);
                
    КонецПроцедуры
    

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

Особенности обновления внешних обработок в базе

При изменении состава команд, типов вызова или регистрационных данных в функции СведенияОВнешнейОбработке() платформа кэширует старые настройки. Чтобы новые параметры вступили в силу, обработку необходимо заново перезаписать в справочнике Дополнительные отчеты и обработки в режиме «1С:Предприятие».

← На главную