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

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

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

Понимание механизма работы БСП

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

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


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

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

Получение ссылки через параметры формы

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

Проанализируем, как правильно извлечь эти данные в модуле формы обработки. Нам понадобится обработчик события ПриСозданииНаСервере. Рассмотрим пример кода:


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

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

Использование владельца формы

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

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

  1. При открытии формы на клиенте анализируем владельца.
  2. Если владельцем является форма документа, извлекаем ссылку через ВладелецФормы.Объект.Ссылка.
  3. Если владельцем является форма списка, извлекаем текущую строку через Элементы.Список.ТекущиеДанные.Ссылка.

Посмотрим на пример клиентского кода:


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

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

Передача ссылки в модуль печати

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

Разберем типичный сценарий вызова печати из формы:


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

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

Особенности новых версий БСП

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

Также стоит помнить о типе команды «ИспользованиеКлиентскогоМетода». В этом сценарии управление передается в модуль обработки в процедуру ВыполнитьКоманду на клиенте. Оттуда вы можете вручную открыть форму своей обработки, явно передав в нее ОбъектыНазначения:


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

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

← На главную