При разработке внешних печатных форм (ВПФ) для конфигураций на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: перед выводом печатной формы показать пользователю диалоговое окно (форму настроек). В этом окне пользователь может выбрать дополнительные параметры, например, подписантов, отображение печати и подписей, детальную разбивку по периодам или другие реквизиты.
Для реализации такой логики разработчику необходимо знать, из какого именно документа (или списка документов) была вызвана печатная форма. Однако стандартные попытки передать ссылку на объект через обычные реквизиты обработки часто приводят к тому, что в открывшейся форме настроек эти данные оказываются пустыми. Давайте подробно разберем, почему это происходит и как правильно передать ссылку на исходный документ в форму настроек ВПФ.
Основная сложность заключается в специфике работы БСП с внешними обработками в управляемом приложении. Когда пользователь нажимает кнопку печати в документе, БСП загружает внешнюю обработку во временное хранилище и запускает её в изолированном контексте. Если тип команды настроен неверно или в самой управляемой форме печатной формы не настроены специальные ключевые параметры, платформа 1С просто очищает все передаваемые данные, и в форму ничего не доходит.
Чтобы решить эту задачу, мы детально рассмотрим два основных сценария работы с ВПФ в БСП: через тип команды «Открытие формы» и через рекомендуемый тип «Вызов клиентского метода».
---
Этот способ подходит, если вам нужно сразу открыть основную форму вашей внешней обработки, в которой пользователь выполнит настройки, а затем нажмет кнопку «Печать».
Для того чтобы этот механизм отработал корректно, необходимо соблюсти два важнейших условия: правильно зарегистрировать команду в модуле объекта и создать правильные параметры в управляемой форме.
Шаг 1. Регистрация команды в модуле объекта
В модуле объекта внешней печатной формы в функции СведенияОВнешнейОбработке() мы указываем тип запуска команды как открытие формы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Наименование = "Внешняя печатная форма с настройками";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Добавляем команду
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать с предварительной настройкой";
НоваяКоманда.Идентификатор = "ПечатьСНастройкой";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 2. Настройка параметров управляемой формы (Критически важно!)
Откройте вашу управляемую форму в Конфигураторе. Перейдите на вкладку «Параметры». Вам необходимо вручную добавить параметр со следующими свойствами:
ОбъектыНазначенияПроизвольный (или Массив)Если флаг «Ключевой параметр» не установлен, платформа 1С проигнорирует передачу массива документов при инициализации формы, и параметр останется пустым.
Шаг 3. Получение ссылки при открытии формы
Теперь в модуле управляемой формы в обработчике события ПриСозданииНаСервере или ПриОткрытии мы можем обратиться к переданным параметрам. Поскольку пользователь может выделить в списке несколько документов и нажать печать, БСП всегда передает массив ссылок.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметра ОбъектыНазначения
Если Параметры.Свойство("ОбъектыНазначения") Тогда
МассивДокументов = Параметры.ОбъектыНазначения;
Если ТипЗнч(МассивДокументов) = Тип("Массив") И МассивДокументов.Количество() > 0 Тогда
// Если печатаем один документ, берем первый элемент массива
СсылкаНаДокумент = МассивДокументов[0];
// Записываем ссылку в реквизит формы или обработки для дальнейшей работы
Объект.СсылкаНаОбъект = СсылкаНаДокумент;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
---
Этот подход считается более профессиональным и гибким в рамках стандартов разработки БСП. При его использовании БСП не открывает форму обработки напрямую, а вызывает экспортную клиентскую процедуру Печать() в форме вашей ВПФ. Из этой процедуры мы можем открыть диалоговое окно настроек, получить результат и сразу же передать сформированный макет в стандартный механизм предварительного просмотра БСП.
Шаг 1. Регистрация команды в модуле объекта
В модуле объекта регистрируем команду с типом использования «Вызов клиентского метода»:
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
Шаг 2. Реализация экспортной процедуры в модуле основной формы
В модуле основной формы вашей ВПФ обязательно должна присутствовать экспортная процедура Печать с клиентским контекстом выполнения. Именно в нее БСП передает массив ссылок на объекты:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
// Подготавливаем параметры для открытия нашей вспомогательной формы настроек
ПараметрыФормы = Новый Структура;
// Передаем ссылку на первый документ (или весь массив, если настроек много)
ПараметрыФормы.Вставить("ДокументСсылка", ОбъектыНазначенияМассив[0]);
// Описываем обработчик оповещения, который сработает после закрытия формы настроек
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияФормыНастроек", ЭтаФорма, ОбъектыНазначенияМассив);
// Открываем вспомогательную форму настроек (диалог ввода параметров)
ОткрытьФорму("ВнешняяОбработка.ИмяВашейВПФ.Форма.ФормаНастроек",
ПараметрыФормы,
ЭтотОбъект,
,,,,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
Шаг 3. Прием параметров во вспомогательной форме настроек
В модуле формы ФормаНастроек мы принимаем переданную структуру параметров:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ДокументСсылка") Тогда
// Отображаем на форме пользователю, для какого документа делаем настройки
Объект.СсылкаНаОбъект = Параметры.ДокументСсылка;
КонецЕсли;
КонецПроцедуры
Шаг 4. Возврат выбранных настроек и запуск печати
Когда пользователь заполнил все настройки на нашей форме и нажал кнопку «ОК» (или «Печать»), мы закрываем форму настроек и передаем структуру заполненных параметров назад в вызывающую форму:
&НаКлиенте
Процедура КнопкаОКНажатие(Команда)
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("ВыполнитьПечать", Истина);
СтруктураНастроек.Вставить("ВыводитьПечатьИПодписи", Объект.ВыводитьПечатьИПодписи);
СтруктураНастроек.Вставить("ДополнительныйТекст", Объект.ДополнительныйТекст);
Закрыть(СтруктураНастроек);
КонецПроцедуры
Теперь в модуле основной формы срабатывает процедура-оповещение ПослеЗакрытияФормыНастроек, где мы можем направить документ на печать в стандартную форму БСП с учетом выбранных пользователем параметров:
&НаКлиенте
Процедура ПослеЗакрытияФормыНастроек(РезультатЗакрытия, ОбъектыНазначенияМассив) Экспорт
Если РезультатЗакрытия = Неопределено Или Не РезультатЗакрытия.ВыполнитьПечать Тогда
Возврат; // Пользователь отказался от печати
КонецЕсли;
// Формируем параметры для вызова стандартной формы печати документов БСП
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = Параметры.ДополнительнаяОбработкаСсылка;
ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения, ДополнительныеПараметры");
ПараметрыИсточника.ИдентификаторКоманды = "ПечатьСНастройкой";
ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначенияМассив;
// Передаем настройки пользователя напрямую в ДополнительныеПараметры.
// Они будут доступны в модуле объекта ВПФ при формировании табличного документа.
ПараметрыИсточника.ДополнительныеПараметры = РезультатЗакрытия;
ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
// Открываем стандартное окно печати БСП
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
---
Разработчики часто сталкиваются с трудностями при отладке внешних обработок БСП, так как код выполняется во временных файлах на сервере, и точки останова в Конфигураторе не срабатывают. Рассмотрим два простых способа отладки:
.epf с диска, указываете документ-источник и запускаете печать. В этот момент обработка имитирует среду БСП, и точки останова в Конфигураторе для вашей внешней обработки начинают корректно работать.
&НаСервере
Процедура ОтладитьПечатьНаСервере()
ОбработкаВПФ = ВнешниеОбработки.Создать("C:\ВПФ\МояПечатнаяФорма.epf", Ложь);
// Вызов экспортного метода формирования печатной формы напрямую
КонецПроцедуры
Используя предложенные методики, вы сможете без труда получать ссылки на исходные документы в контексте управляемых форм, гибко управлять выводом диалоговых окон настроек и реализовывать самые сложные сценарии формирования печатных форм в вашей системе на базе 1С:Предприятие 8.3.