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

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

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

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

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

Ключевой момент: ссылка (тип СправочникСсылка, ДокументСсылка и т.д.) — это лишь идентификатор объекта, а не сама форма. Чтобы показать объект пользователю, платформа должна построить форму и связать её с данными по этой ссылке. В управляемом приложении за это отвечают методы ОткрытьЗначение() и ОткрытьФорму() с параметром «Ключ», в обычном — ПолучитьФорму().

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

Что такое ссылка и почему её недостаточно для открытия формы

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

В управляемом приложении форма создаётся на сервере и отображается на клиенте, поэтому платформа требует явного клиентского вызова. В обычном приложении форма строится целиком на клиенте, и метод ПолучитьФорму() доступен прямо у ссылки. Понимание этой разницы снимает большинство вопросов «почему код не работает».

Открытие формы в управляемом приложении через ОткрытьЗначение

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

&НаКлиенте

Процедура ПоказатьКонтрагента(Команда)

ОткрытьЗначение(КонтрагентСсылка);

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

Если переменная КонтрагентСсылка заполнена и объект существует в базе, откроется его основная форма. Если ссылка пустая или «битая» (объект удалён непосредственным удалением), метод либо ничего не сделает, либо покажет ошибку. Поэтому перед вызовом полезно проверять заполненность ссылки.

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

Порядок действий при открытии через ОткрытьЗначение
  1. 1
    Убедитесь, что код выполняется в клиентском контексте (&НаКлиенте)
  2. 2
    Проверьте, что ссылка заполнена: ЗначениеЗаполнено(Ссылка)
  3. 3
    Вызовите ОткрытьЗначение(Ссылка)
  4. 4
    Проверьте, что открылась форма именно нужного объекта — сверьте наименование или номер

Открытие формы с параметрами через ОткрытьФорму

Когда нужен контроль над открытием, используют ОткрытьФорму() с параметром «Ключ». Имя формы указывают в полном виде: "Справочник.Контрагенты.ФормаОбъекта" или "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента".

&НаКлиенте

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

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

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

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

Параметр «Ключ» — стандартный: платформа сама понимает, что форму нужно заполнить данными объекта по этой ссылке. Дополнительно в структуру можно добавить собственные параметры, которые форма обработает в событии ПриСозданииНаСервере.

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

&НаКлиенте

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

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

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

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

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

bsl
ПараметрыФормы = Новый Структура("Ключ", СсылкаНаОбъект);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);

Открытие формы в обычном приложении

В обычных формах (режим «Обычное приложение») у ссылки есть метод ПолучитьФорму(). Он возвращает форму объекта, которую затем открывают методом Открыть() или ОткрытьМодально().

Процедура ПоказатьОбъект(Кнопка)

ФормаОбъекта = СсылкаНаОбъект.ПолучитьФорму();

ФормаОбъекта.Открыть();

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

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

Сравнение способов открытия формы

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

Простейший вызов, работает в обоих режимах. Нет параметров и оповещения о закрытии.

ОткрытьФорму с ключом

Управляемое приложение. Полный контроль: параметры, владелец, оповещение о закрытии.

Ссылка.ПолучитьФорму()

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

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

Открытие по строке навигационной ссылки, удобно для гиперссылок и внешних переходов.

Открытие объекта по навигационной ссылке

Навигационная ссылка — текстовое представление пути к объекту, которое можно получить командой «Получить ссылку» в интерфейсе или методом ПолучитьНавигационнуюСсылку(). Открыть объект по ней можно методом ПерейтиПоНавигационнойСсылке() на клиенте.

&НаКлиенте

Процедура ПерейтиКОбъекту(Команда)

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

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

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

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

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

После открытия убедитесь, что форма показывает именно тот объект: сверьте ключевые реквизиты — наименование, номер, дату. Если открылась пустая форма нового объекта, почти всегда причина в том, что параметр «Ключ» не передан или передан с ошибкой в имени (например, «ключ» с маленькой буквы в структуре — имена ключей структуры регистронезависимы, но опечатка в слове приведёт к тому, что платформа не распознает параметр).

Частая проблема — вызов клиентских методов в серверном контексте. Директива &НаСервере не имеет доступа к ОткрытьФорму() и ОткрытьЗначение(): код либо не скомпилируется, либо завершится ошибкой выполнения. Логику получения данных держите на сервере, а открытие формы — на клиенте.

Типичные ошибки
01
Вызов ОткрытьФорму в серверной процедуре — ошибка компиляции или выполнения, форма не открывается
02
Передача пустой или битой ссылки — открывается пустая форма или возникает ошибка «Объект не найден»
03
Неверное имя формы в ОткрытьФорму — ошибка «форма не найдена»; используйте полное имя вида Справочник.Имя.ФормаОбъекта
04
Ожидание, что ОткрытьЗначение вернёт результат — метод не возвращает форму, для контроля нужен ОткрытьФорму с оповещением
Контрольные точки

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

Заполненность ссылки перед вызовом
Норма

ЗначениеЗаполнено(Ссылка) возвращает Истина

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

Ссылка пустая — форма откроется для нового объекта или не откроется

Содержимое открытой формы
Норма

Реквизиты соответствуют ожидаемому объекту

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

Форма пустая или показывает другой объект — проверьте параметр Ключ

Контекст выполнения
Норма

Открытие вызывается в процедуре &НаКлиенте

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

Вызов в &НаСервере — перенесите открытие на клиент

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

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

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

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

Используйте ОткрытьФорму с параметром «Отбор»: ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Контрагент", СсылкаНаКонтрагента)); затем ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", ПараметрыФормы). Список откроется уже отфильтрованным.

Почему ОткрытьЗначение ничего не открывает и не выдаёт ошибку?

Чаще всего передана пустая ссылка — метод молча завершается. Добавьте проверку ЗначениеЗаполнено(Ссылка) перед вызовом. Также проверьте, что код действительно выполняется: поставьте точку останова или вывод сообщения перед вызовом.

Как открыть объект, если известен только его уникальный идентификатор?

Сконструируйте ссылку: Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)); затем проверьте существование объекта запросом или через Ссылка.ПолучитьОбъект() с обработкой исключения, и только потом открывайте форму на клиенте.

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

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

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

Скопируйте навигационную ссылку (команда «Получить ссылку» в форме объекта), затем в главном меню выберите «Перейти по ссылке» (или аналогичную команду в меню «Ещё»), вставьте строку и подтвердите — платформа откроет форму нужного объекта.

Итог

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

В управляемом приложении используйте ОткрытьЗначение(Ссылка) для простых случаев и ОткрытьФорму с параметром «Ключ» — когда нужны параметры и оповещение. В обычном приложении подойдёт Ссылка.ПолучитьФорму(). Все вызовы выполняйте только на клиенте и проверяйте заполненность ссылки заранее.