Разработка и Конфигурация · 12 мин
Как открыть форму справочника по ссылке в 1С
Как программно открыть форму элемента справочника по ссылке в 1С 8.3: ОткрытьЗначение, ПолучитьФорму, ОткрытьФорму с параметром Ключ, примеры кода и типичные ошибки.
Задача открыть форму элемента справочника, имея на руках только ссылку, возникает в 1С постоянно: при двойном клике по строке отчёта, при обработке результата запроса, при переходе из одного документа к связанным данным. Платформа 1С:Предприятие 8.3 предлагает несколько способов решения, и выбор зависит от того, работаете вы в управляемом или обычном приложении, на клиенте или на сервере.
Главное, что нужно понимать: ссылка (тип СправочникСсылка) — это не объект и не форма, а лишь уникальный идентификатор записи в базе. Чтобы показать пользователю карточку элемента, платформа должна по этой ссылке найти нужную форму, создать её и передать в неё ключ записи. Все способы ниже так или иначе сводятся к этой механике.
Материал ориентирован на управляемые формы (так работают большинство современных конфигураций: УТ 11, ERP, БП 3.0, ЗУП 3.1), но отдельный раздел посвящён обычному приложению, которое до сих пор встречается в старых базах.
Способ 1. ОткрытьЗначение — самый простой вариант
Метод ОткрытьЗначение() — глобальный, доступен на клиенте и не требует знания ни имени формы, ни типа объекта. Платформа сама определяет, какой объект передан, и открывает для него основную форму: для элемента справочника — форму элемента, для списка — форму списка.
&НаКлиенте
Процедура ПоказатьКонтрагента(Команда)
СсылкаНаКонтрагента = ПолучитьТекущегоКонтрагента(); // СправочникСсылка.Контрагенты
ОткрытьЗначение(СсылкаНаКонтрагента);
КонецПроцедуры
Этот способ идеален, когда тип ссылки заранее неизвестен: например, в универсальном отчёте пользователь может кликнуть и по контрагенту, и по договору, и по документу. Один вызов ОткрытьЗначение закрывает все случаи без ветвлений по типам.
Ограничение метода — вы не управляете параметрами открытия: нельзя передать владельца формы, режим блокировки окна или дополнительные параметры. Если нужен такой контроль, переходите к ОткрытьФорму.
Способ 2. ОткрытьФорму с параметром Ключ
Метод ОткрытьФорму() даёт полный контроль над открытием. Чтобы открыть форму конкретного элемента справочника, нужно указать полное имя формы и передать структуру параметров, где в свойстве Ключ лежит ссылка.
&НаКлиенте
Процедура ОткрытьЭлементНоменклатуры(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаНоменклатуру);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);
КонецПроцедуры
Имя формы строится по шаблону Справочник.<ИмяСправочника>.Форма.<ИмяФормы>. Если у справочника в конфигураторе назначена основная форма элемента, её имя можно не угадывать — достаточно указать Справочник.Номенклатура.ФормаОбъекта, и платформа подставит основную форму.
Полный синтаксис метода позволяет задать владельца, уникальность, окно и описание оповещения о закрытии:
ОткрытьФорму(ИмяФормы, Параметры, Владелец, Уникальность, Окно, , ОписаниеОповещенияОЗакрытии);
Параметр Уникальность заслуживает внимания: если передать туда ссылку, повторный вызов с той же ссылкой не откроет дубликат формы, а активирует уже открытую. Это удобно, чтобы пользователь не плодил десять одинаковых карточек одного контрагента.
Как открыть форму с сервера и в толстом клиенте
Частая ситуация: ссылка получается в серверной процедуре (запросом, поиском по реквизиту), а открыть форму нужно на клиенте. Прямо на сервере ОткрытьФорму и ОткрытьЗначение недоступны — интерактивные действия выполняются только на клиенте. Поэтому схема такая: серверная функция возвращает ссылку, а клиентская процедура её открывает.
&НаСервереБезКонтекста
Функция НайтиПоставщикаПоИНН(ИНН)
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Контрагенты КАК Т ГДЕ Т.ИНН = &ИНН");
Запрос.УстановитьПараметр("ИНН", ИНН);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);
КонецФункции
&НаКлиенте
Процедура ПоказатьПоставщика(Команда)
Ссылка = НайтиПоставщикаПоИНН(ИННИзФормы);
Если Ссылка = Неопределено Тогда
ПоказатьПредупреждение(, "Поставщик не найден");
Возврат;
КонецЕсли;
ОткрытьЗначение(Ссылка);
КонецПроцедуры
Обратите внимание на проверку Неопределено и пустой ссылки. Если передать в ОткрытьФорму параметр Ключ со значением Неопределено, форма откроется в режиме создания нового элемента, а не выдаст ошибку — пользователь может случайно сохранить пустую карточку.
Открытие формы в обычном приложении
В обычном приложении (режим, характерный для конфигураций на платформе 8.2 и ранних 8.3, например УТ 10.3, УПП 1.3) используется метод ПолучитьФорму(). Он вызывается у менеджера объекта или у самой ссылки не поддерживается — форму получают через менеджер справочника, передавая ссылку как ключ.
Процедура ОткрытьКарточку(Кнопка)
ФормаЭлемента = Справочники.Номенклатура.ПолучитьФорму("ФормаЭлемента", , СсылкаНаЭлемент);
ФормаЭлемента.КлючУникальности = СсылкаНаЭлемент;
ФормаЭлемента.Открыть();
КонецПроцедуры
Третий параметр ПолучитьФорму — ключ уникальности. Если передать туда ссылку, повторный вызов вернёт уже открытую форму того же элемента. После получения формы её нужно явно открыть методом Открыть() или ОткрытьМодально().
Ещё один рабочий приём для обычных форм — получить объект методом ПолучитьОбъект() и вызвать у него ПолучитьФорму(). Но это лишнее обращение к базе: ссылка в качестве ключа уникальности решает задачу без чтения объекта целиком.
Сравнение способов
Управляемое приложение, тип объекта неизвестен или неважен. Нет настройки параметров открытия.
Управляемое приложение, нужны владелец, уникальность, оповещение о закрытии. Требует знания имени формы.
Только обычное приложение. Позволяет работать с формой до открытия, но не работает в тонком и веб-клиенте управляемого режима.
Открытие формы списка с отбором по ссылке
Смежная задача — открыть не карточку элемента, а список, отфильтрованный по связанной ссылке. Например, показать все договоры выбранного контрагента. Здесь параметр Ключ не подходит: форма списка принимает параметр Отбор.
&НаКлиенте
Процедура ПоказатьДоговорыКонтрагента(Команда)
Отбор = Новый Структура("Владелец", СсылкаНаКонтрагента);
ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);
КонецПроцедуры
Для подчинённых справочников (договоры подчинены контрагентам) есть альтернатива: параметр Отбор по полю Владелец платформа применяет автоматически, а при создании нового элемента из такого списка владелец подставится сам. Это стандартное поведение, которое не нужно программировать отдельно.
- 1Получите ссылку: из реквизита формы, результата запроса или функции поиска
- 2Проверьте, что ссылка не пустая и не Неопределено
- 3Выберите способ: ОткрытьЗначение для простого показа или ОткрытьФорму с Ключ для управляемого открытия
- 4Вызовите метод на клиенте и проверьте, что открылась карточка именно нужного элемента
- 5Проверьте повторный вызов: не должно открываться дублирующих окон одного элемента
Типичные ошибки и их признаки
Первая частая ошибка — попытка вызвать ОткрытьЗначение или ОткрытьФорму в серверной процедуре. Компилятор модулей управляемого приложения выдаст сообщение вида «Процедура или функция с указанным именем не определена», потому что в серверном контексте этих методов нет. Решение — выносить открытие в клиентскую процедуру.
Вторая ошибка — путаница между параметрами Ключ и Отбор. Если передать Ключ форме списка, отбор не сработает: откроется полный список без фильтрации. Обратная ситуация — Отбор для формы элемента — просто игнорируется, и откроется форма нового элемента.
Третья ошибка — открытие по «битой» ссылке. Такая ссылка возникает, когда объект физически удалён, а ссылка на него осталась в других данных. Признак — текст вида «<Объект не найден> (…» в строковом представлении. Перед открытием полезно проверить существование объекта запросом или через ПолучитьОбъект() с проверкой на Неопределено.
Проверка результата
После внедрения кода проверьте несколько контрольных точек. Откройте элемент через свой механизм и убедитесь, что заголовок формы и ключевые реквизиты соответствуют именно той ссылке, которую вы передавали, — легко ошибиться и передать ссылку не той переменной.
Проверьте поведение при повторном вызове: при заданной уникальности должно активироваться уже открытое окно. Проверьте открытие из-под пользователя с ограниченными правами: если у него нет права просмотра справочника, платформа покажет сообщение о нарушении прав — это нормально, но ваш код не должен при этом падать с необработанной ошибкой.
Как проверить результат
Карточка именно того элемента, ссылка на который передавалась
Форма нового пустого элемента — значит, Ключ был пуст
Активируется уже открытое окно элемента
Открывается вторая карточка того же элемента — не задана уникальность
Либо форма открылась, либо штатное сообщение о нарушении прав
Необработанное исключение и аварийное завершение обработки
FAQ
Можно ли открыть форму справочника, зная только код или наименование элемента?
Напрямую — нет, форме нужна ссылка. Сначала найдите элемент методом НайтиПоКоду() или НайтиПоНаименованию() у менеджера справочника (Справочники.Номенклатура.НайтиПоКоду(Код)), проверьте, что результат не пустая ссылка, и затем откройте её через ОткрытьЗначение или ОткрытьФорму.
Как открыть форму и дождаться её закрытия, чтобы получить результат?
Используйте ОткрытьФорму с последним параметром — описанием оповещения (Новый ОписаниеОповещения("ИмяПроцедуры", ЭтотОбъект)). Когда форма закроется, платформа вызовет указанную процедуру и передаст в неё результат закрытия. Модальные вызовы в управляемом приложении по умолчанию запрещены и требуют специальной настройки.
Почему ОткрытьФорму открывает форму нового элемента вместо существующего?
Почти всегда причина в том, что в параметре Ключ передано Неопределено или пустая ссылка. Проверьте значение переменной перед вызовом. Реже причина в том, что форма элемента в конфигураторе не имеет параметра Ключ в списке параметров — тогда платформа игнорирует переданное значение.
Как открыть форму элемента в новой вкладке или отдельном окне?
Управляется параметром Окно метода ОткрытьФорму: можно передать вариант из системного перечисления ВариантОткрытияОкна, например ОтдельноеОкно. По умолчанию форма открывается в текущем окне в соответствии с настройками интерфейса «Такси».
Работает ли ОткрытьЗначение для групп справочника?
Да. Если передать ссылку на группу, платформа откроет форму группы, если она определена в конфигурации, либо стандартную форму. Никаких дополнительных действий от разработчика не требуется — тип объекта определяется автоматически.
Чем отличается ПолучитьФорму в обычном приложении от ОткрытьФорму в управляемом?
ПолучитьФорму возвращает сам объект формы, который можно настроить до открытия (заполнить реквизиты, назначить обработчики), а затем явно вызвать Открыть(). ОткрытьФорму работает декларативно: вы передаёте имя формы и параметры, а экземпляр формы в коде не получаете — взаимодействие идёт через оповещения.
Что важно запомнить
В управляемом приложении используйте ОткрытьЗначение(Ссылка) для простого показа и ОткрытьФорму с параметром Ключ, когда нужен контроль над окном и уникальностью. Открытие выполняется только на клиенте, ссылку перед этим проверяйте на пустоту и существование объекта. В обычном приложении применяется ПолучитьФорму с ключом уникальности.