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

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

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

Как получить форму справочника в 1С: ПолучитьФорму, ОткрытьФорму, ПолучитьФормуВыбора. Примеры кода для обычных и управляемых форм, ошибки и FAQ.

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

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

Ниже разобраны оба механизма с примерами кода, способы получить форму конкретного элемента, передача параметров, типичные ошибки и проверка результата. Примеры применимы к типовым и самописным конфигурациям на платформе 1С:Предприятие 8.2/8.3.

Какие формы есть у справочника и как они называются

У любого справочника платформа поддерживает стандартный набор форм. Имена используются при программном обращении:

  • ФормаЭлемента — карточка одного элемента справочника;
  • ФормаСписка — список элементов с иерархией и отборами;
  • ФормаВыбора — форма подбора элемента в поле ввода;
  • ФормаГруппы — карточка группы (только для иерархических справочников).

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

Если у справочника вообще нет явно созданных форм, платформа построит их автоматически. Программно к таким формам обращаются по тем же стандартным именам (ФормаЭлемента, ФормаСписка) — платформа подставит сгенерированный вариант.

Получение формы в управляемом приложении

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

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

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

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

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

Для открытия формы конкретного существующего элемента его ссылку передают в параметрах под ключом Ключ:

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

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

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

bsl
&НаКлиенте
Процедура ОткрытьКарточку(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Ключ", Элементы.Список.ТекущиеДанные.Ссылка);
    ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаЭлемента", ПараметрыФормы);
КонецПроцедуры

Передача параметров при открытии формы

Кроме ключа элемента, форме можно передать дополнительные параметры через структуру. Типовые сценарии:

  • заполнение реквизитов нового элемента — параметр ЗначенияЗаполнения;
  • копирование — параметр ЗначениеКопирования со ссылкой на исходный элемент;
  • отбор в форме списка — параметр Отбор (структура, где ключ — имя поля);
  • родитель для нового элемента иерархического справочника — параметр Родитель.
ПараметрыФормы = Новый Структура;

Отбор = Новый Структура;

Отбор.Вставить("Владелец", СсылкаНаКонтрагента);

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

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.Форма.ФормаСписка", ПараметрыФормы);

Произвольные (нестандартные) параметры тоже можно передавать, но форма их увидит только если в её модуле в событии ПриСозданииНаСервере предусмотрено чтение Параметры.ИмяПараметра. Параметры, не объявленные в форме и не являющиеся стандартными, в управляемых формах могут потребовать пометки «Ключевой параметр» — иначе платформа их отфильтрует.

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

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

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

ФормаСписка.Открыть();

Форму конкретного элемента получают либо через ссылку, либо с передачей ключа:

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

ФормаЭлемента.Открыть();

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

Сравнение вариантов

ОткрытьФорму()

Управляемое приложение. Сразу открывает форму, принимает параметры, владельца и уникальность. Основной способ в современных конфигурациях.

ПолучитьФорму() (глобальный)

Управляемое приложение. Возвращает объект формы до открытия — нужен, когда надо настроить форму программно перед показом.

Справочники.Имя.ПолучитьФорму()

Обычное приложение. Работает только в толстом клиенте в режиме обычных форм, в управляемом режиме недоступен.

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

Частая задача — дать пользователю выбрать элемент справочника из своей кнопки или команды. В управляемом приложении форму выбора открывают с указанием владельца и режимом выбора:

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

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

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

Третий параметр — владелец формы. Если указать поле ввода, выбранное значение придёт в его событие ОбработкаВыбора. Если владельцем назначена сама форма, результат придёт в её обработчик ОбработкаВыбора модуля формы.

Альтернатива — открытие с оповещением (асинхронный вариант, рекомендуется при отказе от модальности):

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

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", , ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

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

Вторая группа проблем — контекст вызова. Методы открытия форм доступны только на клиенте. Вызов ОткрытьФорму() в серверной процедуре приведёт к ошибке. Разделяйте код: на сервере получайте ссылку, на клиенте открывайте форму.

Третья типичная ситуация — открытие формы нового элемента вместо существующего. Это происходит, когда в параметре Ключ передана пустая ссылка или Неопределено. Перед открытием проверяйте заполненность ссылки.

Типичные ошибки
01
Вызов ОткрытьФорму() в серверном контексте — метод доступен только на клиенте, вынесите открытие в клиентскую процедуру.
02
Передача пустой ссылки в параметр "Ключ" — откроется форма нового элемента вместо существующего; проверяйте ссылку на заполненность.
03
Опечатка в пути: "Справочники.Номенклатура" вместо "Справочник.Номенклатура" — в строковом имени формы вид метаданных пишется в единственном числе.
04
Использование Справочники.Имя.ПолучитьФорму() в управляемом приложении — этот метод менеджера работает только в обычных формах.

Проверка результата и границы самостоятельной работы

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

Также проверьте: открывается ли нужная форма (своя или автоматическая), подхватываются ли параметры отбора и заполнения, корректно ли работает выбор с возвратом значения. Отладчиком удобно остановиться в ПриСозданииНаСервере формы и посмотреть содержимое объекта Параметры.

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

Итог

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

В управляемом приложении форму справочника открывают через ОткрытьФорму("Справочник.<Имя>.Форма.<ИмяФормы>", Параметры), ссылку на элемент передают в параметре "Ключ". В обычном приложении используют Справочники.<Имя>.ПолучитьФорму(). Все вызовы — только на клиенте, ссылку перед открытием проверяют на заполненность.

Частые вопросы

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

Через главное меню: «Все функции» → «Справочники» → нужный справочник. Если пункта «Все функции» нет, включите его в параметрах интерфейса (кнопка с шестерёнкой или меню «Сервис» в зависимости от версии платформы).

Почему ОткрытьФорму() выдаёт ошибку «Форма не найдена»?

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

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

Передайте в параметрах структуру «ЗначенияЗаполнения»: ПараметрыФормы.Вставить("ЗначенияЗаполнения", Новый Структура("Наименование,Родитель", "Новый элемент", СсылкаНаГруппу)). Форма элемента откроется в режиме создания с подставленными значениями.

Можно ли получить форму справочника на сервере?

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

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

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

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

Откройте форму выбора с параметром «РежимВыбора» = Истина и укажите владельца (поле ввода или форму). Результат придёт в обработчик «ОбработкаВыбора» владельца. Либо используйте ОписаниеОповещения — выбранное значение будет передано в указанную процедуру после закрытия формы выбора.