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

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

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

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

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

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

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

Способ 1. ОткрытьЗначение — самый простой вариант

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

&НаКлиенте

Процедура ОткрытьДокумент(Команда)

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

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

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

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

Способ 2. ОткрытьФорму с параметрами — полный контроль

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

&НаКлиенте

Процедура ОткрытьДокументСПараметрами(Команда)

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

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

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

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

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

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

Уникальность и предотвращение дублей

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

Блокировка окна владельца или всего интерфейса

Последний параметр — РежимОткрытияОкна — определяет, будет ли форма блокировать родительское окно или весь интерфейс. Например:

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

ПараметрыФормы, ЭтотОбъект, , , , ,

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

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

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

Способ 3. Открытие нового документа с заполнением

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

&НаКлиенте

Процедура СоздатьНаОсновании(Команда)

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

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

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

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);

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

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

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

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

Получение результата: оповещение о закрытии

Часто после закрытия открытого документа нужно обновить список, перечитать данные или продолжить алгоритм. Для этого в ОткрытьФорму() передаётся описание оповещения:

&НаКлиенте

Процедура ОткрытьСОповещением(Команда)

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

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

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

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

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

&НаКлиенте

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

Элементы.СписокДокументов.Обновить();

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

Обработчик оповещения обязательно объявляется с ключевым словом Экспорт, иначе платформа не сможет его вызвать. Параметр Результат содержит значение, которое форма вернула через Закрыть(Значение), или Неопределено, если форму просто закрыли.

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

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

Сравнение способов и выбор подходящего

Каждый механизм решает свой круг задач. Сводная таблица поможет быстро выбрать вариант под конкретный сценарий.

СпособКогда применятьОграничения
ОткрытьЗначениеБыстро показать существующий объект по ссылкеНет параметров, нет оповещения о закрытии, только основная форма
ОткрытьФорму с КлючОткрытие с параметрами, блокировкой, оповещениемТребует точного имени формы
ОткрытьФорму с ЗначенияЗаполненияНовый документ с предзаполнениемНе заполняет табличные части
ПоказатьЗначениеАсинхронный вариант показа значения с оповещениемЧуть более громоздкий синтаксис
ПерейтиПоНавигационнойСсылкеОткрытие по ссылке вида e1cib, из внешних механизмовТребует корректной навигационной ссылки

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

ОткрытьЗначение

Одна строка кода, автоматическая уникальность. Не подходит, если нужны параметры или реакция на закрытие.

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

Максимальная гибкость: параметры, владелец, блокировка, оповещение. Требует аккуратности с именем формы и порядком аргументов.

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

Асинхронный аналог ОткрытьЗначение с поддержкой оповещения. Полезен в коде, уже построенном на асинхронных вызовах.

Типичные ошибки и как их избежать

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

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

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

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

Проверка результата и особенности в веб-клиенте

После внедрения кода проверьте сценарий в том клиенте, где будут работать пользователи. В веб-клиенте блокирующие окна открываются как всплывающие, и браузер может блокировать их, если открытие инициировано не действием пользователя (например, из обработчика ожидания). В таких случаях открытие следует привязывать к команде или клику.

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

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

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

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

Активируется уже открытое окно документа

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

Открывается второй экземпляр той же формы

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

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

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

Поля пустые или заполняются с задержкой после открытия

Оповещение о закрытии
Норма

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

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

Обработчик не вызывается или срабатывает несколько раз

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

При отсутствии прав — корректное сообщение платформы

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

Необработанное исключение и прерывание сценария

Итог

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

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

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

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

Получите текущую строку списка через Элементы.Список.ТекущиеДанные или Элементы.Список.ТекущаяСтрока (это ссылка), затем вызовите ОткрытьЗначение() или ОткрытьФорму() с параметром Ключ. Предварительно проверьте, что строка выбрана, иначе откроется форма нового объекта или возникнет ошибка.

Можно ли открыть документ в режиме «только просмотр»?

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

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

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

Чем ОткрытьЗначение отличается от ПоказатьЗначение?

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

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

Стандартного параметра для этого нет. Передайте собственный параметр, например ПараметрыФормы.Вставить("ИмяСтраницы", "ГруппаТовары"), а в обработчике ПриСозданииНаСервере формы документа установите Элементы.Страницы.ТекущаяСтраница по значению параметра.

Почему ОткрытьФорму возвращает Неопределено?

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