Как открыть форму во внешней обработке в 1С?

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

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

Способ 1. Открытие формы в управляемом приложении через ОткрытьФорму

В управляемом интерфейсе 1С для открытия окон используется глобальная функция ОткрытьФорму. Если необходимо открыть форму внешней обработки, путь к ней формируется по шаблону "ВнешняяОбработка.<ИмяОбработки>.Форма.<ИмяФормы>".

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


// Клиентский вызов формы
ПараметрыФормы = Новый Структура;
ОткрытьФорму("ВнешняяОбработка.МояВнешняяОбработка.Форма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);

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

  1. Формирование пути на клиенте: можно получить базовую строку пути из системного свойства ЭтотОбъект.ИмяФормы:

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

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

Способ 2. Открытие формы в обычном приложении (толстый клиент)

Если разработка ведется для обычных форм толстого клиента (платформа 1С 8.3 в режиме обычного приложения или 1С 8.2), синтаксис отличается. В этом режиме форма получается непосредственно у объекта обработки методом ПолучитьФорму:


// Вариант для обычных форм толстого клиента
Форма = ПолучитьФорму("ФормаНастроек");
Форма.Открыть();

Обратите внимание: в управляемом интерфейсе вызов метода ПолучитьФорму на клиенте вызовет ошибку «Метод объекта не обнаружен», так как в управляемых формах работа ведется исключительно через ОткрытьФорму.

Особенности синхронизации данных между формами внешней обработки

Проанализируем важный нюанс управляемых форм: при вызове метода ОткрытьФорму платформа создает новый независимый экземпляр объекта внешней обработки. Значения реквизитов и табличных частей из текущей формы автоматически во вторую форму не переносятся.

Чтобы организовать обмен данными между формами, выполним следующие шаги:

  1. Передача данных во вторую форму: на сервере помещаем необходимые данные во временное хранилище с помощью метода ПоместитьВоВременноеХранилище и передаем адрес хранилища в параметрах метода ОткрытьФорму. Во второй форме в событии ПриСозданииНаСервере считываем данные из хранилища и заполняем реквизиты.
  2. Возврат данных в исходную форму: после закрытия второй формы передаем результат обратно с помощью механизма оповещений (методы Оповестить или ОповеститьОВыборе), либо через передачу структуры ОписаниеОповещения в метод открытия.

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

← На главную