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

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

Как открыть произвольную форму в 1С

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

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

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

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

Что такое произвольная форма и когда её открывают программно

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

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

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

Открытие формы методом ОткрытьФорму()

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

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

Первый параметр — полное имя формы. Оно строится по шаблону: ВидОбъекта.ИмяОбъекта.Форма.ИмяФормы. Для основных форм можно использовать сокращённые указатели: ФормаОбъекта, ФормаСписка, ФормаВыбора. Для общих форм имя выглядит как ОбщаяФорма.ИмяФормы, для внешних обработок — путь к файлу.

Полная сигнатура метода включает параметры формы, владельца, ключ уникальности, окно, навигационную ссылку и описание оповещения о закрытии:

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

ПараметрыФормы.Вставить("Отбор", Новый Структура("Организация", ТекущаяОрганизация));

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

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

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

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

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

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

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

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

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

ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);

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

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

Метод ПолучитьФорму() и работа с объектом формы

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

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

ФормаПодбора.Склад = ТекущийСклад;

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

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

В большинстве простых сценариев ПолучитьФорму() избыточен: передача параметров через структуру в ОткрытьФорму() и их обработка в событии ПриСозданииНаСервере открываемой формы — более чистый и предсказуемый подход.

Сравнение способов

ОткрытьФорму()

Универсальный способ с параметрами и оповещением о закрытии. Подходит для большинства задач, но не даёт доступа к объекту формы до открытия.

ПолучитьФорму()

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

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

Самый короткий способ открыть объект по ссылке. Не позволяет выбрать нестандартную форму и передать параметры.

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

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

ОткрытьФорму("ВнешняяОбработка.МояОбработка.Форма.ФормаОбработки");

Такой вызов работает, если обработка зарегистрирована в информационной базе (например, через справочник дополнительных отчётов и обработок БСП). Для файла на диске путь формируется иначе, и в тонком клиенте потребуется передача файла на сервер, поскольку сервер не имеет доступа к локальной файловой системе пользователя.

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

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

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

&НаКлиенте

Процедура ПослеЗакрытияФормы(Результат, ДополнительныеПараметры) Экспорт

Если Результат <> Неопределено Тогда

ОбработатьВыбор(Результат);

КонецЕсли;

КонецПроцедуры

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

Для форм выбора стандартных объектов есть альтернатива: обработка события ОбработкаВыбора в форме-владельце. Она срабатывает, когда пользователь делает выбор в открытой форме выбора, и не требует описания оповещения.

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

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

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

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

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

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

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

Открытие формы
Норма

Форма появляется без ошибок, отображает ожидаемые данные

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

Ошибка «Форма не найдена» или пустая форма без данных

Передача параметров
Норма

Отбор, заполнение или настройки применились

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

Параметры проигнорированы, форма открылась в состоянии по умолчанию

Возврат результата
Норма

Оповещение срабатывает, результат обрабатывается

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

После закрытия ничего не происходит — не задан владелец или оповещение

Повторное открытие
Норма

Активизируется уже открытая форма или создаётся новая по уникальному ключу

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

Открываются десятки одинаковых окон при повторном вызове

Часто задаваемые вопросы

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

Передайте в параметрах структуру с ключом «Отбор», значением которого является ещё одна структура: поле отбора и значение. Например: Новый Структура("Отбор", Новый Структура("Контрагент", СсылкаНаКонтрагента)). Форма списка автоматически применит отбор при открытии.

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

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

Как открыть форму и дождаться её закрытия без модальности?

Используйте описание оповещения: передайте в ОткрытьФорму() объект ОписаниеОповещения с именем процедуры-обработчика. Код продолжения размещается в этой процедуре. Для цепочек вызовов удобно применять асинхронные методы с ключевыми словами Ждать и Асинх, если версия платформы их поддерживает.

Почему ОткрытьФорму() открывает уже существующее окно вместо нового?

По умолчанию уникальность формы определяется именем и ключом. Если нужна отдельная копия формы при каждом вызове, передайте в параметр уникальности новый уникальный идентификатор: ОткрытьФорму(ИмяФормы, Параметры, Владелец, Новый УникальныйИдентификатор).

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

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

Чем отличается ОткрытьЗначение() от ОткрытьФорму() с ключом?

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

Итог

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

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