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

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

Как в 1С получить ссылку на форму и работать с ней программно

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

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

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

Ниже разобраны основные способы получения и открытия форм в управляемом приложении, работа с навигационными ссылками, типичные ошибки и способы проверить результат. Примеры ориентированы на управляемые формы (толстый и тонкий клиент, веб-клиент); для обычных форм синтаксис отличается и отдельно оговорён.

Что именно вы хотите получить: три разные задачи

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

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

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

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

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", ДокументСсылка);

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

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

Открытие формы списка с отбором

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

Отбор = Новый Структура;

Отбор.Вставить("Контрагент", КонтрагентСсылка);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Отбор);

ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.ФормаСписка", ПараметрыФормы);

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

Получение формы как объекта через ПолучитьФорму

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

Форма = ПолучитьФорму("Обработка.МояОбработка.Форма.Форма");

Форма.ПараметрЗаполнения = "Нужное значение";

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

У функции четыре параметра: имя формы, структура параметров, владелец и ключ уникальности. Владелец связывает формы: при закрытии формы-владельца закроется и подчинённая. Ключ уникальности управляет повторным использованием: если форма с таким ключом уже открыта, вернётся существующий экземпляр, а не создастся новый. Это удобно, чтобы не плодить одинаковые окна.

Доступ к уже открытой форме

Чтобы найти форму, открытую ранее, вызывают ПолучитьФорму() с тем же именем и тем же ключом уникальности. Альтернатива — перебрать окна через ПолучитьОкна() и проверить содержимое каждого. Первый способ надёжнее, если ключ уникальности задан осознанно, например по ссылке на объект.

Навигационная ссылка на объект и форму

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

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

// Результат: e1cib/data/Документ.РеализацияТоваровУслуг?ref=...

Пользователь, получивший такую строку, вставляет её через команду «Перейти по ссылке» в главном меню клиента — откроется форма этого объекта. Для форм без привязки к данным (обработки, отчёты) навигационная ссылка строится иначе, через e1cib/app/Обработка.ИмяОбработки.

Ограничения: навигационная ссылка работает только внутри той же информационной базы; в другой базе тот же идентификатор либо не найдётся, либо укажет на другой объект. Также у пользователя должны быть права на просмотр объекта — иначе вместо формы он получит сообщение о нарушении прав доступа.

Сравнение вариантов

ОткрытьФорму()

Когда нужно просто показать форму пользователю. Не даёт доступа к форме как к объекту до её открытия.

ПолучитьФорму()

Когда нужно настроить форму перед показом или найти уже открытую. Требует аккуратности с ключом уникальности.

ПолучитьНавигационнуюСсылку()

Когда ссылку нужно передать другому пользователю или сохранить как строку. Не открывает ничего сама по себе.

Параметры формы и обработка их внутри формы

Кроме стандартных Ключ и Отбор, в форму можно передать произвольные параметры, если они объявлены в свойствах формы как параметры. В модуле формы они доступны через объект Параметры в обработчике ПриСозданииНаСервере:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("РежимПодбора") Тогда

ЭтотОбъект.Заголовок = "Подбор номенклатуры";

КонецЕсли;

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

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

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

Проверка результата и диагностика проблем

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

Ошибка «Форма не найдена» почти всегда означает неверное строковое имя: проверьте вид объекта, имя объекта и имя формы в конфигураторе. Ошибка прав доступа при открытии по навигационной ссылке означает, что у пользователя нет права «Просмотр» на объект — это решается настройкой ролей, а не кодом.

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

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

Форма объекта
Норма

Открылась форма с данными переданного объекта

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

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

Форма списка
Норма

Список отфильтрован, отбор виден пользователю

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

Полный список без отбора — поле недоступно для отбора или имя поля неверно

Навигационная ссылка
Норма

У коллеги открывается тот же объект

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

Ошибка прав или 'объект не найден' — другая база или нет прав

Итог

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

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

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

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

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

Можно ли получить форму из другой формы?

Да, если известны имя формы и ключ уникальности — вызовите ПолучитьФорму() с теми же значениями, и платформа вернёт существующий экземпляр. Без ключа уникальности создастся новая форма. Также форма-владелец доступна внутри подчинённой формы через свойство ВладелецФормы.

Чем навигационная ссылка отличается от обычной ссылки на объект?

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

Почему ПолучитьФорму возвращает ошибку в модуле объекта?

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

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

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

Работает ли ОткрытьФорму в веб-клиенте?

Да, и ОткрытьФорму, и ПолучитьФорму работают в веб-клиенте с тем же синтаксисом. Ограничения касаются лишь модальных вызовов и некоторых режимов открытия окон — в веб-клиенте рекомендуется использовать блокирующие окна и асинхронные обработчики оповещений вместо модальных методов.