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