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

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

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

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

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

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

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

Что такое ссылка и почему форму нельзя получить «напрямую»

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

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

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

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

Пример открытия формы элемента справочника:

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

Если у объекта не задана явная форма в конфигураторе, можно указать стандартную: \"Справочник.Номенклатура.ФормаОбъекта\" для справочника или \"Документ.РеализацияТоваровУслуг.ФормаОбъекта\" для документа. Платформа сама подставит основную форму, если она назначена в свойствах объекта метаданных.

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

Как получить форму через ПолучитьФорму

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

bsl
&НаКлиенте
Процедура ПолучитьИОткрыть(Команда)
    ПараметрыФормы = Новый Структура("Ключ", ДокументСсылка);
    ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", ПараметрыФормы);
    ФормаДокумента.Открыть();
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ПослеЗакрытияФормы(Результат, ДопПараметры) Экспорт
    // Обработка результата закрытия
КонецПроцедуры

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

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

Первый — обращение через точку: Наименование = Ссылка.Наименование;. Платформа неявно выполняет запрос к базе. Удобно для одного-двух реквизитов, но при обращении к нескольким полям в цикле порождает множество мелких запросов.

Второй — запрос: язык запросов позволяет выбрать нужные поля по переданной ссылке одним обращением. Это предпочтительный способ при массовой обработке.

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

Способы работы со ссылкой

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

Нужно показать объект пользователю; работает только на клиенте

Обращение через точку

Нужно 1–2 реквизита; проигрывает запросу при массовой обработке

Запрос с параметром-ссылкой

Чтение нескольких полей или обход коллекции ссылок

ПолучитьОбъект

Только для изменения и записи объекта; самый ресурсоёмкий

Типичные ошибки и ограничения

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

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

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

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

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

Для отладки удобно выводить ссылку в сообщение перед открытием: Сообщить(ЭлементСсылка); покажет представление и тип. Проверить существование объекта можно запросом или функцией ОбщегоНазначения.СсылкаСуществует() в типовых конфигурациях на БСП.

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

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

Заголовок и поля формы
Норма

Отображаются данные нужного объекта

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

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

Тип ссылки
Норма

Тип соответствует открываемой форме (справочник к справочнику)

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

Ошибка несоответствия типов при открытии

Повторное открытие
Норма

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

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

Создаются дубликаты окон — сбит ключ уникальности

Итог

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

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

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

Можно ли открыть форму объекта из серверной процедуры?

Нет, открытие форм доступно только в клиентском контексте. Серверная процедура может вернуть ссылку или подготовленные параметры, а клиентская процедура на их основе вызовет ОткрытьФорму.

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

Передайте в параметрах формы структуру с ключом Основание или ЗначенияЗаполнения: например, Новый Структура(\"Основание\", СсылкаОснование). Документ при этом заполнится по механизму ввода на основании.

Почему ОткрытьФорму открывает пустую форму вместо объекта?

Чаще всего в параметр Ключ передана пустая ссылка или параметр вообще не назван Ключ — платформа не смогла связать форму с объектом. Проверьте имя параметра и заполненность ссылки перед вызовом.

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

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

Как узнать, открыта ли уже форма нужного объекта?

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

Работает ли этот подход во внешних обработках?

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