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

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

Как получить форму элемента справочника в 1С

Как программно получить и открыть форму элемента справочника в 1С: ПолучитьФорму, ОткрытьФорму, параметры открытия, различия толстого и тонкого клиента.

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

Способ решения зависит от режима работы: в обычном приложении (толстый клиент) используется метод ПолучитьФорму(), а в управляемом приложении (тонкий и веб-клиент) — функция ОткрытьФорму() с параметрами. Смешивать эти подходы нельзя: код для обычных форм не выполнится в управляемом режиме и наоборот.

Ниже разобраны оба подхода с готовыми примерами кода, различия между получением формы и её открытием, типовые сценарии (новый элемент, существующий элемент, форма выбора), а также ошибки, которые чаще всего допускают разработчики.

Обычные и управляемые формы: что определяет способ получения

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

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

Если конфигурация работает в обоих режимах, придётся писать два варианта кода или выносить логику в общие модули с директивами компиляции. Проверить режим в коде можно через ТекущийРежимЗапуска().

Получение формы в обычном приложении через ПолучитьФорму

В толстом клиенте форму элемента справочника получают методом ПолучитьФорму(). Его можно вызвать у менеджера справочника, у ссылки на элемент или у объекта элемента.

// Форма нового элемента

Форма = Справочники.Номенклатура.ПолучитьФорму("ФормаЭлемента");

Форма.Открыть();

// Форма существующего элемента

ЭлементСсылка = Справочники.Номенклатура.НайтиПоКоду("000000001");

Форма = ЭлементСсылка.ПолучитьФорму("ФормаЭлемента");

Форма.Открыть();

Если имя формы не указано (ПолучитьФорму() без параметров), используется основная форма элемента, заданная в конфигураторе. Если основная форма не назначена, платформа сгенерирует форму автоматически.

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

Форма = Справочники.Номенклатура.ПолучитьФорму("ФормаЭлемента");

Форма.ЭлементОбъект.Наименование = "Новая позиция";

Форма.Открыть();

Открытие формы в управляемом приложении через ОткрытьФорму

В управляемом приложении объект формы не получают — её открывают функцией ОткрытьФорму(). Первый параметр — полное имя формы в формате "Справочник.ИмяСправочника.Форма.ИмяФормы", второй — структура параметров.

// Открыть существующий элемент

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", ЭлементСсылка);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);

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

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Наименование", "Новая позиция");

ЗначенияЗаполнения.Вставить("Родитель", ГруппаСсылка);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);

Параметр ЗначенияЗаполнения работает только если в модуле формы в обработчике ПриСозданииНаСервере не переопределена стандартная обработка заполнения, либо если заполнение реализовано через ОбработкаЗаполнения у объекта. Для надёжности дополнительно обрабатывайте параметры в модуле формы.

Открытие формы с обработкой результата

Если после закрытия формы нужно выполнить действия (например, обновить список), используйте ОписаниеОповещения:

Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыЭлемента", ЭтотОбъект);

ПараметрыФормы = Новый Структура("Ключ", ЭлементСсылка);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента",

ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

В процедуре ПослеЗакрытияФормыЭлемента первым параметром придёт результат закрытия, вторым — дополнительные параметры, переданные в описание оповещения.

Порядок действий в управляемом приложении
  1. 1
    Определите ссылку на элемент (поиск по коду, наименованию или из реквизита текущего объекта)
  2. 2
    Сформируйте структуру параметров: Ключ для существующего элемента или ЗначенияЗаполнения для нового
  3. 3
    Вызовите ОткрытьФорму с полным именем формы и параметрами
  4. 4
    При необходимости передайте описание оповещения для обработки закрытия
  5. 5
    Проверьте, что форма открылась и реквизиты заполнены ожидаемо

Открытие формы выбора и подбор элемента

Частая задача — не редактировать элемент, а дать пользователю выбрать его из списка. Для этого открывается форма выбора (или форма списка в режиме выбора):

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("РежимВыбора", Истина);

ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);

ПараметрыФормы.Вставить("Отбор", Новый Структура("Родитель", ГруппаСсылка));

Оповещение = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора",

ПараметрыФормы, , , , , Оповещение);

В обработчике оповещения результатом будет выбранная ссылка. Параметр Отбор позволяет сразу ограничить список, например показать только элементы конкретной группы или непомеченные на удаление.

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

Сравнение подходов

ПолучитьФорму (обычное приложение)

Возвращает объект формы, доступны прямые манипуляции до открытия. Не работает на тонком и веб-клиенте.

ОткрытьФорму (управляемое приложение)

Универсальный способ для тонкого, толстого и веб-клиента. Взаимодействие только через параметры и оповещения.

ПоказатьЗначение

Подходит, если нужно просто показать пользователю карточку элемента без дополнительных параметров: ПоказатьЗначение(, Ссылка).

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

Первая распространённая ошибка — вызов ПолучитьФорму() на тонком клиенте. Метод доступен только в толстом клиенте обычного приложения, в остальных случаях будет исключение. Вторая — неправильное имя формы: строка вида "Справочник.Номенклатура.ФормаЭлемента" без сегмента "Форма." приведёт к ошибке «Форма не найдена».

Третья ошибка — передача в параметр Ключ объекта вместо ссылки. Ключ принимает именно ссылку (СправочникСсылка), а не объект СправочникОбъект. Если у вас объект, передайте Объект.Ссылка.

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

Типичные ошибки
01
Вызов ПолучитьФорму на тонком клиенте — исключение времени выполнения, используйте ОткрытьФорму
02
Неверное имя формы без сегмента Форма — ошибка «форма не найдена», указывайте полный путь Справочник.Имя.Форма.ИмяФормы
03
Передача объекта вместо ссылки в параметр Ключ — форма нового элемента вместо существующего
04
Попытка открыть форму из серверного кода или фонового задания — интерактивные вызовы доступны только на клиенте
05
Заполнение реквизитов через ЗначенияЗаполнения без проверки — переопределённая обработка заполнения может игнорировать параметры

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

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

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

Для отладки поставьте точку останова в модуле формы элемента в обработчике ПриСозданииНаСервере — так вы увидите, какие параметры реально пришли в форму через коллекцию Параметры.

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

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

Открытие существующего элемента
Норма

В форме отображаются данные именно того элемента, ссылка которого передана в Ключ

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

Открылась пустая форма нового элемента — проверьте, что передана ссылка, а не объект или Неопределено

Предзаполнение нового элемента
Норма

Указанные в ЗначенияЗаполнения реквизиты заполнены при открытии

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

Поля пустые — обработка заполнения переопределена или имя реквизита указано с ошибкой

Права пользователя
Норма

Форма открывается без сообщений о нарушении прав

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

Ошибка доступа — назначьте пользователю роль с правом просмотра справочника

Часто задаваемые вопросы

Как открыть форму элемента, если известен только код справочника?

Сначала найдите ссылку: Ссылка = Справочники.Номенклатура.НайтиПоКоду("000000001"). Проверьте, что ссылка не пустая (Ссылка.Пустая()), затем передайте её в параметр Ключ при вызове ОткрытьФорму или вызовите ПолучитьФорму у ссылки в обычном приложении.

Можно ли получить форму, не открывая её пользователю?

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

Как открыть форму элемента модально, чтобы пользователь не мог переключиться?

В управляемом приложении передайте в ОткрытьФорму параметр РежимОткрытияОкна со значением РежимОткрытияОкнаФормы.БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс. В обычном приложении используйте метод ОткрытьМодально() у полученной формы.

Почему ОткрытьФорму не работает в фоновом задании?

Интерактивные вызовы (открытие форм, диалоги, предупреждения) доступны только в клиентском контексте. В серверных процедурах и фоновых заданиях они игнорируются или вызывают ошибку. Решение — выполнить серверную часть отдельно, а открытие формы делать на клиенте после получения результата.

Как открыть форму конкретной группы справочника, а не элемента?

Для групп используется та же механика: передайте ссылку на группу в параметр Ключ. Если для групп в конфигурации назначена отдельная форма (ФормаГруппы), укажите её имя явно: "Справочник.Номенклатура.Форма.ФормаГруппы".

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

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

Итог

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

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