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

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

Форма списка как форма выбора в 1С: настройка и примеры кода

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

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

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

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

В управляемом приложении выбор реализован через оповещения. Открытая форма в режиме выбора при двойном клике или нажатии кнопки «Выбрать» вызывает метод ОповеститьОВыборе(Значение), а платформа передаёт это значение в форму-владельца. Там срабатывает событие ОбработкаВыбора (для поля ввода — стандартная обработка, если вызов шёл через механизм ввода по строке или кнопку выбора).

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

Для большинства объектов метаданных платформа автоматически генерирует форму выбора, если она не создана разработчиком. У справочников и документов есть свойство «Основная форма выбора» — если оно не заполнено, используется основная форма списка с включённым режимом выбора.

Открытие формы списка в режиме выбора

Стандартный способ — вызвать ОткрытьФорму с параметрами. Имя формы формируется по шаблону Справочник.Номенклатура.ФормаСписка или ФормаВыбора, если она создана отдельно. Пример кода:

// Открытие формы списка в режиме выбора

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

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

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

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

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

ЭтотОбъект,

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

Параметр ЗакрыватьПриВыборе определяет поведение после одного выбора: Истина — форма закроется сразу, Ложь — останется открытой для множественного подбора (полезно при подборе товаров в табличную часть). Четвёртый аргумент ОткрытьФорму — уникальность открытия: если передать идентификатор формы-владельца, повторный вызов активирует уже открытое окно вместо создания дубликата.

Если вызов идёт из поля ввода (кнопка выбора у реквизита), платформа делает всё автоматически: открывает основную форму выбора с РежимВыбора = Истина и подставляет результат в поле. Вмешательство требуется, только когда нужен отбор, нестандартная форма или особая обработка результата.

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

Передача отбора и других параметров

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

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

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

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

Отбор.Вставить("Поставщик", Истина);

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

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

ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы, ЭтотОбъект);

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

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

Обработка результата выбора

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

&НаКлиенте

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

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

Объект.Контрагент = ВыбранноеЗначение;

Модифицированность = Истина;

КонецЕсли;

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

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

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

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

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

&НаКлиенте

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

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

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

КонецЕсли;

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

Обязательно проверяйте результат на Неопределено: если пользователь закрыл форму выбора крестиком или клавишей Esc, оповещение вернёт пустое значение. Присвоение его реквизиту без проверки затрёт ранее выбранные данные.

Отдельная форма выбора или параметр РежимВыбора

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

Сравнение подходов

Форма списка + РежимВыбора

Подходит для типового подбора без доработок. Ограничение: внешний вид и команды общие с обычным списком.

Отдельная форма выбора

Подходит, когда нужен свой состав колонок, множественный подбор с количеством или нестандартные команды. Требует поддержки второй формы.

Динамический список на своей форме

Подходит для сложного подбора с произвольным запросом. Требует ручной реализации ОповеститьОВыборе при выборе строки.

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

В собственной форме выбора не забудьте реализовать возврат значения. Для динамического списка в обработчике Выбор таблицы формы вызовите ОповеститьОВыборе(ТекущаяСсылка) и при необходимости Закрыть(). Без этого форма будет открываться, но ничего не возвращать.

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

Проверка результата и ограничения механизма

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

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

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

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

Форма закрывается, ссылка попадает в реквизит

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

Открывается карточка элемента — не передан РежимВыбора

Закрытие формы выбора без выбора
Норма

Реквизит сохраняет прежнее значение

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

Реквизит очищается — нет проверки на Неопределено

Отбор в открытой форме
Норма

Показаны только нужные элементы, отбор нельзя снять

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

Виден весь список — отбор не передан или потерян в форме

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

Активируется уже открытое окно

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

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

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

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

Итог

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

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

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

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

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

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

Передайте параметр МножественныйВыбор = Истина. Тогда пользователь сможет выделить несколько строк, а в оповещении придёт массив ссылок. В обработчике обойдите массив циклом и добавьте каждое значение в табличную часть.

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

Да, передайте параметр ТекущаяСтрока со ссылкой на нужный элемент. Курсор в списке встанет на эту строку, что удобно при повторном выборе — пользователь видит, что уже подобрано.

Ошибка «Неизвестный параметр» при открытии формы — в чём причина?

В структуру параметров добавлен ключ, который не объявлен в параметрах формы списка. Откройте форму в конфигураторе, добавьте параметр в список параметров формы (при необходимости отметьте «Ключевой параметр») и обработайте его в ПриСозданииНаСервере.

Чем отличается ОбработкаВыбора от ОписаниеОповещения?

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

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

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