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

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

Как в 1С открыть форму списка как форму выбора

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

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

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

Базовый вызов: ОткрытьФорму с параметром РежимВыбора

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

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

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

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

ПараметрыФормы,

ЭтаФорма,

УникальныйИдентификатор);

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

Важно, что форма списка должна поддерживать режим выбора. Стандартные автоматически сгенерированные формы списка справочников и документов это умеют. Если форма разработана вручную, в ней должен быть реквизит или параметр, обрабатывающий режим выбора, иначе параметр будет проигнорирован.

bsl
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы, ЭтаФорма);

Получение результата: ОбработкаВыбора и оповещение о закрытии

Через событие ОбработкаВыбора владельца

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

&НаКлиенте

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.Номенклатура") Тогда

Объект.Номенклатура = ВыбранноеЗначение;

КонецЕсли;

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

Если одна форма открывает выбор из разных мест (например, подбор контрагента и подбор договора), различать источники приходится по типу значения или по имени формы-источника. Это главный недостаток подхода: логика размазывается и становится хрупкой при доработках.

Через ОписаниеОповещения

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

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

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

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

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

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

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

&НаКлиенте

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

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

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

КонецЕсли;

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

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

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

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

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

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

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

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

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

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

ПараметрыФормы.Вставить("ТекущаяСтрока", Объект.Договор);

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

Дополнительно полезны параметры ЗакрыватьПриВыборе (по умолчанию Истина; установите Ложь для множественного подбора) и МножественныйВыбор, если форма списка его поддерживает. Для иерархических справочников есть параметр ВыборГруппИЭлементов, определяющий, можно ли выбирать группы.

Порядок действий
  1. 1
    Сформируйте структуру параметров: РежимВыбора = Истина, при необходимости Отбор и ТекущаяСтрока
  2. 2
    Создайте ОписаниеОповещения с именем экспортной клиентской процедуры обработки результата
  3. 3
    Вызовите ОткрытьФорму с параметрами, владельцем и оповещением
  4. 4
    В обработчике проверьте Результат на Неопределено и заполните реквизит объекта
  5. 5
    Протестируйте: выбор элемента, отмену выбора и повторное открытие окна

Открытие выбора из поля ввода и нестандартные сценарии

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

&НаКлиенте

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

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

// далее ОткрытьФорму с параметрами

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

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

Если стандартной формы списка не хватает (нужны дополнительные колонки, нестандартный отбор, оформление), создают собственную форму выбора: в конфигураторе у объекта добавляют форму с видом «Форма выбора» и открывают её тем же способом. Главное — в обработчике выбора таблицы вызвать ОповеститьОВыборе(Значение) или закрыть форму с результатом.

Сравнение способов получения результата

ОбработкаВыбора владельца

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

ОписаниеОповещения

Результат приходит в отдельную процедуру, логика изолирована; требует экспортной клиентской процедуры

Модальное открытие (ОткрытьМодально)

Код после вызова продолжается сразу с результатом, но модальность запрещена во многих современных режимах и браузерах

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

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

Вторая группа ошибок связана с отбором. Если в структуре отбора указано имя поля, которого нет в динамическом списке формы, платформа выдаст ошибку при открытии. Также отбор по ссылочному полю требует значения именно ссылочного типа — передача строки с наименованием не сработает.

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

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

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

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

Двойной щелчок по элементу списка
Норма

Окно закрывается, ссылка попадает в нужный реквизит формы

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

Открывается карточка элемента — режим выбора не включён

Закрытие окна выбора крестиком
Норма

Ничего не происходит, реквизит не меняется

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

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

Повторное открытие выбора
Норма

Активируется уже открытое окно или открывается корректно с отбором

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

Открываются дубли окон или теряется отбор

FAQ

Как открыть форму выбора с множественным выбором?

Передайте в параметрах МножественныйВыбор = Истина и ЗакрыватьПриВыборе = Ложь. Форма списка должна поддерживать множественный выбор — стандартные формы списков обычно это умеют. В результат в оповещение придёт массив выбранных ссылок, который нужно обойти в цикле.

Почему параметр Отбор не применяется к форме списка?

Имена ключей структуры отбора должны точно совпадать с именами полей динамического списка формы. Если список построен на произвольном запросе, отбор возможен только по полям, доступным для отбора в этом запросе. Проверьте также, что форма не переопределяет параметры в ПриСозданииНаСервере.

Можно ли открыть форму выбора блокирующе, чтобы код ждал результата?

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

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

В обработчике выбора таблицы (например, в СписокВыбор или в команде «Выбрать») вызовите ОповеститьОВыборе(СсылкаНаЭлемент) — тогда сработает ОбработкаВыбора владельца, либо закройте форму методом Закрыть(СсылкаНаЭлемент), если результат ожидается через ОписаниеОповещения о закрытии.

Чем отличается форма списка в режиме выбора от отдельной формы выбора?

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

Работает ли этот подход в обычном приложении?

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

Итог

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

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