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

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

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

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

Почему не работают стандартные механизмы передачи параметров?

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

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

---

Вариант 1. Использование типа команды «Открытие формы» (Простой способ)

Этот способ подходит, если вам нужно сразу открыть основную форму вашей внешней обработки, в которой пользователь выполнит настройки, а затем нажмет кнопку «Печать».

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

Шаг 1. Регистрация команды в модуле объекта

В модуле объекта внешней печатной формы в функции СведенияОВнешнейОбработке() мы указываем тип запуска команды как открытие формы:


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

Шаг 2. Настройка параметров управляемой формы (Критически важно!)

Откройте вашу управляемую форму в Конфигураторе. Перейдите на вкладку «Параметры». Вам необходимо вручную добавить параметр со следующими свойствами:

  1. Имя: ОбъектыНазначения
  2. Тип: Произвольный (или Массив)
  3. Свойство «Ключевой параметр»: обязательно установите этот флаг (флажок напротив свойства в палитре свойств).

Если флаг «Ключевой параметр» не установлен, платформа 1С проигнорирует передачу массива документов при инициализации формы, и параметр останется пустым.

Шаг 3. Получение ссылки при открытии формы

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


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

---

Вариант 2. Использование типа команды «Вызов клиентского метода» (Рекомендуемый и гибкий способ)

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

Шаг 1. Регистрация команды в модуле объекта

В модуле объекта регистрируем команду с типом использования «Вызов клиентского метода»:


НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();

Шаг 2. Реализация экспортной процедуры в модуле основной формы

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


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

Шаг 3. Прием параметров во вспомогательной форме настроек

В модуле формы ФормаНастроек мы принимаем переданную структуру параметров:


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

Шаг 4. Возврат выбранных настроек и запуск печати

Когда пользователь заполнил все настройки на нашей форме и нажал кнопку «ОК» (или «Печать»), мы закрываем форму настроек и передаем структуру заполненных параметров назад в вызывающую форму:


&НаКлиенте
Процедура КнопкаОКНажатие(Команда)
    
    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("ВыполнитьПечать", Истина);
    СтруктураНастроек.Вставить("ВыводитьПечатьИПодписи", Объект.ВыводитьПечатьИПодписи);
    СтруктураНастроек.Вставить("ДополнительныйТекст", Объект.ДополнительныйТекст);
    
    Закрыть(СтруктураНастроек);
    
КонецПроцедуры

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


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

---

Секреты эффективной отладки внешних печатных форм

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

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

Используя предложенные методики, вы сможете без труда получать ссылки на исходные документы в контексте управляемых форм, гибко управлять выводом диалоговых окон настроек и реализовывать самые сложные сценарии формирования печатных форм в вашей системе на базе 1С:Предприятие 8.3.

← На главную