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