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