К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как открыть другую форму внешней обработки 1С

Как открыть другую форму внешней обработки 1С через ОткрытьФорму: передача параметров, модальное и немодальное открытие, обработка результата, ошибки.

Внешняя обработка 1С может содержать несколько форм: основную, форму настроек, форму выбора параметров или диалог подтверждения. Из одной формы такой обработки часто требуется открыть другую — например, по кнопке «Настройки» показать дополнительный диалог, не закрывая основное окно. Для этого используется глобальный метод ОткрытьФорму() с указанием пути к форме внешней обработки.

Ключевая сложность — правильно сформировать имя формы. Для внешней обработки путь строится через объект ВнешниеОбработки либо через полное имя вида ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы. Способ зависит от того, подключена ли обработка к информационной базе или открыта как файл с диска.

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

Как устроено обращение к формам внешней обработки

У внешней обработки, как и у любого объекта метаданных, может быть несколько форм. Одна из них назначена основной (свойство «Основная форма» в палитре свойств обработки), остальные открываются только программно. Чтобы обратиться к конкретной форме, платформе нужно полное имя, состоящее из трёх частей: вида объекта, имени обработки и имени формы.

Для обработки, подключенной к информационной базе через справочник «Дополнительные отчеты и обработки» или добавленной в состав конфигурации, полное имя выглядит так: ВнешняяОбработка.МояОбработка.Форма.ФормаНастроек. Имя обработки в этом случае — это имя, под которым она зарегистрирована, а не имя файла на диске.

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

Открытие формы через ОткрытьФорму() для подключенной обработки

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

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.ФормаНастроек");

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

Чтобы не «зашивать» имя в код, полезно вычислять его динамически. В модуле формы внешней обработки доступен реквизит объекта, через который можно получить метаданные и построить строку имени. Это снижает риск ошибок при переименовании обработки.

bsl
// Открытие формы настроек с передачей параметров
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПериодОтчета", ТекущаяДатаСеанса());

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.ФормаНастроек",
    ПараметрыФормы, ЭтаФорма, Новый УникальныйИдентификатор);

Открытие формы файловой обработки через ПолучитьФорму

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

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

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

Передача параметров и получение результата

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

Для получения результата после закрытия формы используют два механизма. Первый — ОписаниеОповещения: в ОткрытьФорму() пятым параметром передаётся описание процедуры, которая выполнится при закрытии формы. В открываемой форме результат возвращается вызовом Закрыть(Результат), где результат — любое значение, например структура с выбранными настройками.

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

Порядок действий
  1. 1
    Создайте во внешней обработке вторую форму и задайте ей понятное имя
  2. 2
    В основной форме добавьте команду и её обработчик
  3. 3
    Вызовите ОткрытьФорму() с полным именем формы и структурой параметров
  4. 4
    В открываемой форме прочитайте параметры в ПриСозданииНаСервере
  5. 5
    Верните результат через Закрыть(Результат) или ОповеститьОВыборе()
  6. 6
    В вызывающей форме обработайте результат в оповещении или ОбработкаВыбора

Модальное и немодальное открытие

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

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

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

Сравнение вариантов

ОткрытьФорму() по полному имени

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

ПолучитьФорму() через объект обработки

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

Модальное открытие с блокировкой владельца

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

Типичные ошибки и их диагностика

Самая частая проблема — сообщение «Форма не найдена». Причины: опечатка в имени формы, неверное имя обработки в строке (использовано имя файла вместо зарегистрированного имени) или попытка открыть форму файловой обработки по полному имени метаданных. Проверяйте имя формы в дереве конфигуратора и имя регистрации обработки в базе.

Вторая группа ошибок связана с параметрами: в открываемой форме обращаются к Параметры.Ключ, который не был передан, — возникает обращение к несуществующему свойству. Защищайтесь проверкой через Параметры.Свойство("Ключ", Значение) перед использованием.

Третья типичная ситуация — результат закрытия «не приходит». Обычно причина в том, что процедура, указанная в ОписаниеОповещения, объявлена без ключевого слова Экспорт в клиентском контексте, либо форма-владелец уже закрыта к моменту срабатывания оповещения. Также проверьте, что в дочерней форме результат действительно передаётся в Закрыть(), а не теряется при закрытии крестиком — в этом случае в оповещение придёт Неопределено.

Типичные ошибки
01
Использование имени файла вместо зарегистрированного имени обработки — форма не находится после подключения обработки к базе
02
Обращение к Параметры.Ключ без проверки — ошибка, если параметр не передан
03
Отсутствие Экспорт у процедуры оповещения — обработчик результата не вызывается
04
Нет обработки значения Неопределено в результате — падение логики при закрытии формы крестиком
05
ОткрытьМодально() при отключённом модальном режиме в конфигурации — ошибка выполнения

Проверка результата после внедрения

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

Отдельно проверьте повторное открытие: если пользователь дважды нажмёт кнопку, не должно открываться несколько одинаковых окон. Для этого передавайте в ОткрытьФорму() уникальный ключ — при совпадении ключа платформа активирует уже открытую форму вместо создания новой.

Контрольные точки

Как проверить результат

Открытие формы
Норма

Форма открывается и из файла, и из подключенной обработки

Тревожный признак

Ошибка «Форма не найдена» в одном из режимов

Передача параметров
Норма

В ПриСозданииНаСервере все нужные значения заполнены

Тревожный признак

Параметры пустые или обращение к ним вызывает ошибку

Возврат результата
Норма

Оповещение срабатывает, результат соответствует выбору пользователя

Тревожный признак

Оповещение не вызывается или приходит Неопределено при явном выборе

Повторное открытие
Норма

Активируется уже открытая форма

Тревожный признак

Открываются дубликаты окон

Ответы на частые вопросы

Можно ли открыть форму другой внешней обработки, а не той же самой?

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

Почему ОткрытьФорму не находит форму, хотя имя указано верно?

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

Как открыть форму так, чтобы нельзя было вернуться к основной, пока не закроешь дочернюю?

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

Как передать в открываемую форму таблицу значений или другой сложный объект?

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

Что приходит в оповещение, если пользователь закрыл форму крестиком?

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

Как избежать открытия нескольких копий одной и той же формы?

Передайте в ОткрытьФорму() параметр «КлючУникальности» — фиксированное значение или уникальный идентификатор. При повторном вызове с тем же ключом платформа активирует уже открытое окно вместо создания нового.

Итог

Что важно запомнить

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