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

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

При разработке внешних печатных форм (ВПФ) часто возникает задача запросить у пользователя дополнительные данные перед формированием документа. Это могут быть реквизиты доверенности, данные водителя, транспортного средства, экспедитора (как при формировании ТТН или транспортных накладных) или произвольные комментарии. Однако попытка открыть форму или использовать методы ввода значений прямо из модуля объекта внешней обработки приводит к ошибкам.

Разберем подробно причины такого поведения платформы и рассмотрим правильные варианты реализации диалога ввода параметров с использованием механизмов Библиотеки Стандартных Подсистем (БСП).

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

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

На сервере действуют жесткие ограничения платформы 1С:Предприятие 8.3:

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

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

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

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

Разберем по шагам реализацию этого способа.

Шаг 1. Настройка регистрации команды в модуле объекта

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


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

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

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

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

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

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

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


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

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

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

&НаКлиенте
Процедура ПослеЗакрытияФормыВводаПараметров(РезультатЗакрытия, ДополнительныеПараметры) Экспорт

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

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

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

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

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

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

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

Рекомендации по сохранению введенных настроек

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

← На главную