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