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

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

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

Пошаговая инструкция: как превратить форму списка справочника или документа в форму выбора в 1С 8.3, настройка свойств, кода и параметров выбора.

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

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

Ниже разобраны оба подхода: назначение существующей формы списка в качестве основной формы выбора объекта и программное открытие формы списка в режиме выбора из конкретного поля. Оба способа работают на управляемых формах платформы 1С:Предприятие 8.3.

Чем форма выбора отличается от формы списка

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

Технически отличие задаётся свойством формы РежимВыбора. Когда оно установлено в Истина, платформа меняет поведение: двойной щелчок или Enter по строке списка трактуется как выбор, форма возвращает значение через оповещение и закрывается. Дополнительно свойство ЗакрыватьПриВыборе управляет тем, закроется ли форма после выбора или останется открытой для множественного подбора.

Важно понимать: одна и та же форма может работать в обоих режимах. Если её открыли как форму списка — она ведёт себя как список, если с признаком выбора — как форму выбора. Это позволяет не дублировать разработку и поддерживать один вариант формы.

Способ 1: назначить форму списка основной формой выбора

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

Порядок действий в конфигураторе:

  1. Откройте в дереве конфигурации нужный справочник или документ и перейдите на закладку «Формы» (или откройте палитру свойств объекта).
  2. В поле «Форма выбора» (или «Основная форма выбора») укажите вашу произвольную форму списка.
  3. Откройте модуль этой формы и убедитесь, что она корректно реагирует на режим выбора (об этом — следующий раздел).
  4. Обновите конфигурацию базы данных и проверьте выбор в поле ввода.

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

Порядок действий
  1. 1
    Создайте или откройте произвольную форму списка объекта
  2. 2
    В свойствах объекта укажите её как форму выбора
  3. 3
    В ПриСозданииНаСервере проверьте Параметры.РежимВыбора и скройте лишние команды
  4. 4
    Убедитесь, что у таблицы списка включён стандартный выбор значения
  5. 5
    Обновите конфигурацию и проверьте подбор в поле ввода

Доработка формы: обработка режима выбора

Когда форма открывается как форма выбора, в её параметры передаётся РежимВыбора = Истина, а также связанные параметры: Отбор, ТекущаяСтрока, ЗакрыватьПриВыборе, МножественныйВыбор и другие. Стандартные обработчики динамического списка большую часть работы делают сами, но произвольные элементы формы нужно адаптировать.

Типовой код в модуле формы:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.РежимВыбора Тогда

Элементы.ФормаСоздать.Видимость = Ложь;

Элементы.СписокКонтекстноеМенюИзменить.Видимость = Ложь;

Элементы.Список.РежимВыбора = Истина;

КонецЕсли;

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

Ключевая строка — установка Элементы.Список.РежимВыбора = Истина у таблицы динамического списка. После этого платформа сама формирует событие выбора значения при двойном щелчке или нажатии Enter и возвращает ссылку на выбранный элемент в вызывающую форму. Писать обработчик ВыборЗначения вручную при этом не требуется.

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

Способ 2: открыть форму списка в режиме выбора программно

Не всегда нужно менять основную форму выбора объекта. Часто нестандартный подбор требуется только в одном конкретном поле одной формы. Тогда форму списка открывают программно из обработчика НачалоВыбора поля ввода.

Пример кода в модуле формы документа:

&НаКлиенте

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

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

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

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

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

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

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

ПараметрыФормы, Элемент);

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

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

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

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

Множественный выбор и подбор без закрытия формы

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

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

Если форма списка используется и для подбора, имеет смысл проверять сочетание параметров в ПриСозданииНаСервере: при ЗакрыватьПриВыборе = Ложь обычно показывают кнопку «Выбрать» в командной панели и скрывают команды редактирования.

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

Назначение основной формой выбора

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

Программное открытие из НачалоВыбора

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

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

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

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

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

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

Отдельная частая ситуация — форма открывается, но не закрывается после выбора. Причина почти всегда в том, что ЗакрыватьПриВыборе не установлено в Истина либо переопределено в коде формы. Проверьте и параметр открытия, и обработчики формы.

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

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

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

Значение подставляется в поле, форма закрывается

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

Открывается карточка элемента на редактирование

Отбор при открытии
Норма

Список показывает только допустимые элементы

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

Видны все элементы, включая помеченные на удаление

Обычное открытие списка
Норма

Форма работает как список, доступны команды редактирования

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

Форма всегда ведёт себя как выбор и закрывается по щелчку

Ограничения и когда лучше сделать отдельную форму выбора

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

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

Итог

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

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

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

Двойной щелчок открывает элемент вместо выбора. Что не так?

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

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

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

Можно ли запретить создание новых элементов из формы выбора?

Да. В ПриСозданииНаСервере при Параметры.РежимВыбора скройте команды создания и копирования, а также установите у таблицы свойство, запрещающее интерактивное добавление. Дополнительно можно ограничить доступ правами ролей.

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

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

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

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

Нужно ли создавать отдельную форму выбора, если есть форма списка?

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