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