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