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