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