Как во внешнюю печатную форму передать ссылку на объект?

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

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

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

Понимание механизма работы БСП с внешними формами

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

Шаг 1. Регистрация внешней печатной формы

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


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    
    // Определяем список объектов, к которым подключается форма
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документы.ЗаказПоставщику"); 
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    
    ПараметрыРегистрации.Вставить("Наименование", "Договор (внешняя форма)");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    
    // Создаем таблицу команд
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Важно: Использование команды "ОткрытиеФормы"
    ДобавитьКоманду(ТаблицаКоманд, 
                    "Сформировать договор с параметрами", 
                    "ДоговорСПараметрами", 
                    "ОткрытиеФормы", 
                    Истина, 
                    "ПечатьMXL");
                    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    Возврат ПараметрыРегистрации;
КонецФункции

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

Шаг 2. Получение ссылки в модуле управляемой формы

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


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

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

Шаг 3. Альтернативный метод: ВызовКлиентскогоМетода

Рассмотрим более гибкий вариант, который упоминался в обсуждении — использование ВызовКлиентскогоМетода. Этот способ позволяет выполнить какой-либо код на клиенте перед тем, как открыть форму. В регистрации указываем тип использования "ВызовКлиентскогоМетода", а в модуле формы создаем экспортную процедуру Печать.


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

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

Важные технические нюансы

При работе с внешними печатными формами стоит учитывать несколько критически важных моментов, которые помогут избежать ошибок при эксплуатации:

  1. Безопасный режим: В функции регистрации параметр БезопасныйРежим часто устанавливают в значение Ложь. Это необходимо, если ваша форма должна обращаться к файловой системе, использовать COM-объекты или выполнять привилегированные операции. Однако помните о безопасности кода.
  2. Отладка: Внешние формы трудно отлаживать, так как они запускаются из временных папок. Проанализируем лайфхак: создайте в форме реквизит ТестоваяСсылка и заполняйте его вручную при открытии обработки через Файл -> Открыть. Это позволит имитировать работу БСП без постоянного переподключения обработки в базу.
  3. Обновление интерфейса: Если ваша форма не только печатает, но и меняет данные в объекте (например, ставит дату печати или меняет статус), не забудьте вызвать Оповестить("Запись_ОбъектНазначения", СсылкаНаОбъект). Это заставит форму документа-основания обновить данные на экране.
  4. Модификаторы: Параметр ПечатьMXL в регистрации сообщает системе, что конечным результатом будет табличный документ. Если ваша форма полностью автономна, этот модификатор можно опустить или заменить на свой.

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

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

← На главную