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