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