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