Разработка и Конфигурация · 11 мин
Как обратиться к общей форме 1С
Как открыть общую форму в 1С из кода: ОткрытьФорму, ПолучитьФорму, передача параметров, обработка результата. Примеры для управляемого приложения.
Общие формы в 1С — это формы, не привязанные к конкретному объекту метаданных: они хранятся в ветке «Общие → Общие формы» конфигурации и доступны из любого места программы. Типовые примеры — форма настроек, диалог выбора периода, форма вопроса или собственный прогресс-бар. Чтобы обратиться к такой форме, разработчик указывает путь вида ОбщаяФорма.ИмяФормы в методах ОткрытьФорму() или ПолучитьФорму().
Главная сложность у новичков — не сам вызов, а правильная передача параметров, получение результата закрытия формы и понимание разницы между модальным и немодальным открытием. Ошибки в этих местах приводят к исключениям «Форма не найдена», потере введённых пользователем данных или блокировке интерфейса в веб-клиенте.
Ниже разобраны рабочие способы обращения к общей форме: от простейшего открытия до передачи структуры параметров и обработки результата через описание оповещения. Все примеры актуальны для управляемого приложения на современных версиях платформы 1С:Предприятие 8.3.
Где находятся общие формы и как узнать имя для обращения
В конфигураторе общие формы расположены в дереве метаданных: «Общие» → «Общие формы». Имя, которое вы задаёте при создании формы, и есть идентификатор для обращения из кода. Если форма называется ФормаНастроек, полный путь к ней — ОбщаяФорма.ФормаНастроек.
Имя в коде указывается строкой и чувствительно к точному написанию, хотя регистр букв платформа обычно игнорирует. Если форма переименована в конфигураторе, все строковые обращения в коде нужно обновить вручную — автоматический рефакторинг строковых литералов платформа не выполняет. Это частая причина ошибки «Ошибка при вызове метода контекста (ОткрытьФорму): Форма не найдена» после обновления конфигурации.
Проверить доступность формы можно прямо в конфигураторе: дважды щёлкните по ней в дереве — откроется редактор. Если форма отсутствует в ветке, значит, она либо принадлежит конкретному объекту (тогда путь будет вида Справочник.Номенклатура.Форма.ФормаЭлемента), либо удалена.
Открытие общей формы методом ОткрытьФорму
Основной и рекомендуемый способ — метод ОткрытьФорму(). Он работает на клиенте, не блокирует интерфейс и поддерживается во всех режимах: тонкий, толстый и веб-клиент. Минимальный вызов выглядит так:
ОткрытьФорму("ОбщаяФорма.ФормаНастроек");
Полная сигнатура метода принимает имя формы, структуру параметров, владельца, ключ уникальности, окно и описание оповещения о закрытии. Чаще всего вызов выглядит так:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("ОбщаяФорма.ВыборПериода", ПараметрыФормы, ЭтотОбъект, , , ,
Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект));
Третий параметр — владелец формы — важен: он связывает открываемую форму с текущей, и при закрытии владельца дочерняя форма закроется автоматически. Если владельца не указать, форма «повиснет» самостоятельным окном и переживёт закрытие родительской.
&НаКлиенте
Процедура ОткрытьНастройки(Команда)
ПараметрыФормы = Новый Структура("Организация", ТекущаяОрганизация);
ОткрытьФорму("ОбщаяФорма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);
КонецПроцедурыПолучение формы через ПолучитьФорму и когда это оправдано
Метод ПолучитьФорму() возвращает сам объект формы, а не просто открывает её. Это позволяет перед показом программно заполнить реквизиты формы, установить заголовок или изменить элементы:
Форма = ПолучитьФорму("ОбщаяФорма.ФормаНастроек", ПараметрыФормы, ЭтотОбъект);
Форма.Заголовок = "Настройки обмена";
Форма.Открыть();
У этого подхода есть ограничения. Во-первых, ПолучитьФорму() создаёт форму сразу, даже если пользователь её так и не увидит — при частых вызовах это лишняя нагрузка. Во-вторых, прямое обращение к реквизитам и элементам чужой формы нарушает инкапсуляцию: при изменении структуры общей формы ваш код сломается. Предпочтительнее передавать данные через параметры, а не «лезть» внутрь чужой формы.
Оправданный сценарий для ПолучитьФорму() — когда нужно проверить, что форма вообще создаётся, или когда требуется вызвать экспортную процедуру формы до открытия. В остальных случаях используйте ОткрытьФорму().
ОткрытьФорму или ПолучитьФорму
Стандартный способ: открывает форму, поддерживает оповещение о закрытии, не даёт прямого доступа к внутренностям формы. Подходит почти всегда.
Возвращает объект формы до открытия: можно менять реквизиты и вызывать экспортные методы. Использовать только когда нужна подготовка формы до показа.
Передача параметров в общую форму
Параметры передаются структурой, где ключи — имена параметров формы. Чтобы форма приняла параметр, он должен быть объявлен в её настройках: в редакторе формы откройте палитру свойств корневого элемента, вкладка «Параметры», и добавьте параметр с нужным именем. Для ключевых параметров установите флаг «Ключевой параметр».
Внутри формы параметры доступны через свойство Параметры в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("РежимВыбора") И Параметры.РежимВыбора Тогда
Элементы.ГруппаКнопокВыбора.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
Важное ограничение: через параметры нельзя передать произвольные мутабельные объекты — например, таблицу значений с сервера на клиент в веб-клиенте или ссылки, недоступные в контексте вызова. Платформа сериализует параметры, и сложные типы могут не пережить передачу. Надёжные кандидаты — примитивы, ссылки, структуры и массивы из них.
Получение результата при закрытии формы
Модальные вызовы ОткрытьМодально() в современных конфигурациях запрещены режимом совместимости интерфейса, поэтому результат получают асинхронно — через ОписаниеОповещения. Схема такая: при открытии вы передаёте описание оповещения с именем процедуры-обработчика, а общая форма при закрытии вызывает Закрыть(Результат):
// В вызывающей форме
&НаКлиенте
Процедура ПослеВыбораПериода(Результат, ДопПараметры) Экспорт
Если Результат <> Неопределено Тогда
НачалоПериода = Результат.НачалоПериода;
КонецПериода = Результат.КонецПериода;
КонецЕсли;
КонецПроцедуры
// В общей форме
&НаКлиенте
Процедура Выбрать(Команда)
Закрыть(Новый Структура("НачалоПериода,КонецПериода", НачалоПериода, КонецПериода));
КонецПроцедуры
Если пользователь закрыл форму крестиком или по Escape, в обработчик придёт Неопределено — этот случай обязательно обрабатывайте, иначе получите ошибку обращения к полю результата. Альтернативный способ — ОповеститьОВыборе() внутри общей формы: тогда сработает обработчик ОбработкаВыбора формы-владельца.
- 1Создайте или найдите форму в ветке «Общие → Общие формы» конфигуратора
- 2В редакторе формы объявите нужные параметры на вкладке «Параметры»
- 3В вызывающем коде сформируйте структуру параметров и вызовите ОткрытьФорму с описанием оповещения
- 4В общей форме по кнопке завершения вызовите Закрыть(Результат)
- 5В обработчике оповещения проверьте Результат на Неопределено и используйте данные
- 6Запустите отладку и проверьте сценарий закрытия формы крестиком
Типичные ошибки и их устранение
Самая частая ошибка — «Форма не найдена»: либо опечатка в имени, либо форма лежит не в «Общих формах», а у конкретного объекта. Проверьте путь в дереве конфигурации и скопируйте имя оттуда. Вторая по частоте проблема — параметры «не доходят»: причина в том, что параметр не объявлен в редакторе формы, и платформа его молча отбрасывает.
Третья группа ошибок связана с контекстом вызова. ОткрытьФорму() доступен только на клиенте — вызов из серверной процедуры даст ошибку «Метод объекта не обнаружен» или «Использование метода в данном контексте недопустимо». Если логика находится на сервере, верните управление на клиент и открывайте форму там.
Проверка результата и отладка
После внедрения вызова проверьте три сценария: штатное закрытие с результатом, закрытие без выбора (крестик, Escape) и повторное открытие формы. Для отладки поставьте точку останова в ПриСозданииНаСервере общей формы и убедитесь, что структура Параметры содержит ожидаемые ключи.
Если форма открывается, но ведёт себя неправильно, проверьте ключ уникальности: при повторном вызове ОткрытьФорму() с тем же владельцем и без ключа уникальности платформа активирует уже открытый экземпляр вместо создания нового. Иногда это желаемое поведение, иногда — источник «залипших» данных.
Как проверить результат
Окно появилось, параметры видны в отладчике в ПриСозданииНаСервере
Исключение «Форма не найдена» или пустая структура Параметры
В обработчик оповещения пришла структура с данными или Неопределено при отмене
Ошибка обращения к полю результата при закрытии крестиком
Открывается новая форма или осознанно активируется существующая
Активируется старая форма с устаревшими данными, хотя ожидалась новая
Частые вопросы
Что важно запомнить
Общая форма открывается вызовом ОткрытьФорму("ОбщаяФорма.Имя", Параметры, Владелец) только на клиенте. Параметры должны быть объявлены в редакторе формы, результат возвращается через ОписаниеОповещения, а закрытие без выбора всегда даёт Неопределено — обрабатывайте этот случай.
Можно ли открыть общую форму из серверной процедуры?
Нет. Методы ОткрытьФорму и ПолучитьФорму доступны только в клиентском контексте. Если логика выполняется на сервере, верните на клиент признак необходимости открытия формы и вызовите ОткрытьФорму там.
Почему параметры не видны внутри общей формы?
Почти всегда причина в том, что параметр не объявлен в редакторе формы на вкладке «Параметры». Платформа отбрасывает необъявленные ключи структуры без предупреждения. Добавьте параметр в редакторе и проверьте совпадение имён посимвольно.
Как открыть общую форму модально, чтобы заблокировать родительское окно?
Используйте ОткрытьФорму с параметром РежимОткрытияОкна: установите форме свойство «РежимОткрытияОкна = Блокировать окно владельца» и передавайте владельца при вызове. Метод ОткрытьМодально в современных конфигурациях недоступен из-за режима совместимости интерфейса.
Чем ОповеститьОВыборе отличается от Закрыть с результатом?
Закрыть(Результат) завершает работу формы и передаёт значение в описание оповещения. ОповеститьОВыборе отправляет значение в обработчик ОбработкаВыбора формы-владельца, не закрывая форму — подходит для множественного выбора, когда форма остаётся открытой.
Можно ли обратиться к общей форме из внешней обработки?
Да, если общая форма существует в основной конфигурации — путь ОбщаяФорма.ИмяФормы работает и из внешней обработки, запущенной в этой базе. Обратиться к форме, встроенной в саму внешнюю обработку, нужно по пути вида ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы.