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