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

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

Как работает форма выбора в 1С

Разбираем, как устроена форма выбора в 1С: свойства, параметры, динамический список, отбор, обработка выбора и типичные ошибки разработчика.

Форма выбора — это специализированная форма объекта конфигурации (справочника, документа, плана счетов и т.д.), которая открывается, когда пользователь нажимает кнопку выбора в поле ввода. Её задача — показать список элементов и вернуть выбранное значение в поле, из которого её вызвали. В тонком клиенте и веб-клиенте форма выбора чаще всего открывается в режиме блокирования окна владельца, чтобы пользователь не мог продолжить ввод, пока не завершит выбор.

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

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

Как платформа решает, какую форму выбора открыть

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

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

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

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

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

После создания формы её нужно назначить основной: в палитре свойств объекта установите её в свойство «Основная форма выбора». С этого момента все поля ввода со ссылкой на этот объект будут открывать именно вашу форму — если только выбор не переопределён программно в конкретном поле.

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

Порядок создания формы выбора
  1. 1
    Откройте объект метаданных, закладка «Формы», добавьте форму вида «Форма выбора»
  2. 2
    Настройте динамический список: основная таблица, нужные колонки, порядок
  3. 3
    Назначьте форму основной в свойстве «Основная форма выбора» объекта
  4. 4
    Проверьте открытие из поля ввода в режиме предприятия
  5. 5
    Добавьте обработку параметров отбора, если выбор должен быть ограничен

Параметры формы выбора и передача отбора

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

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

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

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

Связи параметров выбора и отбор по владельцу

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

Для иерархических по владельцу объектов работает и механизм «ВыборГруппИЭлементов»: он определяет, можно ли выбирать группы, только элементы или и то и другое. Если поле должно принимать только элементы, а пользователь выбирает группу, платформа либо заблокирует выбор, либо поведение будет зависеть от настройки — это нужно проверять при тестировании.

Ошибка в настройке связей приводит к характерному симптому: поле договора очищается при смене контрагента, либо, наоборот, позволяет выбрать договор чужого контрагента. Проверяйте свойства «СвязиПараметровВыбора» и «СвязьПоТипу» у каждого связанного поля.

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

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

Если форму выбора открывали программно с указанием владельца-элемента, дополнительной обработки обычно не требуется. Но если владельцем назначена форма целиком или выбор нужен для нестандартной цели (например, заполнение таблицы подбором), результат обрабатывается в обработчике ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) модуля формы-владельца.

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

Типичные ошибки
01
Открытие формы без указания владельца — оповещение о выборе некому получать, поле не заполняется
02
Отбор накладывается в ПриОткрытии на клиенте вместо ПриСозданииНаСервере — список сначала показывает лишние данные и дёргается
03
В ОбработкаВыбора нет проверки дублей при множественном подборе — в табличной части появляются повторяющиеся строки
04
Изменение основной формы выбора без проверки всех мест использования — в части документов выбор перестаёт работать из-за нехватки параметров

Динамический список и произвольный запрос в форме выбора

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

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

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

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

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

Открытие формы из поля ввода
Норма

Открывается назначенная форма, список заполнен, отбор применён

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

Открывается стандартная форма или список без отбора

Выбор элемента
Норма

Поле-владелец заполняется ссылкой, срабатывает ПриИзменении

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

Форма закрывается, но поле остаётся пустым

Отбор по владельцу
Норма

В списке только элементы текущего владельца

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

Видны элементы всех владельцев или список пуст

Произвольный запрос
Норма

Двойной щелчок по строке возвращает ссылку

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

Выбор не срабатывает — не указано ключевое поле Ссылка

Быстрый выбор и ввод по строке

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

Настройка поиска при вводе по строке выполняется в свойствах объекта метаданных: «Поля поиска», «Полнотекстовый поиск», «Ввод по строке». Если пользователи жалуются, что «ничего не находится», чаще всего причина в том, что нужное поле не входит в список полей поиска, либо отключён полнотекстовый поиск в базе.

Обработчики ОбработкаПолученияДанныхВыбора в модуле менеджера объекта позволяют программно управлять выпадающим списком при вводе по строке: добавить туда служебные строки («Создать нового контрагента…»), изменить отбор или представление элементов. Это стандартное место кастомизации, не требующее изменения самой формы выбора.

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

Ограничения и безопасные границы доработки

Форма выбора подчиняется правам доступа: если у пользователя нет права просмотра объекта, список будет пустым, а при отсутствии права на интерактивное добавление кнопка «Создать» будет недоступна. Ограничения доступа на уровне записей (RLS) также действуют на динамический список формы выбора — пользователь увидит только разрешённые ему элементы.

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

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

Итог

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

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

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

Почему открывается не моя форма выбора, а стандартная?

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

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

Самый надёжный способ — в обработчике ПриСозданииНаСервере формы выбора скрыть или сделать недоступными команды создания. Дополнительно можно ограничить право интерактивного добавления в роли пользователя — тогда кнопка «Создать» будет недоступна платформенно.

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

Передайте в параметрах формы ключ ТекущаяСтрока со ссылкой на нужный элемент. Если форма открывается из поля ввода, платформа делает это автоматически — список позиционируется на текущем значении поля.

Почему при произвольном запросе не работает выбор элемента?

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

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

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

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

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