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