Разработка и Конфигурация · 12 мин
Как программно открыть документ в управляемых формах 1С
Как программно открыть документ в управляемых формах 1С: ОткрытьЗначение, ОткрытьФорму, параметры формы, модальность, открытие из списка и обработка результата.
Программное открытие документа — одна из самых частых задач при доработке конфигураций на управляемых формах. В отличие от обычных форм, где работал метод Открыть() у объекта формы, в управляемом интерфейсе действуют другие механизмы: глобальный метод ОткрытьЗначение(), универсальный ОткрытьФорму() и навигационные ссылки.
Выбор способа зависит от контекста: есть ли у вас ссылка на документ, нужно ли открывать форму модально, требуется ли передать параметры или получить результат после закрытия формы. Ошибка в выборе механизма приводит либо к предупреждениям о модальности, либо к открытию дублей одной и той же формы.
Ниже разобраны рабочие варианты с примерами кода, условиями применения, типичными ошибками и способами проверки результата. Все примеры актуальны для управляемого приложения и тонкого/веб-клиента.
Способ 1. ОткрытьЗначение — самый простой вариант
Если у вас есть ссылка на существующий документ и не требуется ничего, кроме показа формы пользователю, достаточно одной строки:
&НаКлиенте
Процедура ОткрытьДокумент(Команда)
ОткрытьЗначение(СсылкаНаДокумент);
КонецПроцедуры
Метод ОткрытьЗначение() сам определяет тип переданного значения и открывает основную форму объекта. Он работает и для документов, и для элементов справочников, и для записей регистров. Платформа следит за уникальностью: повторный вызов с той же ссылкой активирует уже открытое окно, а не создаёт дубль.
Ограничения способа: нельзя передать параметры, нельзя указать конкретную (не основную) форму, нельзя получить оповещение о закрытии. Если хоть одно из этих требований есть — переходите к ОткрытьФорму().
Способ 2. ОткрытьФорму с параметрами — полный контроль
Универсальный метод ОткрытьФорму() позволяет указать имя формы, параметры, владельца, уникальность и режим блокировки. Открытие конкретного документа по ссылке выглядит так:
&НаКлиенте
Процедура ОткрытьДокументСПараметрами(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
Параметр Ключ — это и есть ссылка на объект, который форма должна открыть. Без него откроется форма нового документа. Имя формы можно указывать полностью (ФормаОбъекта) или опустить — тогда платформа возьмёт основную форму, назначенную в конфигураторе.
Полный синтаксис метода включает дополнительные аргументы: владелец формы, уникальность, окно, навигационная ссылка, описание оповещения о закрытии, режим открытия окна. Разберём самые востребованные из них.
Уникальность и предотвращение дублей
Четвёртый параметр — Уникальность. Если передать Истина или произвольный ключ, платформа не допустит открытия второй формы с тем же ключом. По умолчанию для форм объектов уникальность обеспечивается самой ссылкой, но для произвольных форм этот параметр стоит задавать явно.
Блокировка окна владельца или всего интерфейса
Последний параметр — РежимОткрытияОкна — определяет, будет ли форма блокировать родительское окно или весь интерфейс. Например:
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта",
ПараметрыФормы, ЭтотОбъект, , , , ,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Блокировка окна владельца уместна, когда документ открывается из другой формы и пользователь не должен менять родительские данные до завершения работы. Блокировать весь интерфейс следует только в исключительных случаях — это ухудшает ergonomику и часто критикуется при ревью кода.
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект);Способ 3. Открытие нового документа с заполнением
Чтобы открыть форму нового документа с предзаполненными реквизитами, параметр Ключ не передают. Вместо него используют ЗначенияЗаполнения:
&НаКлиенте
Процедура СоздатьНаОсновании(Команда)
ЗначенияЗаполнения = Новый Структура;
ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);
ЗначенияЗаполнения.Вставить("Склад", ОсновнойСклад);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);
ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
Значения из структуры попадут в реквизиты нового документа до вызова обработчика ОбработкаЗаполнения на сервере. Если нужно создать документ на основании другого объекта, используйте параметр Основание — тогда сработает стандартный механизм ввода на основании, если он предусмотрен конфигурацией.
Не пытайтесь заполнить табличные части через ЗначенияЗаполнения — стандартный механизм их не обрабатывает. Для сложного заполнения либо расширяйте ОбработкаЗаполнения в модуле объекта, либо передавайте собственный параметр и разбирайте его в обработчике ПриСозданииНаСервере формы.
Получение результата: оповещение о закрытии
Часто после закрытия открытого документа нужно обновить список, перечитать данные или продолжить алгоритм. Для этого в ОткрытьФорму() передаётся описание оповещения:
&НаКлиенте
Процедура ОткрытьСОповещением(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияДокумента", ЭтотОбъект);
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта",
ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияДокумента(Результат, ДополнительныеПараметры) Экспорт
Элементы.СписокДокументов.Обновить();
КонецПроцедуры
Обработчик оповещения обязательно объявляется с ключевым словом Экспорт, иначе платформа не сможет его вызвать. Параметр Результат содержит значение, которое форма вернула через Закрыть(Значение), или Неопределено, если форму просто закрыли.
Альтернатива — глобальные оповещения через Оповестить() и обработчик ОбработкаОповещения в форме-владельце. Этот подход удобен, когда на одно событие подписано несколько форм, но для парной связи «открыл — обработал закрытие» описание оповещения предпочтительнее: оно не создаёт лишних связей между формами.
- 1Определите, есть ли ссылка на существующий документ или нужно создать новый
- 2Для простого показа вызовите ОткрытьЗначение(Ссылка) в клиентской процедуре
- 3Если нужны параметры — сформируйте структуру с Ключ или ЗначенияЗаполнения и вызовите ОткрытьФорму
- 4При необходимости реакции на закрытие создайте ОписаниеОповещения и экспортный обработчик
- 5Проверьте результат: форма открылась, реквизиты заполнены, дублей нет
Сравнение способов и выбор подходящего
Каждый механизм решает свой круг задач. Сводная таблица поможет быстро выбрать вариант под конкретный сценарий.
| Способ | Когда применять | Ограничения |
|---|---|---|
| ОткрытьЗначение | Быстро показать существующий объект по ссылке | Нет параметров, нет оповещения о закрытии, только основная форма |
| ОткрытьФорму с Ключ | Открытие с параметрами, блокировкой, оповещением | Требует точного имени формы |
| ОткрытьФорму с ЗначенияЗаполнения | Новый документ с предзаполнением | Не заполняет табличные части |
| ПоказатьЗначение | Асинхронный вариант показа значения с оповещением | Чуть более громоздкий синтаксис |
| ПерейтиПоНавигационнойСсылке | Открытие по ссылке вида e1cib, из внешних механизмов | Требует корректной навигационной ссылки |
Сравнение вариантов
Одна строка кода, автоматическая уникальность. Не подходит, если нужны параметры или реакция на закрытие.
Максимальная гибкость: параметры, владелец, блокировка, оповещение. Требует аккуратности с именем формы и порядком аргументов.
Асинхронный аналог ОткрытьЗначение с поддержкой оповещения. Полезен в коде, уже построенном на асинхронных вызовах.
Типичные ошибки и как их избежать
Первая частая ошибка — использование устаревшего модального метода ОткрытьМодально(). В современных конфигурациях режим использования модальности обычно запрещён в свойствах конфигурации, и вызов приводит к ошибке. Заменяйте его на ОткрытьФорму() с описанием оповещения.
Вторая ошибка — попытка открыть форму из серверного кода или из обработчика ожидания без клиентского контекста. Открытие форм возможно только на клиенте. Если решение об открытии принимается на сервере, верните признак и ссылку в клиентскую процедуру и открывайте форму там.
Третья ошибка — передача в параметр Ключ объекта ДокументОбъект вместо ссылки. Форма ожидает именно ссылку. Четвёртая — открытие документа, на который у пользователя нет прав: платформа покажет ошибку нарушения прав доступа. Перед открытием из критичных сценариев полезно проверять доступность объекта, например, через функциональные опции или попытку чтения в привилегированном контексте с осмысленной обработкой отказа.
Проверка результата и особенности в веб-клиенте
После внедрения кода проверьте сценарий в том клиенте, где будут работать пользователи. В веб-клиенте блокирующие окна открываются как всплывающие, и браузер может блокировать их, если открытие инициировано не действием пользователя (например, из обработчика ожидания). В таких случаях открытие следует привязывать к команде или клику.
Контрольные признаки корректной работы: форма открывается с нужным документом, повторный вызов активирует то же окно, обработчик оповещения срабатывает один раз, у пользователя без прав появляется понятное сообщение, а не аварийное завершение сценария.
Как проверить результат
Активируется уже открытое окно документа
Открывается второй экземпляр той же формы
Реквизиты из ЗначенияЗаполнения подставлены до показа формы
Поля пустые или заполняются с задержкой после открытия
Обработчик вызывается ровно один раз после закрытия
Обработчик не вызывается или срабатывает несколько раз
При отсутствии прав — корректное сообщение платформы
Необработанное исключение и прерывание сценария
Что важно запомнить
Существующий документ открывайте через ОткрытьЗначение или ОткрытьФорму с параметром Ключ, новый — через ОткрытьФорму с ЗначенияЗаполнения. Реакцию на закрытие реализуйте через ОписаниеОповещения с экспортным обработчиком. Весь код открытия форм размещайте только на клиенте и избегайте устаревших модальных методов.
Частые вопросы
Как открыть документ из списка по кнопке в командной панели?
Получите текущую строку списка через Элементы.Список.ТекущиеДанные или Элементы.Список.ТекущаяСтрока (это ссылка), затем вызовите ОткрытьЗначение() или ОткрытьФорму() с параметром Ключ. Предварительно проверьте, что строка выбрана, иначе откроется форма нового объекта или возникнет ошибка.
Можно ли открыть документ в режиме «только просмотр»?
Да. Передайте в параметрах формы структуру с ключом ТолькоПросмотр и значением Истина: ПараметрыФормы.Вставить("ТолькоПросмотр", Истина). Форма объекта стандартно обрабатывает этот параметр и блокирует редактирование.
Как открыть документ из внешней обработки?
Механизм тот же: в клиентской процедуре формы обработки вызовите ОткрытьФорму() с полным именем формы документа. Убедитесь, что обработка запускается в управляемом приложении, иначе потребуется отдельная форма для обычного приложения.
Чем ОткрытьЗначение отличается от ПоказатьЗначение?
Функционально оба открывают форму значения, но ПоказатьЗначение() — асинхронный метод, принимающий описание оповещения о завершении. В коде, построенном на асинхронной модели, рекомендуется именно он; ОткрытьЗначение() проще и допустим там, где асинхронность не требуется.
Как открыть документ и сразу перейти на нужную вкладку формы?
Стандартного параметра для этого нет. Передайте собственный параметр, например ПараметрыФормы.Вставить("ИмяСтраницы", "ГруппаТовары"), а в обработчике ПриСозданииНаСервере формы документа установите Элементы.Страницы.ТекущаяСтраница по значению параметра.
Почему ОткрытьФорму возвращает Неопределено?
Метод возвращает ссылку на открытую форму, но при блокирующем или асинхронном сценарии полагаться на возвращаемое значение не всегда корректно. Если нужен результат работы пользователя с формой, получайте его через описание оповещения о закрытии, а не через возвращаемое значение.