При разработке функционала печати в конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП), разработчики часто сталкиваются с задачей: перед началом формирования печатной формы необходимо запросить у пользователя подтверждение или уточнить параметры (например, выводить ли подписи, факсимиле или печатать с определенными условиями). В типовых решениях команды печати объявляются в модуле менеджера объекта, что вызывает закономерные трудности при попытке открыть диалоговое окно.
Разберем детально, почему возникает эта сложность и как правильно реализовать интерактивный диалог перед печатью штатным способом БСП.
Проанализируем контекст выполнения кода при стандартном формировании команд печати:
Печать модуля менеджера объекта выполняется на сервере. Любые интерактивные методы платформы (такие как Вопрос, ПоказатьВопрос, открытие форм диалогов или предупреждений) на стороне сервера принципиально недоступны и вызывают исключительную ситуацию.РежимИспользованияМодальности = НеИспользовать) устаревший синхронный метод Вопрос блокируется. Интерактивные вопросы должны вызываться асинхронно через метод ПоказатьВопрос с передачей обработчика оповещения (ОписаниеОповещения), что можно сделать только в коде на клиенте.Таким образом, попытка вызвать диалог непосредственно внутри процедуры печати модуля менеджера является архитектурной ошибкой. Чтобы задать вопрос пользователю, необходимо перехватить управление еще до отправки серверного вызова на формирование печатного документа.
Подсистема «Печать» библиотеки БСП позволяет передавать управление не напрямую серверной процедуре формирования табличного документа, а клиентскому методу. Для этого используется переопределение обработчика команды при её регистрации.
Разберем по шагам, как настроить такой механизм.
Шаг 1. Регистрация команды с клиентским обработчиком
В модуле менеджера объекта в экспортной процедуре ДобавитьКомандыПечати настраиваем структуру команды печати. Вместо стандартного серверного выполнения указываем имя процедуры в общем клиентском модуле через свойство Обработчик:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "АктСВопросом";
КомандаПечати.Представление = НСтр("ru = 'Акт об оказании услуг (с параметрами)'");
КомандаПечати.Обработчик = "ПечатьДокументовКлиент.ПечатьАктаСВопросом";
КомандаПечати.СписокФорм = "ФормаДокумента,ФормаСписка";
КонецПроцедуры
Важно помнить: общий модуль, указанный в свойстве Обработчик (в нашем примере ПечатьДокументовКлиент), должен иметь флаг Клиент (управляемое приложение).
Шаг 2. Создание клиентского метода и вывод вопроса
В указанном клиентском модуле создаем экспортную процедуру, которая принимает единый параметр — структуру контекста команды печати. Внутри этой процедуры вызываем немодальный вопрос пользователю:
Процедура ПечатьАктаСВопросом(ПараметрыКоманды) Экспорт
Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопросОПечати", ЭтотОбъект, ПараметрыКоманды);
ТекстВопроса = НСтр("ru = 'Сформировать печатную форму с выводом факсимиле?'");
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
КонецПроцедуры
Шаг 3. Обработка ответа и запуск печати
В процедуре обработки оповещения анализируем результат выбора пользователя. Если действие не отменено, передаем параметры дальше в стандартный механизм подсистемы печати БСП с помощью метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати:
Процедура ПослеОтветаНаВопросОПечати(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ПечататьСПодписями", (РезультатВопроса = КодВозвратаДиалога.Да));
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
ДополнительныеПараметры.МенеджерПечати,
ДополнительныеПараметры.Идентификатор,
ДополнительныеПараметры.ОбъектыПечати,
ДополнительныеПараметры.Форма,
ПараметрыПечати
);
КонецПроцедуры
Переданная структура ПараметрыПечати штатно поступит в процедуру Печать модуля менеджера объекта на сервере, где эти значения можно легко прочитать и применить при заполнении табличного документа.
Если вопрос перед печатью требуется исключительно для того, чтобы предупредить пользователя о непроведенных документах и предложить их провести, писать собственный клиентский диалог не требуется. В БСП для этого предусмотрен готовый функционал.
В процедуре ДобавитьКомандыПечати достаточно включить свойство проверки проведения:
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
В этом случае подсистема печати сама определит статус выбранных документов, задаст пользователю типовой вопрос и при согласии проведет их на клиенте до обращения к серверному формированию отчета.