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

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

Как программно открыть форму объекта в 1С

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

Программное открытие формы объекта — одна из самых частых задач при доработке конфигураций 1С: открыть карточку контрагента из обработки, показать документ из отчёта, вызвать форму нового элемента с предзаполненными реквизитами. Для этого встроенный язык предоставляет несколько методов: ОткрытьФорму(), ОткрытьЗначение(), ОткрытьФормуМодально() и глобальный контекст ПолучитьФорму() для толстого клиента.

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

Ниже разобраны основные способы с примерами кода, передачей параметров, типичными ошибками и способами проверить, что форма открылась корректно.

Метод ОткрытьФорму: основной способ в управляемом приложении

Метод ОткрытьФорму() — универсальный способ открытия любой формы в управляемом приложении. В простейшем варианте достаточно указать полное имя формы:

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

Такой вызов откроет форму нового элемента. Чтобы открыть карточку существующего объекта, нужно передать параметр Ключ со ссылкой:

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

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

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

Имя формы можно указывать по-разному: полное имя конкретной формы (Справочник.Контрагенты.ФормаОбъекта), имя пользовательской формы из конфигуратора (Справочник.Контрагенты.Форма.ФормаЭлемента) или краткое имя вида Справочник.Контрагенты.Форма — тогда откроется форма, назначенная основной.

Открытие существующего объекта через ОткрытьЗначение

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

ОткрытьЗначение(ДокументСсылка);

Метод работает и в управляемом, и в обычном приложении, поэтому его часто используют в общем коде, например в расшифровке отчётов. Ограничение очевидно: передать дополнительные параметры (значения заполнения, режим открытия) через ОткрытьЗначение() нельзя — для этого нужен ОткрытьФорму().

Типичный сценарий — обработка расшифровки отчёта, где по клику на ячейку открывается документ-источник данных. Здесь ОткрытьЗначение() предпочтительнее, потому что тип объекта заранее неизвестен, а метод сам подберёт нужную форму.

Открытие формы нового объекта с заполнением реквизитов

Частая задача — открыть форму нового документа или элемента с уже заполненными полями. Для этого в параметры передаётся структура ЗначенияЗаполнения:

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Контрагент", ВыбранныйКонтрагент);

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

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

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

Структура ЗначенияЗаполнения попадает в обработчик ОбработкаЗаполнения() модуля объекта через параметр ДанныеЗаполнения. Если в модуле объекта этот обработчик не предусматривает обработку переданной структуры, заполнение не произойдёт — это одна из самых частых причин «неработающего» кода.

Дополнительно можно передать параметр Основание — ссылку на объект-основание. Тогда сработает штатный механизм ввода на основании, если он настроен в конфигурации.

Порядок действий
  1. 1
    Определите, что открываете: существующую ссылку, новый объект или произвольную форму
  2. 2
    Для существующей ссылки без параметров используйте ОткрытьЗначение(Ссылка)
  3. 3
    Для нового объекта или передачи параметров сформируйте структуру с Ключ или ЗначенияЗаполнения и вызовите ОткрытьФорму()
  4. 4
    Убедитесь, что обработчик ОбработкаЗаполнения в модуле объекта корректно обрабатывает переданные данные
  5. 5
    Проверьте открытие формы в том клиенте, в котором работают пользователи

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

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

Устаревший ОткрытьФормуМодально

Метод ОткрытьФормуМодально() открывает форму в модальном режиме и возвращает результат после её закрытия:

Результат = ОткрытьФормуМодально("Справочник.Контрагенты.ФормаВыбора");

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

Рекомендуемый способ — описание оповещения

Современный подход — открыть форму в блокирующем режиме и обработать результат через ОписаниеОповещения:

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

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

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

Параметры формы: что и как передавать

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

Параметр Уникальность (четвёртый по порядку) определяет, будет ли открыта новая копия формы или активирована уже открытая. Если передать Ложь или опустить параметр, повторный вызов активирует существующую форму с теми же параметрами. Если передать Истина или произвольный уникальный ключ, откроется новый экземпляр — это нужно, когда пользователь должен видеть несколько карточек разных объектов одновременно. Для форм объектов уникальность по умолчанию привязана к ключу, поэтому карточки двух разных контрагентов и так откроются отдельно.

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

Форма = ОткрытьФорму("Обработка.ПодборТоваров.Форма", ПараметрыФормы, Элементы.Товары);

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

Сравнение вариантов

ОткрытьЗначение(Ссылка)

Простейший показ существующего объекта. Не позволяет передать параметры и не подходит для новых объектов.

ОткрытьФорму() с параметром Ключ

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

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

Синхронное получение результата. Не работает в веб-клиенте, устарело, использовать только в обычном приложении.

ПолучитьФорму() + Открыть()

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

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

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

Форма = ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта");

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

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

Для открытия формы конкретного объекта в обычном приложении также применяется метод формы ОткрытьЗначение() либо получение формы с ключом: ПолучитьФорму("Справочник.Контрагенты.ФормаОбъекта", Новый Структура("Ключ", Ссылка)).

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

Проверка результата и типичные проблемы

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

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

Отдельный класс проблем — открытие формы из серверного контекста. Методы открытия форм доступны только на клиенте: вызов ОткрытьФорму() в серверной процедуре или в фоновом задании приведёт к ошибке. Данные для формы нужно готовить на сервере, а сам вызов выполнять в клиентском контексте.

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

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

Открытие формы существующего объекта
Норма

Форма открылась, в заголовке и реквизитах нужный объект

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

Открылась пустая форма нового элемента — проверьте параметр Ключ

Заполнение реквизитов нового объекта
Норма

Поля заполнены переданными значениями

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

Поля пустые — нет обработки в ОбработкаЗаполнения

Работа в веб-клиенте
Норма

Форма открывается, оповещение срабатывает

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

Ошибка модальности — замените вызов на ОписаниеОповещения

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

Активируется уже открытая форма или открывается нужное число копий

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

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

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

Как открыть форму списка с отбором по конкретному значению?

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

Можно ли открыть форму объекта, не зная его типа заранее?

Да, используйте ОткрытьЗначение(Ссылка) — платформа сама определит тип ссылки и откроет соответствующую основную форму объекта. Это стандартный приём для расшифровок отчётов и универсальных обработок.

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

Чаще всего указано неверное полное имя: проверьте вид объекта (Справочник или Справочники — в имени используется единственное число), точное имя объекта и имя формы. Если форма не основная, её имя должно совпадать с именем в конфигураторе.

Как получить значение, которое пользователь выбрал в открытой форме?

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

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

Нет. Интерактивные действия доступны только в клиентском контексте. Из фонового задания результат возвращают через ДлительныеОперации или сообщение пользователю, а открытие формы выполняют на клиенте после получения данных.

Чем отличается параметр Ключ от ЗначенияЗаполнения?

Ключ — это ссылка на существующий объект, форма которого открывается. ЗначенияЗаполнения — структура данных для заполнения реквизитов нового объекта. Одновременно передавать оба параметра бессмысленно: либо объект существует, либо создаётся новый.

Итог

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

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