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

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

Как программно открыть форму в 1С: практическое руководство

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

Открытие формы из кода — одна из самых частых задач при доработке конфигураций 1С. Программно открыть форму может понадобиться при создании собственных команд, обработке нажатий на гиперссылки, реализации подбора, запуске внешних обработок и десятках других сценариев. При этом у разработчика есть несколько методов, и выбор неправильного приводит к ошибкам «Форма не найдена», блокировке интерфейса или потере данных пользователя.

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

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

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

Метод ОткрытьФорму() — универсальный способ открыть любую форму: форму списка справочника, форму документа, форму отчёта, обработки или произвольную общую форму. Первый параметр — строковое имя формы, оно строится по шаблону <ТипОбъекта>.<ИмяОбъекта>.Форма.<ИмяФормы>. Если имя формы не указано, открывается форма по умолчанию для данного вида объекта.

// Открыть форму списка справочника

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

// Открыть форму конкретного документа

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

// Открыть общую форму

ОткрытьФорму("ОбщаяФорма.ФормаНастроек");

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

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

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

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

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

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

ПараметрыФормы.Вставить("РежимВыбора", Истина); // открыть в режиме выбора

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

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

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

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

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

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

Отбор = Новый Структура;

Отбор.Вставить("Контрагент", ВыбранныйКонтрагент);

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

ПараметрыФормы.Вставить("Отбор", Отбор);

ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.ФормаСписка", ПараметрыФормы);

Ограничение: отбор через параметры работает только по полям, доступным в основной таблице динамического списка, и устанавливается с видом сравнения «Равно» (для массива — «В списке»). Если нужен сложный отбор — по периоду, по условию «Содержит», по нескольким условиям с «ИЛИ» — придётся либо программно настраивать отбор в обработчике ПриСозданииНаСервере() формы списка, либо передавать настройки компоновки данных через параметр.

Получение результата: оповещения вместо модальных окон

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

&НаКлиенте

Процедура ВыбратьКонтрагента(Команда)

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

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

ПараметрыФормы.Вставить("РежимВыбора", Истина);

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

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

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

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

&НаКлиенте

Процедура ПослеВыбораКонтрагента(Результат, ДополнительныеПараметры) Экспорт

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

Объект.Контрагент = Результат;

КонецЕсли;

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

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

ОткрытьЗначение и другие специальные методы

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

// Открыть карточку объекта по ссылке

ПоказатьЗначение(, СсылкаНаДокумент); // современный вариант

// или

ОткрытьЗначение(СсылкаНаДокумент); // работает, но считается устаревающим

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

Сравнение способов открытия

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

Универсальный способ с параметрами и оповещениями. Подходит почти для всех сценариев в управляемом приложении.

ОткрытьЗначение / ПоказатьЗначение

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

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

Возвращает результат напрямую, но устарел: не работает в веб-клиенте, блокирует интерфейс. Только для legacy-кода.

Метод формы Открыть()

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

Открытие формы из расширения и внешнего кода

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

Из внешнего кода — например, из скрипта интеграции через COM-connector или HTTP-сервис — открыть интерактивную форму невозможно: серверный контекст не имеет пользовательского интерфейса. Если задача стоит «показать пользователю форму по событию извне», правильное решение — записать данные в базу и оповестить клиентские сеансы через механизм оповещений Оповестить() / ОбработкаОповещения() или через систему взаимодействия, а клиентское приложение уже откроет нужную форму.

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

Проверка результата и отладка

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

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

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

Форма открылась
Норма

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

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

Ошибка «Форма не найдена» — проверить строковое имя

Параметры переданы
Норма

В ПриСозданииНаСервере коллекция Параметры содержит значения

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

Параметр отсутствует — не объявлен в форме

Отбор в списке
Норма

Список показывает только нужные записи, отбор виден в настройках

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

Список полный — имя поля отбора не совпадает с полем запроса

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

Обработчик оповещения вызывается с выбранным значением

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

Обработчик не вызывается — форма закрывается без Закрыть(Значение)

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

Итог

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

Используйте ОткрытьФорму с параметрами-структурой и описанием оповещения для получения результата; ОткрытьЗначение — для быстрого показа объекта по ссылке. Собственные параметры объявляйте в форме явно. Модальные методы устарели и не работают в веб-клиенте.

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

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

Передайте в параметрах структуру ЗначенияЗаполнения с парами «имя реквизита — значение». Типовые формы объектов подставят эти значения при создании нового объекта. Альтернатива — параметр ЗначениеКопирования со ссылкой на документ-образец.

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

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

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

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

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

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

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

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

Чем отличается ПолучитьФорму от ОткрытьФорму?

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