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