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

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

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

Вариант 1. Разделение на несколько команд

Прежде чем переходить к программированию сложных диалогов, рассмотрим самый простой и надежный способ — создание нескольких кнопок в меню Печать. Если пользователю нужно просто выбрать между «Полным» и «Кратким» бланком, логичнее всего предложить ему два разных пункта меню. Проанализируем, как это реализуется в функции СведенияОВнешнейОбработке.


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.2.100");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    
    // Команда для полного бланка
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'ТОРГ-12 (полная)'");
    НоваяКоманда.Идентификатор = "ТОРГ12_Полная";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    // Команда для сокращенного бланка
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'ТОРГ-12 (краткая)'");
    НоваяКоманда.Идентификатор = "ТОРГ12_Краткая";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
КонецФункции

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

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

Если выбор параметров сложнее (например, нужно ввести дату, выбрать сотрудника или ответить на вопрос «Да/Нет»), нам потребуется создать полноценную форму внутри внешней обработки. Основная идея заключается в том, чтобы изменить тип команды с ВызовСерверногоМетода на ОткрытиеФормы. Рассмотрим этот процесс по шагам.

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

В модуле объекта внешней обработки указываем, что команда должна открывать форму:


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

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

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


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

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

Шаг 3. Формирование табличного документа

После получения ответа нам нужно программно вызвать механизм печати БСП. Для этого используется метод УправлениеПечатьюКлиент.ПечатьДокументов. Однако он ожидает на вход коллекцию печатных форм, которую нам нужно подготовить на сервере.


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

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

Проблема «Табличный документ не сформирован»

Разберем ситуацию, упомянутую в обсуждении: что делать, если после проверки условия на сервере мы решили отказаться от печати? Если просто прервать выполнение процедуры Печать, система выдаст ошибку: «В обработчике печати не был сформирован табличный документ».

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

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

Особенности для современного интерфейса и веб-клиента

Важно помнить, что в современных конфигурациях (интерфейс «Такси») и при работе через браузер использование модальных окон запрещено. Рассмотрим ключевые моменты:

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

← На главную