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

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

1С управляемые формы: как открыть форму по ссылке

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

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

Ключевой момент: ссылка в 1С — это не форма и не объект, а лишь идентификатор записи в базе. Чтобы показать пользователю карточку элемента, платформа должна по этой ссылке найти нужную форму, создать её и заполнить данными. В управляемом приложении эту работу можно переложить на платформу, а можно управлять процессом вручную — с проверками прав, блокировками и обработкой результата.

Как платформа находит форму по ссылке

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

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

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

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

&НаКлиенте

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

СсылкаНаЭлемент = Элементы.Список.ТекущиеДанные.Ссылка;

Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда

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

КонецЕсли;

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

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

Способ 2. ОткрытьФорму с параметром Ключ

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

&НаКлиенте

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

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

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

ПараметрыФормы);

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

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

Дополнительные параметры метода позволяют задать владельца формы, уникальность, окно и режим открытия:

ОткрытьФорму("Документ.ЗаказКлиента.Форма.ФормаДокумента",

ПараметрыФормы,

ЭтотОбъект, // владелец

ДокументСсылка, // ключ уникальности

, // окно

, // навигационная ссылка

, // описание оповещения о закрытии

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

Способ 3. Навигационная ссылка и ПерейтиПоНавигационнойСсылке

У каждого объекта есть постоянная навигационная ссылка вида e1cib/data/Документ.РеализацияТоваровУслуг?ref=.... Её можно получить функцией ПолучитьНавигационнуюСсылку(Ссылка) и открыть методом ПерейтиПоНавигационнойСсылке():

&НаКлиенте

Процедура ОткрытьПоНавигационной(Команда)

НавСсылка = ПолучитьНавигационнуюСсылку(ОбъектСсылка);

ПерейтиПоНавигационнойСсылке(НавСсылка);

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

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

Модальное открытие и обработка результата

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

&НаКлиенте

Процедура ОткрытьСРезультатом(Команда)

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

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

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента",

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

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

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

&НаКлиенте

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

Если Результат <> Неопределено Тогда

// обработка возвращённого значения

КонецЕсли;

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

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

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

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

Проверки, права и типичные ошибки

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

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

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

Сравнение способов и выбор под задачу

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

Как выбрать способ

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

Проверка результата

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

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

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

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

Что открывается при вызове
Норма

Карточка именно того объекта, ссылка которого передана

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

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

Повторный вызов при открытой форме
Норма

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

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

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

Пустая ссылка
Норма

Код не выполняет открытие, пользователь видит понятное сообщение

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

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

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

Как открыть форму списка с отбором по ссылке?

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

Можно ли открыть форму по ссылке на сервере?

Нет. Открытие форм — исключительно клиентская операция. На сервере можно только подготовить данные: проверить существование объекта, получить имя формы, сформировать параметры. Сам вызов ОткрытьЗначение или ОткрытьФорму выполняется в клиентском контексте.

Чем ОткрытьФормуМодально отличается от ОткрытьФорму с оповещением?

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

Как открыть форму, если известен только тип объекта, а форма не основная?

Укажите полное имя нужной формы явно, например "Документ.Заказ.Форма.ФормаПечати" — платформа откроет именно её. Имя формы можно получить на сервере через метаданные или зашить в коде, если форма фиксирована.

Почему ОткрытьЗначение не открывает форму записи регистра сведений?

Для регистров сведений ссылка как таковая отсутствует — запись идентифицируется ключом записи (набором измерений). Для открытия формы записи нужно сформировать РегистрСведенийКлючЗаписи и передать его в параметр Ключ формы записи.

Итог

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

Для простого показа объекта по ссылке достаточно ОткрытьЗначение. Для управляемого открытия используйте ОткрытьФорму: ссылка передаётся в стандартном параметре Ключ, владелец и ключ уникальности защищают от дублирования окон, а описание оповещения позволяет обработать результат закрытия. Всегда проверяйте заполненность ссылки и существование объекта перед открытием.