Как вызвать диалоговое окно перед формированием внешней печатной формы в 1С

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

При разработке внешних печатных форм (ВПФ) для управляемого приложения 1С часто возникает необходимость запросить у пользователя дополнительные данные или подтверждение действия (например, выбор «Да/Нет») непосредственно перед началом формирования печатного документа.

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

Причина проблемы: разделение клиентского и серверного контекста

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

Чтобы задать вопрос пользователю на тонком клиенте, выполнение кода необходимо перенести на сторону клиента до момента обращения к серверным функциям получения печатной формы.

Шаг 1. Настройка параметров регистрации внешней обработки

Рассмотрим порядок регистрации команды внешней печатной формы в функции СведенияОВнешнейОбработке() модуля объекта. Для команды необходимо указать тип использования ВызовКлиентскогоМетода вместо стандартного серверного вызова.

Проанализируем пример настройки сведений о ВПФ:


Функция СведенияОВнешнейОбработке() Экспорт

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

    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = "Печать с вопросом";
    Команда.Идентификатор = "ПечатьСВопросом";
    // Указываем тип вызова клиентского метода
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
    Команда.Модификатор = "ПечатьMXL";

    Возврат ПараметрыРегистрации;

КонецФункции

Благодаря настройке ТипКомандыВызовКлиентскогоМетода подсистема БСП при нажатии кнопки в меню печати обратится не к модулю объекта, а к клиентскому модулю формы внешней обработки.

Шаг 2. Создание формы и обработка клиентского вызова

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

Посмотрим, как организовать асинхронный диалог с пользователем в модуле формы с помощью объекта ОписаниеОповещения и метода ПоказатьВопрос:


&НаКлиенте
Процедура PechatСВопросом(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

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

КонецПроцедуры

&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) АвтоТест

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

КонецПроцедуры

Шаг 3. Получение печатной формы с сервера и её отображение

После того как ответ пользователя получен на клиенте, вызывается серверная функция для формирования табличного документа с учетом сделанного выбора.

Разберем пример завершающего этапа работы команды:


&НаКлиенте
Процедура СформироватьИПоказатьПечатнуюФорму(ОбъектыНазначения, Подробно)

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

КонецПроцедуры

&НаСервере
Функция СформироватьПечатнуюФормуНаСервере(ОбъектыНазначения, Подробно)

    // Вызов внутренних процедур формирования ТабличногоДокумента
    // с использованием переданного параметра "Подробно"
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    // ... Заполнение табличного документа ...
    
    Возврат ТабличныйДокумент;

КонецФункции

Важные нюансы и ограничения

  1. Асинхронность вызовов: В современных конфигурациях 1С на платформе 8.3 использование модальных окон запрещено. Для запроса ответа пользователя применяются методы ПоказатьВопрос или СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю.
  2. Самостоятельный вывод документа: При использовании типа команды ВызовКлиентскогоМетода БСП не открывает стандартную форму печати автоматически. Вывод табличного документа на экран нужно реализовывать программно с помощью метода Показать() или открывать общую форму печати документов ОбщаяФорма.ПечатьДокументов.
  3. Автоматический режим: Формы с клиентскими вызовами не предназначены для фонового или группового выполнения без участия пользователя.
← На главную