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

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

Как открыть общую форму в 1С

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

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

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

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

Что такое общая форма и где она находится в конфигураторе

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

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

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

Как открыть общую форму программно через ОткрытьФорму

Базовый синтаксис в управляемом приложении:

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

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

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

ОткрытьФорму("ОбщаяФорма.НастройкиОбмена",

ПараметрыФормы,

ЭтотОбъект, // владелец формы

Уникальность,

,

,

ОписаниеОповещения,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

Как передать параметры в общую форму

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

Обработать переданные значения можно в обработчике ПриСозданииНаСервере общей формы через коллекцию Параметры:

&НаСервере

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

Если Параметры.Свойство("Организация") Тогда

ТекущаяОрганизация = Параметры.Организация;

КонецЕсли;

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

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

Как получить результат из общей формы при закрытии

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

&НаКлиенте

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

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

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

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Внутри общей формы по кнопке «ОК» вызывается Закрыть(ВыбранноеЗначение). Переданное значение придёт в параметр «Результат» обработчика оповещения. Если пользователь закрыл форму крестиком без выбора, результат будет Неопределено — эту ситуацию обязательно нужно обрабатывать, иначе получите ошибку обращения к пустому значению.

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

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

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

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

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

В обычном приложении (толстый клиент) общую форму открывают через ПолучитьФорму:

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

ФормаНастроек.Организация = Организация;

ФормаНастроек.ОткрытьМодально();

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

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

ОткрытьФорму с оповещением

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

ПолучитьФорму + ОткрытьМодально

Только обычное приложение (толстый клиент). Код проще, но не работает в управляемом режиме с запретом модальности.

Общая команда интерфейса

Открытие из меню без привязки к объекту. Требует минимального кода в модуле команды, не подходит для передачи контекста объекта.

Типичные ошибки и ограничения

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

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

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

Типичные ошибки
01
Вызов ОткрытьФорму в серверной процедуре — ошибка «интерактивные операции недоступны». Перенесите вызов в клиентский контекст
02
Параметр не объявлен в редакторе формы — значение молча теряется, форма открывается пустой
03
Нет проверки результата на Неопределено — при закрытии формы крестиком код падает с ошибкой
04
Обновление конфигурации без обновления конфигурации БД — новая форма не видна в режиме предприятия
05
Попытка использовать ОткрытьМодально в управляемом приложении — исключение из-за запрета модальности

Как проверить, что форма открывается корректно

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

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

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

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

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

Окно открылось, ошибок нет

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

Сообщение «Неизвестное имя формы» — проверьте имя и обновление конфигурации БД

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

Поля формы заполнены переданными значениями

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

Поля пустые — параметр не объявлен в редакторе формы

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

Обработчик оповещения получил значение после Закрыть(Значение)

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

Результат Неопределено при нажатии «ОК» — проверьте вызов Закрыть с параметром

FAQ: частые вопросы об открытии общих форм

Можно ли открыть общую форму из фонового задания или регламентного задания?

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

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

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

Чем ОткрытьФорму отличается от ПолучитьФорму?

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

Как открыть общую форму из внешней обработки?

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

Почему форма открывается за главным окном или теряется?

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

Можно ли открыть общую форму в мобильном клиенте?

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

Итог

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

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