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

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

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

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

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

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

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

Где создаётся общая форма и как её найти в конфигураторе

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

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

Открытие общей формы в управляемом приложении

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

bsl
&НаКлиенте
Процедура ОткрытьНастройки(Команда)
	ОткрытьФорму("ОбщаяФорма.НастройкиОбмена");
КонецПроцедуры

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

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

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

Открытие с обработкой результата

Если форма должна вернуть значение (например, результат выбора), используйте описание оповещения:

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

&НаКлиенте
Процедура ПослеЗакрытияФормы(Результат, ДопПараметры) Экспорт
	Если Результат <> Неопределено Тогда
		// обработка результата
	КонецЕсли;
КонецПроцедуры

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

Открытие общей формы в обычном приложении

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

bsl
Процедура КнопкаНастройкиНажатие(Элемент)
	ФормаНастроек = ПолучитьОбщуюФорму("НастройкиОбмена");
	ФормаНастроек.Открыть();
КонецПроцедуры

Для передачи данных в обычной форме используют либо экспортные переменные и процедуры формы, либо присваивание реквизитов после получения объекта формы, но до открытия:

bsl
ФормаНастроек = ПолучитьОбщуюФорму("НастройкиОбмена");
ФормаНастроек.Организация = ТекущаяОрганизация;
ФормаНастроек.ОткрытьМодально();

Открытие через общую команду без программирования

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

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

Способы открытия общей формы

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

Управляемое приложение, поддержка параметров и оповещений. Стандартный способ для современных конфигураций.

ПолучитьОбщуюФорму().Открыть()

Только обычное приложение. Прямой доступ к реквизитам формы до открытия.

Общая команда

Открытие из командного интерфейса без привязки к конкретной форме-владельцу.

ОткрытьФормуМодально()

Устаревший вариант блокирующего открытия, не работает в веб-клиенте; заменяется на оповещения.

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

Параметры формы — основной способ настроить поведение открываемой общей формы. В модуле формы обработайте их в ПриСозданииНаСервере:

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

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

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

Модальное и блокирующее открытие

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

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

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

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

Форма открывается
Норма

Окно появляется без сообщений об ошибке

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

Исключение «Общая форма не обнаружена» или «Метод объекта не обнаружен»

Параметры переданы
Норма

В ПриСозданииНаСервере Параметры.Свойство() возвращает Истина

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

Структура параметров пуста — проверьте, что структура заполнена до вызова ОткрытьФорму

Повторный вызов
Норма

При заданном ключе уникальности активируется уже открытая форма

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

Открываются дубликаты окон — ключ уникальности не задан

Частые проблемы и их решение

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

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

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

Итог

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

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

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

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

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

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

Да. Добавьте в форму списка команду, создайте для неё клиентский обработчик нажатия и вызовите ОткрытьФорму с именем общей формы. Кнопку перетащите в командную панель в редакторе формы.

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

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

Почему ОткрытьФормуМодально не работает в веб-клиенте?

Модальные вызовы запрещены архитектурой веб-клиента и отключены режимом использования модальности в конфигурации. Используйте ОткрытьФорму с описанием оповещения и режимом БлокироватьОкноВладельца — логика результата переносится в процедуру-обработчик оповещения.

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

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

Чем общая форма отличается от формы обработки?

Общая форма не имеет собственного объекта данных и существует только как экранный элемент, открываемый из кода или команды. Форма обработки привязана к объекту «Обработка», который может иметь реквизиты, табличные части и размещаться в интерфейсе как самостоятельный инструмент.