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

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

Как обратиться к общей форме 1С

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

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

Главная сложность у новичков — не сам вызов, а правильная передача параметров, получение результата закрытия формы и понимание разницы между модальным и немодальным открытием. Ошибки в этих местах приводят к исключениям «Форма не найдена», потере введённых пользователем данных или блокировке интерфейса в веб-клиенте.

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

Где находятся общие формы и как узнать имя для обращения

В конфигураторе общие формы расположены в дереве метаданных: «Общие» → «Общие формы». Имя, которое вы задаёте при создании формы, и есть идентификатор для обращения из кода. Если форма называется ФормаНастроек, полный путь к ней — ОбщаяФорма.ФормаНастроек.

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

Проверить доступность формы можно прямо в конфигураторе: дважды щёлкните по ней в дереве — откроется редактор. Если форма отсутствует в ветке, значит, она либо принадлежит конкретному объекту (тогда путь будет вида Справочник.Номенклатура.Форма.ФормаЭлемента), либо удалена.

Открытие общей формы методом ОткрытьФорму

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

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

Полная сигнатура метода принимает имя формы, структуру параметров, владельца, ключ уникальности, окно и описание оповещения о закрытии. Чаще всего вызов выглядит так:

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("ОбщаяФорма.ВыборПериода", ПараметрыФормы, ЭтотОбъект, , , ,

Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект));

Третий параметр — владелец формы — важен: он связывает открываемую форму с текущей, и при закрытии владельца дочерняя форма закроется автоматически. Если владельца не указать, форма «повиснет» самостоятельным окном и переживёт закрытие родительской.

bsl
&НаКлиенте
Процедура ОткрытьНастройки(Команда)
    ПараметрыФормы = Новый Структура("Организация", ТекущаяОрганизация);
    ОткрытьФорму("ОбщаяФорма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

Получение формы через ПолучитьФорму и когда это оправдано

Метод ПолучитьФорму() возвращает сам объект формы, а не просто открывает её. Это позволяет перед показом программно заполнить реквизиты формы, установить заголовок или изменить элементы:

Форма = ПолучитьФорму("ОбщаяФорма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);

Форма.Заголовок = "Настройки обмена";

Форма.Открыть();

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

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

ОткрытьФорму или ПолучитьФорму

ОткрытьФорму

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

ПолучитьФорму

Возвращает объект формы до открытия: можно менять реквизиты и вызывать экспортные методы. Использовать только когда нужна подготовка формы до показа.

Передача параметров в общую форму

Параметры передаются структурой, где ключи — имена параметров формы. Чтобы форма приняла параметр, он должен быть объявлен в её настройках: в редакторе формы откройте палитру свойств корневого элемента, вкладка «Параметры», и добавьте параметр с нужным именем. Для ключевых параметров установите флаг «Ключевой параметр».

Внутри формы параметры доступны через свойство Параметры в обработчике ПриСозданииНаСервере:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("РежимВыбора") И Параметры.РежимВыбора Тогда

Элементы.ГруппаКнопокВыбора.Видимость = Истина;

КонецЕсли;

КонецПроцедуры

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

Получение результата при закрытии формы

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

// В вызывающей форме

&НаКлиенте

Процедура ПослеВыбораПериода(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

НачалоПериода = Результат.НачалоПериода;

КонецПериода = Результат.КонецПериода;

КонецЕсли;

КонецПроцедуры

// В общей форме

&НаКлиенте

Процедура Выбрать(Команда)

Закрыть(Новый Структура("НачалоПериода,КонецПериода", НачалоПериода, КонецПериода));

КонецПроцедуры

Если пользователь закрыл форму крестиком или по Escape, в обработчик придёт Неопределено — этот случай обязательно обрабатывайте, иначе получите ошибку обращения к полю результата. Альтернативный способ — ОповеститьОВыборе() внутри общей формы: тогда сработает обработчик ОбработкаВыбора формы-владельца.

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

Типичные ошибки и их устранение

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

Третья группа ошибок связана с контекстом вызова. ОткрытьФорму() доступен только на клиенте — вызов из серверной процедуры даст ошибку «Метод объекта не обнаружен» или «Использование метода в данном контексте недопустимо». Если логика находится на сервере, верните управление на клиент и открывайте форму там.

Типичные ошибки
01
Опечатка в строковом пути ОбщаяФорма.Имя — исключение «Форма не найдена»; копируйте имя из дерева конфигурации
02
Параметр не объявлен в редакторе формы — значение молча теряется, Параметры.Свойство() возвращает Ложь
03
Вызов ОткрытьФорму из серверной процедуры — ошибка контекста; открывайте форму только на клиенте
04
Нет проверки Результат на Неопределено в обработчике оповещения — ошибка при закрытии формы крестиком
05
Отсутствие владельца у формы — дочерняя форма остаётся открытой после закрытия родительской

Проверка результата и отладка

После внедрения вызова проверьте три сценария: штатное закрытие с результатом, закрытие без выбора (крестик, Escape) и повторное открытие формы. Для отладки поставьте точку останова в ПриСозданииНаСервере общей формы и убедитесь, что структура Параметры содержит ожидаемые ключи.

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

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

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

Форма открылась
Норма

Окно появилось, параметры видны в отладчике в ПриСозданииНаСервере

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

Исключение «Форма не найдена» или пустая структура Параметры

Результат закрытия
Норма

В обработчик оповещения пришла структура с данными или Неопределено при отмене

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

Ошибка обращения к полю результата при закрытии крестиком

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

Открывается новая форма или осознанно активируется существующая

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

Активируется старая форма с устаревшими данными, хотя ожидалась новая

Частые вопросы

Итог

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

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

Можно ли открыть общую форму из серверной процедуры?

Нет. Методы ОткрытьФорму и ПолучитьФорму доступны только в клиентском контексте. Если логика выполняется на сервере, верните на клиент признак необходимости открытия формы и вызовите ОткрытьФорму там.

Почему параметры не видны внутри общей формы?

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

Как открыть общую форму модально, чтобы заблокировать родительское окно?

Используйте ОткрытьФорму с параметром РежимОткрытияОкна: установите форме свойство «РежимОткрытияОкна = Блокировать окно владельца» и передавайте владельца при вызове. Метод ОткрытьМодально в современных конфигурациях недоступен из-за режима совместимости интерфейса.

Чем ОповеститьОВыборе отличается от Закрыть с результатом?

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

Можно ли обратиться к общей форме из внешней обработки?

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