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