Как открыть вспомогательную форму из внешней обработки в 1С?

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

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

Разберем причины возникновения этой ошибки и рассмотрим проверенные способы правильного открытия форм внешней обработки.

Почему возникает ошибка при попытке открыть форму?

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

  1. Динамическая адресация управляемых форм: В управляемом приложении полное имя формы внешней обработки формируется динамически платформой. Оно имеет вид ВнешняяОбработка.<Идентификатор>.Форма.<ИмяФормы>. По короткому имени форма не может быть найдена глобальным контекстом.
  2. Контекст управляемой формы: В модуле формы ключевое слово ЭтаФорма ссылается на объект типа УправляемаяФорма, а не на сам объект внешней обработки. Метод ПолучитьФорму() в управляемом интерфейсе является устаревшим, для открытия окон рекомендуется использовать глобальную клиентскую процедуру ОткрытьФорму().

Способ 1. Формирование имени через замену в свойстве «ИмяФормы» (на клиенте)

Рассмотрим самый простой и быстрый способ, не требующий вызова сервера. Мы можем взять полное имя текущей открытой формы из свойства ЭтаФорма.ИмяФормы и заменить в нем имя текущей формы на имя требуемой вспомогательной формы с помощью функции СтрЗаменить().

Посмотрим на пример клиентского кода:


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

Также можно использовать разбор строки до последней точки, чтобы гарантированно выделить префикс обработки:


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

Способ 2. Получение полного имени через метаданные объекта на сервере

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

Разберем по шагам реализацию серверного вызова:


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

&НаКлиенте
Процедура ОткрытьВторуюФорму(Команда)
    ПолноеИмяФормы = ПолучитьПолноеИмяНужнойФормы("Форма2");
    ОткрытьФорму(ПолноеИмяФормы, , ЭтаФорма);
КонецПроцедуры

Способ 3. Открытие формы при программном подключении обработки

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


// На сервере подключаем обработку
ИмяПодключенной = ВнешниеОбработки.Подключить(ПутьКФайлу);

// На клиенте формируем путь к нужной форме
ОткрытьФорму("ВнешняяОбработка." + ИмяПодключенной + ".Форма.Вспомогательная");

Важные нюансы и передача данных между формами

Рассмотрим особенности, о которых необходимо помнить при работе с несколькими формами одной внешней обработки:

  1. Изоляция экземпляров: При открытии вспомогательной формы создается отдельный экземпляр объекта внешней обработки. Данные, введенные пользователем в реквизиты или таблицы основной формы, автоматически во вторую форму не переносятся.
  2. Передача параметров: Передавать исходные данные во вспомогательную форму следует через структуру параметров функции ОткрытьФорму() или через временное хранилище (ПоместитьВоВременноеХранилище).
  3. Возврат результата: Для получения данных обратно в основную форму без использования устаревших модальных окон используйте объект ОписаниеОповещения или механизм ОповеститьОВыборе().

Альтернативные варианты реализации

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

  1. Многостраничный интерфейс: Разместите элементы вспомогательного окна на основной форме внутри группы с видом «Страницы» (переключая видимость страниц программно).
  2. Всплывающая панель: Используйте группу формы с видом «Всплывающая» для быстрого ввода параметров без открытия отдельных окон.
← На главную