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

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

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

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

Разбор основной проблемы: как обратиться к форме

Когда мы работаем с обычной обработкой в составе конфигурации, путь к форме прост: Обработка.ИмяОбработки.Форма.ИмяФормы. Однако внешняя печатная форма в момент выполнения загружается во временное хранилище, и система присваивает ей уникальное внутреннее имя. Если попытаться вызвать форму по имени файла на диске, система выдаст ошибку.

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


// Пример вызова формы внутри модуля внешней обработки
ПараметрыФормы = Новый Структура("Ключ", Значение);
КлючУникальности = Новый УникальныйИдентификатор();

// Формируем путь: ВнешняяОбработка.[ИмяОбъекта].Форма.[ИмяФормы]
// В ряде случаев "ИмяОбработки" можно получить через метаданные
ПолноеИмяФормы = "ВнешняяОбработка." + ЭтотОбъект.Метаданные().Имя + ".Форма.ИмяВашейФормы";

Фрм = ПолучитьФорму(ПолноеИмяФормы, ПараметрыФормы, ЭтаФорма, КлючУникальности);
Фрм.Открыть();

Проанализируем этот код. Мы используем ЭтотОбъект.Метаданные().Имя, чтобы система подставила то имя, которое она назначила обработке при регистрации в справочнике «Дополнительные отчеты и обработки». Это позволяет избежать «зашивания» жестких имен, которые могут измениться.

Выбор метода: ВызовКлиентскогоМетода vs ОткрытиеФормы

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

  1. Использование = "ВызовКлиентскогоМетода". В этом случае управление передается в экспортную процедуру Печать в модуле формы или модуля объекта. Здесь мы находимся в контексте клиента и можем свободно открывать окна.
  2. Использование = "ОткрытиеФормы". Рассмотрим подробнее этот вариант. Если нам нужно сначала показать форму настроек, а только потом печатать, мы можем указать тип команды ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(). Тогда система при нажатии кнопки «Печать» сразу откроет основную форму ВПФ.

Выясним причину, почему это важно: если команда серверная, вы не сможете открыть форму напрямую. Вам придется сначала вернуть управление на клиента.

Передача сложных данных (Таблица значений) между формами

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

Шаг 1. Сохранение данных на сервере. Перед открытием формы нам нужно поместить таблицу во временное хранилище.


&НаСервере
Функция ПоместитьДанныеВоХранилище(МояТаблицаДанных)
    АдресХранилища = ПоместитьВоВременноеХранилище(МояТаблицаДанных, Новый УникальныйИдентификатор());
    Возврат АдресХранилища;
КонецФункции

Шаг 2. Передача адреса в форму. При открытии второй формы передаем полученный адрес в структуру параметров.


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

Шаг 3. Получение данных в дочерней форме. В модуле открываемой формы, в обработчике ПриСозданииНаСервере, мы извлекаем таблицу.


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

Нюансы работы с владельцем формы и безопасностью

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

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

Подведение итогов

Для успешного открытия формы из ВПФ необходимо:

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

← На главную