Как передать ссылку на объект во внешнюю печатную форму в 1С (УФ)

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

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

Постановка задачи и анализ механизмов БСП

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

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

Вариант 1. Использование команды «ОткрытиеФормы»

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

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

В модуле формы обработки в процедуре ПриСозданииНаСервере нам необходимо написать следующий код:


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

Важно помнить, что ОбъектыНазначения — это всегда Массив, даже если печать вызвана из формы одного документа, а не из списка. Это сделано для универсальности работы подсистемы печати.

Вариант 2. Использование команды «ВызовКлиентскогоМетода»

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

Во-первых, в модуле объекта обработки в функции СведенияОВнешнейОбработке укажем соответствующее использование команды:


НоваяКоманда = Команды.Добавить();
НоваяКоманда.Представление = "Печать с параметрами";
НоваяКоманда.Идентификатор = "ОтчетСПараметрами";
НоваяКоманда.Использование = "ВызовКлиентскогоМетода"; // Ключевой момент
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";

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

  1. Принимаем параметры: ИдентификаторКоманды и ОбъектыНазначения.
  2. Передаем ОбъектыНазначения в параметры открытия формы.
  3. Открываем форму программно.

Пример реализации в модуле формы:


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

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

Тонкости работы с массивом ссылок

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

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

Рекомендации по заполнению реквизитов формы

Чтобы ссылка на объект корректно отображалась на форме и пользователь мог "провалиться" в документ, выполните следующие действия:

Выясним причину, почему иногда ссылка "не доходит" до формы. Чаще всего это происходит из-за опечаток в именах ключей структуры параметров или из-за того, что в СведенияОВнешнейОбработке забыли указать правильный тип использования. Всегда проверяйте содержимое коллекции Параметры через отладчик в момент создания формы.

Безопасный режим

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

Рассмотренные методы позволяют эффективно интегрировать внешние обработки в интерфейс 1С, обеспечивая бесшовную передачу контекста (ссылок на документы) и предоставляя пользователю удобный интерфейс для ввода настроек перед формированием печатного листа.

← На главную