Как обеспечить открытие промежуточной формы выбора параметров во внешней печатной форме для 1С:ERP

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

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

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

Выясним причину: почему форма не открывается?

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

Рассмотрим стандартные варианты вызова:

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

Шаг 1. Корректировка сведений о внешней обработке

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

Посмотрим на пример заполнения таблицы команд:


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

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

Шаг 2. Реализация клиентской логики в модуле формы

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

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


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

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

Шаг 3. Передача параметров и формирование документа

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

Проанализируем алгоритм завершения выбора в форме:


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

Шаг 4. Особенности работы в безопасном режиме

При добавлении обработки в справочник «Дополнительные отчеты и обработки» 1С включает Безопасный режим. Это накладывает ограничения на использование некоторых методов и открытие окон. Если форма все равно не открывается, проверьте следующие моменты:

Шаг 5. Тонкая настройка интерфейса формы

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

Разберем пример очистки интерфейса:


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

Резюме и рекомендации

Для того чтобы ваша внешняя печатная форма в ERP работала корректно с промежуточным диалогом, придерживайтесь следующего чек-листа:

  1. В функции СведенияОВнешнейОбработке обязательно указывайте тип команды ВызовКлиентскогоМетода.
  2. Разместите экспортную процедуру Печать(ИдентификаторКоманды, ОбъектыНазначения) в модуле основной формы обработки.
  3. Используйте метод ОткрытьФорму для инициализации диалога с пользователем.
  4. Для окончательного вывода печатной формы применяйте метод УправлениеПечатьюКлиент.ВыполнитьКомандуПечати, передавая в него накопленные параметры.

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

← На главную