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

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

Как открыть справочник для выбора в 1С

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

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

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

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

Как открыть справочник для выбора в пользовательском режиме

В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, Зарплата и управление персоналом) большинство полей, ссылающихся на справочники, уже связаны с формой выбора. Достаточно установить курсор в поле и нажать кнопку с тремя точками или клавишу F4 — откроется форма выбора соответствующего справочника.

Внутри формы выбора можно пользоваться поиском (обычно Ctrl+F или строка поиска вверху списка), отбором по группам и сортировкой. Двойной щелчок по строке или кнопка «Выбрать» передаёт элемент в поле. Если нужного элемента нет, во многих конфигурациях прямо из формы выбора доступна кнопка «Создать» — новый элемент после записи автоматически подставится в поле.

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

Программное открытие формы выбора в управляемом приложении

Базовый вызов выглядит так: метод ОткрытьФорму() получает имя формы, параметры и владельца. Имя формы строится по шаблону Справочник.<ИмяСправочника>.ФормаВыбора. Если в конфигураторе для справочника создана своя основная форма выбора — откроется она, иначе платформа сгенерирует стандартную.

&НаКлиенте

Процедура ВыбратьНоменклатуру(Команда)

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

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

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

ПараметрыФормы, ЭтотОбъект, , , ,

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

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте

Процедура ПослеВыбораНоменклатуры(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

Номенклатура = Результат;

КонецЕсли;

КонецПроцедуры

Ключевые моменты этого кода: параметр РежимВыбора = Истина гарантирует, что форма откроется именно в режиме выбора (даже если вызвали форму списка); описание оповещения указывает, какая процедура получит результат; режим БлокироватьОкноВладельца не даёт пользователю уйти в другое окно, не завершив выбор.

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

Передача параметров: отбор, владелец, множественный выбор

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

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

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

Отбор.Вставить("ПометкаУдаления", Ложь);

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

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

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

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

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

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

ПараметрыФормы, ЭтотОбъект);

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

Полезные параметры формы выбора:

  • РежимВыбора — открывает форму именно для выбора, а не просмотра;
  • МножественныйВыбор — позволяет выбрать несколько элементов; результат вернётся массивом;
  • ЗакрыватьПриВыборе — если Ложь, форма остаётся открытой для подбора нескольких позиций по очереди;
  • ТекущаяСтрока — позиционирует список на указанной ссылке при открытии;
  • ВыборГруппИЭлементов — управляет тем, можно ли выбирать группы, только элементы или и то и другое.

Открытие формы выбора из поля ввода и обработчики событий

Когда поле на форме связано с реквизитом типа «СправочникСсылка», платформа сама открывает форму выбора при нажатии кнопки выбора. Но часто нужно переопределить стандартное поведение — например, показать свой отбор. Для этого используется обработчик события поля НачалоВыбора.

&НаКлиенте

Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

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

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

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

ПараметрыФормы, Элемент);

КонецПроцедуры

Здесь важны две вещи. Во-первых, СтандартнаяОбработка = Ложь отключает встроенное открытие формы, иначе откроются две формы сразу. Во-вторых, владельцем формы передаётся Элемент (поле ввода), а не вся форма — тогда результат выбора платформа автоматически запишет в это поле, и отдельное оповещение не нужно.

Дополнительно у поля ввода есть свойство ПараметрыВыбора и СвязиПараметровВыбора. Они настраиваются в конфигураторе без единой строки кода: например, связь «Отбор.Владелец(Объект.Контрагент)» автоматически ограничит выбор договоров при любом способе открытия формы выбора, включая ввод по строке.

Порядок действий
  1. 1
    Определите, откуда открывается выбор: кнопка, поле ввода или команда обработки
  2. 2
    Сформируйте структуру параметров: РежимВыбора, Отбор, МножественныйВыбор
  3. 3
    Вызовите ОткрытьФорму с именем Справочник.<Имя>.ФормаВыбора
  4. 4
    Укажите владельца: элемент поля — для автозаписи результата, форму — для обработки через оповещение
  5. 5
    Добавьте процедуру-оповещение и проверьте, что результат не Неопределено
  6. 6
    Протестируйте выбор, отмену выбора и повторное открытие формы

Открытие формы выбора в обычных формах

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

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

ФормаВыбора.РежимВыбора = Истина;

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

Результат = ФормаВыбора.ОткрытьМодально();

Если Результат <> Неопределено Тогда

Номенклатура = Результат;

КонецЕсли;

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

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

ОткрытьФорму с оповещением

Стандарт для управляемого приложения. Асинхронно, работает в тонком и веб-клиенте. Требует отдельной процедуры-обработчика.

Владелец = элемент поля

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

ПараметрыВыбора поля в конфигураторе

Настройка без кода, действует при любом способе выбора. Ограничена простыми отборами по реквизитам объекта.

ОткрытьМодально (обычные формы)

Простой линейный код, но только для обычного приложения; в управляемом режиме модальность недоступна по умолчанию.

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Не установлено СтандартнаяОбработка = Ложь в НачалоВыбора — открываются две формы выбора одновременно
02
Владельцем указана форма вместо элемента поля — результат не записывается в поле, нужен отдельный обработчик
03
Описание оповещения создано для процедуры без Экспорт на клиенте — платформа не находит обработчик
04
Отбор передан по полю, которого нет в настройках динамического списка — форма открывается с ошибкой или без отбора
05
Не обработан случай Результат = Неопределено — при отмене выбора данные затираются или падает исключение

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

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

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

Форма открывается
Норма

Открывается одна форма выбора с нужным заголовком

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

Открываются две формы или форма просмотра вместо выбора

Отбор применён
Норма

В списке только элементы, удовлетворяющие условию

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

Список полный или пустой при наличии подходящих элементов

Выбор значения
Норма

Значение появляется в поле или попадает в обработчик оповещения

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

Поле остаётся пустым, в оповещение приходит Неопределено

Отмена выбора
Норма

Закрытие формы без выбора ничего не меняет

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

Поле очищается или возникает ошибка

Ограничения и когда нужен разработчик

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

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

Итог

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

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

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

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

Ничего дополнительно создавать не нужно: платформа автоматически генерирует стандартную форму выбора. Вызов ОткрытьФорму("Справочник.Имя.ФормаВыбора", ...) будет работать, даже если в дереве конфигурации у справочника нет ни одной формы.

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

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

Почему форма выбора открывается пустой, хотя элементы в справочнике есть?

Чаще всего причины три: слишком строгий отбор в параметрах, ограничение прав доступа (RLS) у текущего пользователя или собственный отбор, зашитый в форму выбора разработчиком. Проверьте список под полными правами и временно уберите отбор из параметров.

Можно ли открыть форму выбора с уже выделенной строкой?

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

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

Передайте параметр ВыборГруппИЭлементов со значением Использование.Элементы (в управляемых формах — значение перечисления «ГруппыИЭлементы.Элементы»). Тогда группы будут видны для навигации, но выбрать их нельзя.

Работает ли ОткрытьФорму на сервере?

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