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

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

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

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

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

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

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

Какие способы открытия формы документа существуют

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

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

Сравнение вариантов

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

Полный контроль: параметры, владелец, уникальность, режим окна. Подходит для большинства сценариев доработки.

ПоказатьЗначение()

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

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

Блокирует интерфейс до закрытия формы. Работает только при включённом режиме модальных вызовов, в тонком и веб-клиенте ограничен.

ПолучитьФорму()

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

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

Чтобы открыть форму уже записанного документа, в параметры передают структуру с ключом Ключ, содержащим ссылку на объект. Имя формы формируется по шаблону: Документ.ИмяДокумента.Форма.ФормаДокумента. Если у документа несколько форм, указывают конкретную; если основная форма одна, можно использовать полное имя объекта.

Пример типового вызова из формы списка или обработки:

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

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

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

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

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

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

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

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

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

ЗначенияЗаполнения.Вставить("Контрагент", ВыбранныйКонтрагент);

ЗначенияЗаполнения.Вставить("Основание", ДокументОснование);

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

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

ОткрытьФорму("Документ.СчетНаОплатуПокупателю.ФормаОбъекта", ПараметрыФормы);

Важно понимать: документ при этом ещё не записан в базу. Если пользователь закроет форму без записи, данные будут потеряны. Если требуется гарантированно создать объект, сначала программно создают и записывают документ через Документы.ИмяДокумента.СоздатьДокумент(), а затем открывают форму по полученной ссылке.

Параметры владельца, уникальности и режима окна

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

Параметр Уникальность управляет повторным открытием. Если передать Истина или произвольный ключ уникальности, повторный вызов с тем же ключом не создаст вторую копию формы, а активирует уже открытую. Это полезно для команд «показать документ», чтобы пользователь не накапливал десятки одинаковых окон.

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

Порядок действий для открытия формы с обратной связью
  1. 1
    Сформируйте структуру параметров: Ключ для существующего документа или ЗначенияЗаполнения для нового.
  2. 2
    Укажите текущую форму владельцем: ОткрытьФорму(ИмяФормы, ПараметрыФормы, ЭтотОбъект).
  3. 3
    Задайте Уникальность, чтобы избежать дублирования окон.
  4. 4
    В форме-владельце объявите обработчик ОбработкаОповещения(ИмяСобытия, Параметр, Источник).
  5. 5
    В открываемой форме при нужном событии вызовите Оповестить(ИмяСобытия, Данные, Владелец).
  6. 6
    Проверьте: при закрытии дочерней формы владелец получает оповещение и обновляет данные.

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

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

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

В модулях форм разделяйте директивы компиляции: &НаКлиенте — для открытия форм и работы с интерфейсом, &НаСервере — для запросов и обращения к данным. Нарушение этого правила приводит к ошибкам вида «Процедура или функция с указанным именем не определена» или «Интерактивные операции недоступны».

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

Особенности обычного приложения и управляемых форм

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

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

ФормаДокумента.Открыть();

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

Проверка результата и диагностика проблем

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

Если форма не открывается, первичная диагностика: точное имя формы в конфигураторе, тип значения в параметре Ключ, контекст вызова (клиент или сервер), наличие права «Просмотр» на документ. Ошибки платформы обычно содержат достаточно информации, чтобы локализовать причину без отладчика, но при неочевидном поведении полезно поставить точку останова перед вызовом и проверить содержимое параметров.

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

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

Форма открывается
Норма

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

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

Ошибка «Форма не найдена» или «Интерактивные операции недоступны»

Данные документа
Норма

В форме отображаются реквизиты именно того документа, ссылка на который передана

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

Открывается пустая форма нового документа — значит, Ключ не содержит ссылку

Заполнение нового документа
Норма

Реквизиты из ЗначенияЗаполнения подставлены в поля формы

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

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

Повторный вызов
Норма

При заданной Уникальности активируется уже открытое окно

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

Открывается второе окно того же документа

Маршрут решения

Как выбрать действие

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

Часто задаваемые вопросы

Как открыть форму документа по нажатию кнопки в форме списка?

Создайте команду формы, назначьте её кнопке и в клиентском обработчике получите текущую строку списка: ТекущиеДанные = Элементы.Список.ТекущиеДанные. Проверьте, что строка выбрана, затем вызовите ОткрытьФорму() с параметром Ключ, равным ТекущиеДанные.Ссылка. Если строка не выбрана, покажите предупреждение вместо открытия формы.

Почему ОткрытьФорму() выдаёт ошибку «Интерактивные операции недоступны»?

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

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

Используйте ОткрытьФорму() с последним параметром — описанием оповещения: Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект). В открываемой форме передайте результат через Закрыть(Результат). Указанная процедура выполнится после закрытия формы и получит возвращённое значение.

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

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

Чем отличается параметр Ключ от ЗначенияЗаполнения?

Ключ указывает на существующий объект базы данных — форма откроет его для просмотра или редактирования. ЗначенияЗаполнения применяется при создании нового объекта: структура передаётся в обработку заполнения, документ при этом ещё не записан. Передавать оба параметра одновременно бессмысленно — Ключ имеет приоритет.

Как открыть форму документа из внешней обработки?

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

Итог

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

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