Разработка и Конфигурация · 12 мин
Как открыть справочник для выбора в 1С
Как открыть справочник для выбора в 1С: программно через ОткрытьФорму и ПолучитьФорму, с отбором и параметрами, а также в пользовательском режиме.
Открытие справочника для выбора — одна из самых частых задач в 1С. Она возникает в двух ситуациях: пользователю нужно подобрать элемент в поле документа или отчёта, а разработчику — программно вызвать форму выбора из своего кода, например из команды на форме или из обработки. Способы различаются в зависимости от того, работаете вы в управляемом приложении (тонкий или веб-клиент) или в обычных формах старых конфигураций.
В управляемом приложении основной инструмент — метод ОткрытьФорму() с указанием имени формы выбора и параметров. В обычных формах используются ПолучитьФорму() и метод ОткрытьФормуВыбора() у поля ввода. Дополнительно поведение формы выбора настраивается параметрами: отбором, режимом множественного выбора, запретом изменения данных.
Ниже разобраны оба подхода с готовыми примерами кода, настройкой отборов, обработкой результата выбора и типичными ошибками, из-за которых форма открывается пустой или выбор не возвращается в вызывающий код.
Как открыть справочник для выбора в пользовательском режиме
В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, Зарплата и управление персоналом) большинство полей, ссылающихся на справочники, уже связаны с формой выбора. Достаточно установить курсор в поле и нажать кнопку с тремя точками или клавишу F4 — откроется форма выбора соответствующего справочника.
Внутри формы выбора можно пользоваться поиском (обычно Ctrl+F или строка поиска вверху списка), отбором по группам и сортировкой. Двойной щелчок по строке или кнопка «Выбрать» передаёт элемент в поле. Если нужного элемента нет, во многих конфигурациях прямо из формы выбора доступна кнопка «Создать» — новый элемент после записи автоматически подставится в поле.
Если справочник нужно просто открыть списком, перейдите в соответствующий раздел главного меню или используйте команду «Все функции» (в режиме тонкого клиента: главное меню → Все функции → Справочники). Если пункт «Все функции» не отображается, включите его в параметрах интерфейса: Сервис → Параметры → отображать команду «Все функции».
Программное открытие формы выбора в управляемом приложении
Базовый вызов выглядит так: метод ОткрытьФорму() получает имя формы, параметры и владельца. Имя формы строится по шаблону Справочник.<ИмяСправочника>.ФормаВыбора. Если в конфигураторе для справочника создана своя основная форма выбора — откроется она, иначе платформа сгенерирует стандартную.
&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",
ПараметрыФормы, ЭтотОбъект, , , ,
Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект),
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораНоменклатуры(Результат, ДопПараметры) Экспорт
Если Результат <> Неопределено Тогда
Номенклатура = Результат;
КонецЕсли;
КонецПроцедуры
Ключевые моменты этого кода: параметр РежимВыбора = Истина гарантирует, что форма откроется именно в режиме выбора (даже если вызвали форму списка); описание оповещения указывает, какая процедура получит результат; режим БлокироватьОкноВладельца не даёт пользователю уйти в другое окно, не завершив выбор.
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы, Элементы.Контрагент);Передача параметров: отбор, владелец, множественный выбор
Через структуру параметров форма выбора настраивается под конкретную задачу. Самый востребованный параметр — Отбор: он ограничивает список элементов, которые видит и может выбрать пользователь.
Отбор = Новый Структура;
Отбор.Вставить("Владелец", КонтрагентСсылка);
Отбор.Вставить("ПометкаУдаления", Ложь);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Отбор);
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ПараметрыФормы.Вставить("МножественныйВыбор", Ложь);
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора",
ПараметрыФормы, ЭтотОбъект);
В примере открывается выбор договоров только по конкретному контрагенту — типичный сценарий для подчинённых справочников. Отбор по ПометкаУдаления скрывает помеченные элементы, хотя в стандартных формах выбора они обычно и так не показываются.
Полезные параметры формы выбора:
РежимВыбора— открывает форму именно для выбора, а не просмотра;МножественныйВыбор— позволяет выбрать несколько элементов; результат вернётся массивом;ЗакрыватьПриВыборе— если Ложь, форма остаётся открытой для подбора нескольких позиций по очереди;ТекущаяСтрока— позиционирует список на указанной ссылке при открытии;ВыборГруппИЭлементов— управляет тем, можно ли выбирать группы, только элементы или и то и другое.
Открытие формы выбора из поля ввода и обработчики событий
Когда поле на форме связано с реквизитом типа «СправочникСсылка», платформа сама открывает форму выбора при нажатии кнопки выбора. Но часто нужно переопределить стандартное поведение — например, показать свой отбор. Для этого используется обработчик события поля НачалоВыбора.
&НаКлиенте
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор",
Новый Структура("Владелец", Объект.Контрагент));
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора",
ПараметрыФормы, Элемент);
КонецПроцедуры
Здесь важны две вещи. Во-первых, СтандартнаяОбработка = Ложь отключает встроенное открытие формы, иначе откроются две формы сразу. Во-вторых, владельцем формы передаётся Элемент (поле ввода), а не вся форма — тогда результат выбора платформа автоматически запишет в это поле, и отдельное оповещение не нужно.
Дополнительно у поля ввода есть свойство ПараметрыВыбора и СвязиПараметровВыбора. Они настраиваются в конфигураторе без единой строки кода: например, связь «Отбор.Владелец(Объект.Контрагент)» автоматически ограничит выбор договоров при любом способе открытия формы выбора, включая ввод по строке.
- 1Определите, откуда открывается выбор: кнопка, поле ввода или команда обработки
- 2Сформируйте структуру параметров: РежимВыбора, Отбор, МножественныйВыбор
- 3Вызовите ОткрытьФорму с именем Справочник.<Имя>.ФормаВыбора
- 4Укажите владельца: элемент поля — для автозаписи результата, форму — для обработки через оповещение
- 5Добавьте процедуру-оповещение и проверьте, что результат не Неопределено
- 6Протестируйте выбор, отмену выбора и повторное открытие формы
Открытие формы выбора в обычных формах
В старых конфигурациях на обычных формах (режим обычного приложения, характерен для платформы 8.2 и ранних решений на 8.3) синтаксис другой. Используется метод ПолучитьФорму() у менеджера справочника:
ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(, ЭтаФорма);
ФормаВыбора.РежимВыбора = Истина;
ФормаВыбора.ЗакрыватьПриВыборе = Истина;
Результат = ФормаВыбора.ОткрытьМодально();
Если Результат <> Неопределено Тогда
Номенклатура = Результат;
КонецЕсли;
Модальное открытие возвращает результат прямо в точку вызова — это удобно, но в управляемом приложении и веб-клиенте модальные окна запрещены или нежелательны, поэтому там применяется механизм оповещений. Для полей ввода в обычных формах также доступен метод ОткрытьФормуВыбора() у элемента управления.
Сравнение вариантов
Стандарт для управляемого приложения. Асинхронно, работает в тонком и веб-клиенте. Требует отдельной процедуры-обработчика.
Результат записывается в поле автоматически, код минимален. Не подходит, если нужна дополнительная обработка выбранного значения.
Настройка без кода, действует при любом способе выбора. Ограничена простыми отборами по реквизитам объекта.
Простой линейный код, но только для обычного приложения; в управляемом режиме модальность недоступна по умолчанию.
Проверка результата и типичные ошибки
После настройки вызова проверьте три сценария: пользователь выбрал элемент, пользователь закрыл форму без выбора (Esc или крестик), пользователь выбрал несколько элементов при множественном выборе. Во втором случае в оповещение приходит Неопределено — код обязан корректно это обрабатывать, иначе в поле попадёт пустое значение или возникнет ошибка.
Ещё одна частая проблема — форма открывается, но список пустой. Причины: слишком жёсткий отбор (например, по устаревшей ссылке владельца), у пользователя нет прав на чтение справочника (RLS молча скрывает строки), либо в форме выбора в конфигураторе задан собственный отбор, который конфликтует с переданным.
Как проверить результат
Открывается одна форма выбора с нужным заголовком
Открываются две формы или форма просмотра вместо выбора
В списке только элементы, удовлетворяющие условию
Список полный или пустой при наличии подходящих элементов
Значение появляется в поле или попадает в обработчик оповещения
Поле остаётся пустым, в оповещение приходит Неопределено
Закрытие формы без выбора ничего не меняет
Поле очищается или возникает ошибка
Ограничения и когда нужен разработчик
Описанные приёмы безопасны: открытие формы выбора не изменяет данные, а ошибка в коде в худшем случае приведёт к сообщению об ошибке у пользователя. Однако любые изменения в конфигурации выполняйте на копии базы и учитывайте, что типовые конфигурации на поддержке после доработки сложнее обновлять.
Если задача выходит за рамки простого открытия формы — например, нужен подбор с остатками на складах, динамическая фильтрация по нескольким условиям или выбор с картинками — разумнее создать собственную форму выбора в конфигураторе и назначить её основной для справочника. Это уже работа для разработчика или внедренца.
Что важно запомнить
В управляемом приложении форму выбора открывают через ОткрытьФорму с параметрами РежимВыбора и Отбор; результат приходит в оповещение или автоматически в поле, если владельцем указан элемент. Всегда обрабатывайте отмену выбора и проверяйте отбор на тестовых данных.
Частые вопросы
Как открыть форму выбора, если у справочника нет своей формы в конфигураторе?
Ничего дополнительно создавать не нужно: платформа автоматически генерирует стандартную форму выбора. Вызов ОткрытьФорму("Справочник.Имя.ФормаВыбора", ...) будет работать, даже если в дереве конфигурации у справочника нет ни одной формы.
Как передать выбранное значение обратно в документ?
Проще всего указать владельцем формы выбора элемент поля ввода — тогда платформа сама запишет результат. Если нужна дополнительная обработка (заполнение связанных реквизитов, пересчёт), передавайте владельцем форму и получайте результат через описание оповещения.
Почему форма выбора открывается пустой, хотя элементы в справочнике есть?
Чаще всего причины три: слишком строгий отбор в параметрах, ограничение прав доступа (RLS) у текущего пользователя или собственный отбор, зашитый в форму выбора разработчиком. Проверьте список под полными правами и временно уберите отбор из параметров.
Можно ли открыть форму выбора с уже выделенной строкой?
Да. Передайте в параметрах ключ ТекущаяСтрока со ссылкой на нужный элемент — при открытии курсор списка встанет на него. Это удобно при повторном открытии выбора, чтобы пользователь видел ранее выбранное значение.
Как разрешить выбор только элементов, но не групп?
Передайте параметр ВыборГруппИЭлементов со значением Использование.Элементы (в управляемых формах — значение перечисления «ГруппыИЭлементы.Элементы»). Тогда группы будут видны для навигации, но выбрать их нельзя.
Работает ли ОткрытьФорму на сервере?
Нет. ОткрытьФорму — клиентский метод, его нельзя вызывать в серверном контексте. Если логика формируется на сервере, подготовьте там структуру параметров, верните её на клиент и выполните открытие формы уже в клиентской процедуре.