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