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