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

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

Как получить форму в 1С: способы, методы и примеры кода

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

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

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

Как устроено имя формы в 1С

Любой вызов начинается с правильного имени формы. Оно строится по строгому шаблону: <ТипОбъекта>.<ИмяОбъекта>.Форма.<ИмяФормы>. Например, основная форма элемента справочника «Номенклатура» будет иметь имя Справочник.Номенклатура.Форма.ФормаЭлемента, если в конфигураторе форма названа именно так.

Если у объекта несколько форм одного вида, используется конкретное имя из конфигуратора. Если форма не задана явно, платформа подставляет форму по умолчанию — но при программном вызове лучше указывать имя полностью, чтобы поведение было предсказуемым. Для форм списка используется вид «ФормаСписка», для выбора — «ФормаВыбора», для документов — «ФормаДокумента».

Общие формы, не привязанные к объекту метаданных, вызываются по имени ОбщаяФорма.<ИмяФормы>. Формы внешних обработок получают иначе — через объект обработки, что рассмотрено ниже.

Получение формы в управляемом приложении

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

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", СсылкаНаЭлемент);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);

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

Получение объекта формы без открытия

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

Форма = ПолучитьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);

Форма.Открыть();

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

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",
    ПараметрыФормы, , Новый УникальныйИдентификатор);

Открытие формы с передачей параметров и обработкой результата

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

Для форм выбора и диалогов, где нужен результат работы пользователя, применяется ОткрытьФормуМодально() либо открытие с описанием оповещения. Современный подход — асинхронный: метод ОткрытьФорму() с параметром «ОписаниеОповещенияОЗакрытии»:

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

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаВыбора",

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

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

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

Получение формы в обычном приложении

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

ФормаЭлемента = Справочники.Номенклатура.ПолучитьФорму("ФормаЭлемента");

ФормаЭлемента.Открыть();

// Или форма конкретного объекта:

ФормаОбъекта = СсылкаНаЭлемент.ПолучитьФорму();

ФормаОбъекта.Открыть();

Здесь ПолучитьФорму() возвращает объект формы, с которым можно работать до открытия: устанавливать реквизиты, вызывать экспортные процедуры модуля формы. Это принципиальное отличие от управляемого режима, где объект формы живёт в связке клиент-сервер и прямой доступ к его внутренностям ограничен.

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

Получение формы внешней обработки и отчёта

Формы внешних обработок и отчётов (файлы .epf и .erf) получают через специальный менеджер. В управляемом приложении сначала подключают обработку, затем открывают её форму по имени, сформированному платформой. В обычном приложении используется метод ВнешниеОбработки.ПолучитьФорму() с указанием пути к файлу:

// Обычное приложение

Форма = ВнешниеОбработки.ПолучитьФорму("C:\Обработки\МояОбработка.epf", "Форма");

Форма.Открыть();

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

Типичные ошибки и их диагностика

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

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

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

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

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

Выбор метода зависит от задачи: просто показать пользователю объект — достаточно ОткрытьФорму() с ключом; получить результат выбора — добавьте описание оповещения; заполнить форму программно до показа — используйте ПолучитьФорму() либо передавайте данные через параметры и обрабатывайте их в событии «ПриСозданииНаСервере» целевой формы.

Предпочтительный паттерн в управляемом приложении — передача данных через параметры формы, а не прямое обращение к реквизитам полученной формы. Так код остаётся устойчивым к изменению структуры формы и корректно работает в тонком и веб-клиенте.

Маршрут решения

Как выбрать действие

Нужно просто показать объект пользователюИспользуйте ОткрытьФорму() с параметром Ключ
Нужен результат выбора из спискаОткрывайте ФормуВыбора с РежимВыбора=Истина и ОписаниемОповещения
Нужно программно подготовить форму до показаПередайте данные через структуру параметров и обработайте в ПриСозданииНаСервере
Работаете в обычном приложенииИспользуйте ПолучитьФорму() у менеджера объекта или у ссылки

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

Итог

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

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

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

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

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

Как открыть форму списка с отбором?

Передайте в параметрах структуру с ключом «Отбор», значением которого является другая структура: имя поля — значение отбора. Например, Отбор по владельцу для подчинённого справочника. Форма списка применит отбор при открытии.

Почему возникает ошибка «Форма не найдена»?

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

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

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

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

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

Как открыть форму нового документа с заполнением?

Передайте в параметрах структуру «ЗначенияЗаполнения» с реквизитами и их значениями — платформа подставит их в новый объект. Либо используйте параметр «Основание» со ссылкой на документ-основание, если для объекта настроено заполнение на основании.