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

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

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

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

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

Ключевой момент — правильно указать имя формы. Для документов оно строится по шаблону Документ.<ИмяДокумента>.Форма.<ИмяФормы>, где вместо имени конкретной формы обычно указывают стандартное ФормаДокумента — основную форму объекта. Если форма назначена в конфигураторе как форма по умолчанию, её имя можно не уточнять, но явное указание делает код устойчивее к изменениям конфигурации.

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

Как устроено имя формы документа

Любая форма в 1С адресуется полным именем, которое включает тип объекта метаданных, имя объекта и имя формы. Для документа «РеализацияТоваровУслуг» полное имя основной формы выглядит так: Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента. Если у объекта несколько форм, в конфигураторе одна из них назначается формой по умолчанию — тогда её можно вызвать и по сокращённому пути Документ.РеализацияТоваровУслуг.ФормаОбъекта.

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

Открытие формы существующего документа

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

ОткрытьЗначение(СсылкаНаДокумент);

Более гибкий вариант — ОткрытьФорму() с явным указанием имени формы и параметра Ключ. Так можно открыть конкретную, не основную форму объекта:

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

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

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

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

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

Открытие формы нового документа и заполнение данными

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

Часто требуется предзаполнить реквизиты — например, создать документ на основании другого. Для этого в параметры передают структуру ЗначенияЗаполнения или параметр Основание:

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);

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

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаОбъекта", ПараметрыФормы);

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

Дополнительные параметры метода ОткрытьФорму

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

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

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

Новый УникальныйИдентификатор, , , ,

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

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

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

Быстро и универсально, но открывает только форму по умолчанию и не позволяет передать параметры.

ОткрытьФорму() с Ключ

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

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

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

Модальное открытие и ожидание результата

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

Результат = ОткрытьФормуМодально("Документ.ЗаказКлиента.ФормаВыбора");

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

// обработка выбранного документа

КонецЕсли;

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

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

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

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

Результат закрытия придёт в указанную процедуру ПослеВыбораДокумента первым параметром. Такой код работает во всех клиентах и соответствует современным требованиям платформы.

Открытие формы списка с отбором

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

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

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

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

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

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

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

Типичные ошибки и их диагностика

Чаще всего проблемы связаны с неверным именем формы, отсутствием прав или неправильной передачей параметров. Ошибка «Форма не найдена» почти всегда означает опечатку в пути или отсутствие формы с таким именем у объекта. Ошибка «Недостаточно прав» возникает, когда у пользователя нет права интерактивного доступа к документу — программное открытие формы не обходит ролевую модель.

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

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

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

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

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

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

Открытие существующего документа
Норма

Форма открылась, в полях данные нужного документа

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

Открылась пустая форма нового документа — ключ не передан

Права пользователя
Норма

Форма открывается под рабочей ролью

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

Ошибка «Нарушение прав доступа» — проверить роли на документ

Предзаполнение реквизитов
Норма

Организация, склад и другие поля заполнены

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

Поля пустые — обработчик заполнения не обрабатывает ключи

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

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

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

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

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

Почему ОткрытьЗначение() не открывает документ в веб-клиенте?

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

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

Откройте форму выбора с описанием оповещения о закрытии: ОткрытьФорму("Документ.Имя.ФормаВыбора", , Владелец, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца). Выбранная ссылка придёт в процедуру оповещения как результат закрытия.

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

Да. По умолчанию платформа активирует уже открытое окно, но если передать в параметр Уникальность новый уникальный идентификатор, будет создан второй независимый экземпляр формы того же объекта.

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

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

Итог

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

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