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

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

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

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

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

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

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

Как работает механизм выбора в управляемых формах

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

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

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

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

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

&НаКлиенте

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

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

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

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

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

ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);

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

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

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

Передача отбора и дополнительных параметров

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

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

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

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

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

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

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

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

Дополнительно полезны параметры МножественныйВыбор (позволяет выбрать несколько элементов, результатом будет массив), ТекущаяСтрока (позиционирует список на указанной ссылке) и ЗакрыватьПослеВыбора. Если форма выбора должна быть модальной и не давать пользователю вернуться в основную форму, применяют метод ОткрытьФормуМодально() — но в тонком и веб-клиенте с режимом модальности «не использовать» он работать не будет.

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

Существует два основных способа получить выбранное значение. Первый — через событие ОбработкаВыбора формы-владельца. Оно срабатывает, если форма открыта с указанием владельца, и получает два параметра: выбранное значение и источник выбора.

&НаКлиенте

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

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

ДобавитьСтрокуТовара(ВыбранноеЗначение);

КонецЕсли;

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

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

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

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

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

&НаКлиенте

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

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

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

КонецЕсли;

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

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

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

Форма открылась в режиме выбора
Норма

Есть кнопка «Выбрать», двойной щелчок возвращает значение

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

Форма открылась как обычный список — параметр РежимВыбора не передан или открыта не та форма

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

В списке только нужные элементы, отбор нельзя снять

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

Видны все элементы — проверить имена полей в структуре отбора

Результат возвращается
Норма

Срабатывает ОбработкаВыбора или процедура оповещения

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

Ничего не происходит — не указан владелец и не передано оповещение

Множественный выбор и подбор в табличную часть

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

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

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

Альтернативные способы и ограничения

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

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

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

ОткрытьФорму с РежимВыбора

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

ОткрытьФормуМодально

Блокирует родительское окно до выбора. Не работает при отключённой модальности, применять не рекомендуется

Собственная форма подбора

Полный контроль: остатки, цены, флажки, произвольный результат. Требует разработки и сопровождения отдельной формы

Стандартный выбор в поле ввода

Вообще без кода: платформа сама открывает форму выбора по типу реквизита, настройка через события элемента формы

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

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

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

Почему в ОбработкаВыбора приходит Неопределено?

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

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

В этом случае код часто не нужен: платформа сама открывает форму выбора по типу данных поля. Если нужно изменить стандартное поведение, используют событие элемента формы НачалоВыбора, где устанавливают СтандартнаяОбработка = Ложь и открывают свою форму с нужными параметрами.

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

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

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

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

Форма выбора открывается повторно вместо активизации уже открытой — как исправить?

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

Итог

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

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