В процессе разработки конфигураций и внешних обработок на платформе 1С:Предприятие 8.3 регулярно возникает задача открыть форму существующего документа, имея в наличии только ссылку на него. При переходе на управляемые формы и отказе от модальности разработчики сталкиваются с вопросами правильного выбора методов платформы: когда достаточно показать значение, а когда требуется тонкая настройка параметров через вызов ОткрытьФорму. Разберем различные способы решения этой задачи, выясним особенности передачи параметров и научимся избегать распространенных ошибок.
Если нам требуется просто открыть для пользователя основную форму документа (ту, которая назначена в метаданных по умолчанию), платформа предоставляет специализированный метод глобального контекста. В режиме отказа от модальности для этого используется процедура ПоказатьЗначение, заменившая устаревший метод ОткрытьЗначение.
Рассмотрим синтаксис и пример использования:
// Пример простого открытия основной формы документа
ПоказатьЗначение(, СсылкаНаДокумент);
Проанализируем нюансы данного подхода:
ТолькоПросмотр).Когда требуется открыть неосновную форму, гибко управлять поведением формы или передать дополнительные параметры, мы используем метод ОткрытьФорму. Чтобы платформа поняла, что открывается именно существующий объект из базы данных, а не создается новый документ, критически важно передать предопределенный параметр Ключ.
Посмотрим на пример открытия основной формы объекта конкретного документа:
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
Обратите внимание на структуру параметров: если передать произвольное имя ключа (например, СсылкаНаДокумент вместо Ключ), управляемая форма не свяжется с существующей записью и откроется как новый, незаполненный документ.
Довольно часто в документах создается несколько форм: дополнительная форма для быстрого просмотра, специализированная форма для согласования или внутренняя сервисная форма. Чтобы открыть конкретную форму, мы указываем полный путь к ней в метаданных.
Разберем по шагам, как обратиться к неосновной форме:
// Открываем дополнительную форму "ФормаСогласования"
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаСогласования", ПараметрыФормы);
Если имя метаданных документа заранее неизвестно (например, при написании универсального алгоритма обработки ссылок различных типов), путь к форме формируется динамически:
// Формирование имени формы на основе метаданных ссылки
ИмяДокумента = СсылкаНаДокумент.Метаданные().Имя;
ИмяФормы = "Документ." + ИмяДокумента + ".Форма.ФормаСогласования";
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму(ИмяФормы, ПараметрыФормы);
По умолчанию каждый повторный вызов ОткрытьФорму может приводить к открытию нового дублирующего окна формы одного и того же объекта. Чтобы избежать захламления рабочего пространства пользователя, платформе следует передать признак уникальности.
Рассмотрим подробнее использование параметров метода ОткрытьФорму:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина); // Открытие без возможности редактирования
// 4-й параметр метода ОткрытьФорму - Уникальность
// Передаем саму ссылку в качестве ключа уникальности
ОткрытьФорму(
"Документ.РеализацияТоваровУслуг.ФормаОбъекта",
ПараметрыФормы,
ЭтотОбъект,
СсылкаНаДокумент
);
В данном случае, если форма документа уже открыта на рабочем столе пользователя, платформа не станет создавать дублирующее окно, а просто активирует и выведет на передний план уже открытую форму.
Важно помнить: при программном открытии форм система проверяет права текущего пользователя на интерактивные действия (права «Чтение» и «Интерактивное открытие»). Если у пользователя отсутствуют необходимые права к документу, вызов методов приведет к исключению времени выполнения, поэтому для безопасного вызова в универсальных интерфейсах рекомендуется предварительно проверять права доступа через функцию ПравоДоступа на стороне сервера.