Как вывести окно для ввода параметров перед формированием внешней печатной формы на управляемых формах

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

При переводе внешних печатных форм с обычных форм (например, из конфигурации «Бухгалтерия предприятия 2.0») на управляемые формы (БСП, «Бухгалтерия предприятия 3.0») разработчики часто сталкиваются с проблемой интерактивного взаимодействия с пользователем. В обычных формах было достаточно вызвать синхронный диалог ВыбратьЭлемент() или Вопрос() прямо в процедуре Печать() модуля объекта. В управляемом приложении логика разделена на клиентский и серверный контекст, а прямой вызов диалоговых окон на сервере запрещен платформой.

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

Причины проблемы и архитектурные ограничения

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

  1. Разделение контекста выполнения: Стандартная серверная процедура Печать() в модуле объекта выполняется строго на стороне сервера. В этом контексте нет доступа к экрану пользователя, окнам или клавиатурному вводу.
  2. Запрет модальных окон: В современных конфигурациях включен режим запрета модальности. Методы вроде Вопрос() или ВыбратьИзСписка() в синхронном варианте вызывают системную ошибку. Взаимодействие должно выполняться асинхронно через объекты ОписаниеОповещения или асинхронные конструкции.
  3. Тип команды БСП по умолчанию: Если при регистрации внешней обработки используется тип ВызовСерверногоМетода, конфигурация вызывает сервер напрямую, минуя клиентский интерфейс обработки.

Вариант 1. Использование команды «Вызов клиентского метода»

Рассмотрим основной способ, который подходит для простых диалогов (выбор строки, выбор типа цен, подтверждение действия или выбор диапазона дат).

Шаг 1. Регистрация внешней обработки

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


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

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

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

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

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


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

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

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

Шаг 3. Обработка выбора и формирование печатных форм

Опишем серверную функцию получения данных и клиентский обработчик завершения выбора. Для вывода результата в стандартную подсистему БСП (с предпросмотром, сохранением в PDF и отправкой по почте) используем общий модуль УправлениеПечатьюКлиент:


&НаСервереБезКонтекста
Функция ПолучитьСписокСтрок(СсылкаНаДокумент)

    Список = Новый СписокЗначений;
    Список.Добавить(0, "Все строки");
    
    Номер = 1;
    Для Каждого Стр Из СсылкаНаДокумент.Товары Цикл
        Список.Добавить(Номер, "Строка № " + Строка(Номер) + ": " + Строка(Стр.Номенклатура));
        Номер = Номер + 1;
    КонецЦикла;
    
    Возврат Список;

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

&НаКлиенте
Процедура ПослеВыбораСтроки(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт

    Если ВыбранныйЭлемент = Неопределено Тогда
        Возврат;
    КонецЕсли;

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

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

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

    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    ОбъектыПечати = Новый СписокЗначений;
    
    ОбъектОбработки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати);

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

Вариант 2. Использование типа команды «Открытие формы»

Если для формирования печатной формы требуется сложный интерфейс (множество реквизитов, выбор ответственных лиц, дополнительные флаги, таблицы настроек), рекомендуется использовать открытие полноценной формы обработки.

Разберем логику настройки:

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

Важное замечание: При групповой печати реквизит ОбъектыНазначения содержит массив из нескольких ссылок. В обработчиках необходимо учитывать этот момент, чтобы логика выбора параметров корректно отрабатывала для всех выбранных документов.

← На главную