Создание полей выбора в 1С:Предприятие — одна из самых востребованных задач при разработке форм справочников, документов и отчётов. Поле выбора позволяет пользователю выбирать значения из заранее определённого списка, что значительно упрощает ввод данных и снижает количество ошибок. Однако не все знают, как правильно настроить такое поле, особенно если требуется динамическое заполнение списка или связь с другими элементами формы.
В этой статье мы разберём все этапы: от базового создания поля выбора в конструкторе форм до программной настройки через 1С:Предприятие 8.3. Вы узнаете, какие типы полей выбора бывают, как привязать их к справочникам или перечислениям, а также как избежать типичных ошибок, из-за которых поле может не работать или отображать некорректные данные. Особое внимание уделим динамическому формированию списка выбора в зависимости от условий — это частая задача, с которой сталкиваются разработчики при автоматизации бизнес-процессов.
Типы полей выбора в 1С: какой выбрать для вашей задачи
В 1С:Предприятие существует несколько видов полей выбора, и их правильный выбор зависит от конкретной задачи. Основные типы:
- 📌 Поле ввода с выбором из справочника — самое распространённое. Позволяет выбирать элементы из любого справочника (например, контрагенты, номенклатура, сотрудники).
- 📑 Поле выбора из перечисления — используется для фиксированного набора значений (например, "Да/Нет", "Статус документа: Черновик/Проведён/Отменён").
- 🔄 Поле выбора из динамического списка — список формируется по запросу или условию (например, только активные контрагенты или товары определённой категории).
- 🔗 Поле выбора с привязкой к другому полю — когда список зависит от значения в другом поле формы (например, выбор модели автомобиля после выбора марки).
Если вам нужно простое поле для выбора из фиксированного списка (например, "Тип оплаты: Наличные/Безнал/Карта"), достаточно использовать перечисление. Для работы со справочниками (клиенты, товары, сотрудники) подойдёт поле ввода с выбором. А если список должен меняться в зависимости от действий пользователя — потребуется динамический список с программной настройкой.
Важно понимать, что некоторые типы полей выбора требуют дополнительной настройки в модуле формы. Например, динамический список не получится создать только через конструктор — придётся писать код на встроенном языке 1С.
Создание поля выбора через конструктор форм: пошаговая инструкция
Начнём с самого простого способа — создания поля выбора через визуальный конструктор. Этот метод подходит для базовых задач и не требует знания программирования.
Откройте нужную форму в режиме Конфигуратор (например, форму документа или справочника). Перейдите на вкладку Форма и выберите элемент, к которому хотите добавить поле выбора. Далее:
- На панели элементов найдите Поле ввода и перетащите его на форму.
- В свойствах поля (
F4) установите тип данных. Например, для выбора контрагента укажитеСправочникСсылка.Контрагенты. - Включите опцию
Выбор из списка(обычно она активна по умолчанию для справочников). - Настройте
Путь к данным— свяжите поле с реквизитом объекта (например,Контрагент). - При необходимости ограничьте список выборки, указав
Отбор(например, только активные контрагенты).
После этих действий поле будет готово к использованию. Пользователь сможет либо вводить значение вручную, либо выбирать его из выпадающего списка, который формируется автоматически на основе данных справочника.
☑️ Проверка перед сохранением формы
Если вам нужно поле выбора для перечисления, процесс ещё проще: выберите тип данных ПеречислениеСсылка.ИмяВашегоПеречисления и свяжите с соответствующим реквизитом. Список значений будет формироваться автоматически из элементов перечисления.
Программное создание поля выбора: когда без кода не обойтись
Конструктор форм подходит для простых случаев, но часто требуется более гибкая настройка. Например, если список выбора должен зависеть от значения в другом поле или формироваться по сложному запросу. В таких случаях придётся писать код в модуле формы.
Рассмотрим пример: у нас есть документ ЗаказПокупателя, и мы хотим, чтобы при выборе Контрагента в поле Менеджер автоматически подставлялся ответственный менеджер этого контрагента. Для этого:
&Процедура КонтрагентПриИзменении(Элемент)
Если ЗначениеЗаполнено(Элементы.Контрагент.Значение) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| КонтрагентыОтветственные.Менеджер КАК Менеджер
|ИЗ
| Справочник.Контрагенты.Ответственные КАК КонтрагентыОтветственные
|ГДЕ
| КонтрагентыОтветственные.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", Элементы.Контрагент.Значение);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Элементы.Менеджер.Значение = Выборка.Менеджер;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот код выполняется при изменении поля Контрагент и автоматически заполняет поле Менеджер данными из справочника Ответственные. Аналогичным образом можно настраивать динамические списки для любых полей.
Ещё один распространённый случай — зависимые поля выбора. Например, при выборе ГруппаТоваров в поле Товар должны отображаться только товары из этой группы. Для этого в обработчике изменения группы напишите:
&Процедура ГруппаТоваровПриИзменении(Элемент)
Элементы.Товар.СписокВыбора.Очистить();
Элементы.Товар.СписокВыбора.Загрузить(
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Группа = &Группа",
Новый Структура("Группа", Элементы.ГруппаТоваров.Значение)
);
КонецПроцедуры
Такие решения позволяют сделать интерфейс более интуитивным и снизить вероятность ошибок при вводе данных.
Всегда проверяйте, что список выборки не пустой, прежде чем загружать его в поле. Иначе пользователь увидит ошибку при попытке открыть выпадающий список.
Настройка отборов и фильтров для поля выбора
Часто требуется ограничить список значений, доступных для выбора. Например, в поле Склад нужно показывать только склады текущего подразделения, а в поле Сотрудник — только активных сотрудников. Для этого используются отборы.
Отборы можно настроить двумя способами:
- 🔧 Через свойства поля — если отбор статичный (например, всегда показывать только активные элементы).
- 💻 Программно в модуле — если отбор зависит от условий (например, от текущего пользователя или даты).
Для статичного отбора:
- Откройте свойства поля (
F4). - Перейдите на вкладку
Данные. - В разделе
Отбордобавьте условие, например:ПометкаУдаления = Ложь(чтобы не показывать помеченные на удаление элементы).
Для динамического отбора используйте код в обработчике открытия формы или при изменении связанного поля. Пример отбора по текущему пользователю:
&Процедура ПриОткрытии()
Элементы.Сотрудник.СписокВыбора.ПараметрыОтбора.Вставить(
"Ответственный",
Новый ЗначениеВМассиве(ПользователиИнформационнойБазы.ТекущийПользователь())
);
КонецПроцедуры
Это ограничит список сотрудников только теми, за которых ответственен текущий пользователь.
| Тип отбора | Пример условия | Когда использовать |
|---|---|---|
| По статусу | Статус = &Статус |
Фильтрация по значению перечисления (например, только активные контрагенты) |
| По дате | Дата >= НачалоМесяца(ТекущаяДата()) |
Показать только актуальные на текущий период документы |
| По пользователю | Ответственный = ТекущийПользователь() |
Ограничение доступа к данным по ролям |
| По связанному полю | Группа = Элементы.ГруппаТоваров.Значение |
Зависимые списки (например, товары → категории) |
Что будет, если не настроить отборы?
Без отборов в поле выбора могут отображаться устаревшие или нерелевантные данные, что приведёт к ошибкам в работе. Например, пользователь может выбрать удалённого сотрудника или архивный склад, что нарушит логику бизнес-процесса.
Типичные ошибки при работе с полями выбора и как их избежать
Даже опытные разработчики иногда сталкиваются с проблемами при настройке полей выбора. Рассмотрим самые распространённые ошибки и способы их решения.
⚠️ Внимание: Если поле выбора не открывает список или выдаёт ошибку "Недопустимое значение", проверьте, что тип данных поля совпадает с типом данных справочника или перечисления. Например, поле с типом СправочникСсылка.Контрагенты не сможет работать со справочником Партнёры.
Другие частые проблемы:
- 🔴 Пустой список выбора — обычно возникает, если неверно указан отбор или список не загружен программно. Проверьте запрос или параметры отбора.
- 🔴 Медленная загрузка списка — если справочник большой, используйте отбор по умолчанию или настройте
ОтложеннуюЗагрузку. - 🔴 Не сохраняется выбранное значение — проверьте, что поле связано с реквизитом объекта и тип данных совпадает.
- 🔴 Ошибка "Объект не найден" — возможно, элемент справочника был удалён, а ссылка на него осталась в документе. Используйте обработку такого случая в коде.
Пример обработки ошибки при выборе удалённого элемента:
&Процедура ТоварПриИзменении(Элемент)
Попытка
Если НЕ Элементы.Товар.Значение.Пустая() И
НЕ Элементы.Товар.Значение.ЭтоГруппа() Тогда
// Проверяем, не удалён ли товар
Если Элементы.Товар.Значение.ПометкаУдаления Тогда
Предупреждение("Выбранный товар помечен на удаление!");
Элементы.Товар.Значение = Неопределено;
КонецЕсли;
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Такой код поможет избежать ошибок при работе с данными, которые могли быть изменены другими пользователями.
Всегда проверяйте значения полей выбора на корректность, особенно если данные могли быть изменены параллельно другими сеансами.
Оптимизация производительности: как ускорить работу полей выбора
Если в вашей базе большие справочники (тысячи записей), поля выбора могут работать медленно. Это особенно заметно при открытии форм или фильтрации данных. Чтобы ускорить работу, используйте следующие приёмы:
- ⚡ Отложенная загрузка списка — список выборки грузится только при нажатии на поле, а не при открытии формы. Настройка:
Элементы.Поле.ОтложеннаяЗагрузка = Истина; - ⚡ Ограничение количества элементов — если пользователю не нужно видеть все записи, установите лимит, например:
ПЕРВЫЕ 100в запросе. - ⚡ Кэширование часто используемых списков — если список выборки редко меняется, можно загружать его один раз и хранить в переменной модуля.
- ⚡ Индексирование полей в запросах — убедитесь, что поля, по которым идёт отбор, проиндексированы в базе данных.
Пример оптимизированного запроса для динамического списка:
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 100
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Группа = &Группа
| И НЕ Номенклатура.ПометкаУдаления
|УПОРЯДОЧИТЬ ПО
| Наименование
|ИНДЕКСИРОВАТЬ ПО
| Группа";
Такой запрос вернёт только 100 первых записей, отсортированных по наименованию, и будет использовать индекс по полю Группа, что ускорит его выполнение.
⚠️ Внимание: Если вы используете ОтложеннуюЗагрузку, убедитесь, что поле выбора не является обязательным для заполнения. Иначе пользователь не сможет сохранить документ, если не откроет список.
Поле выбора в отчётах и обработках: особенности настройки
Поля выбора часто используются не только в формах документов и справочников, но и в отчётах и обработках. Здесь есть свои нюансы:
В отчётах поля выбора обычно применяются для параметров. Например, в отчёте Ведомость по товарам можно добавить параметр ГруппаТоваров с возможностью выбора из справочника. Для этого:
- Откройте схему компоновки данных отчёта.
- Добавьте новый параметр с типом
СправочникСсылка.Номенклатура. - В настройках параметра включите опцию
Выбор из списка. - Настройте отбор, если нужно ограничить список (например, только группы, а не конкретные товары).
В обработках поля выбора настраиваются аналогично формам, но часто требуется дополнительная логика. Например, если обработка предназначена для массового изменения данных, поле выбора может использоваться для фильтрации записей:
&Процедура ПриОткрытии()
// Загружаем список контрагентов с отбором по типу
Элементы.Контрагент.СписокВыбора.Загрузить(
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ЭтоГруппа = Ложь
| И Контрагенты.ТипКонтрагента = &Тип",
Новый Структура("Тип", Перечисления.ТипыКонтрагентов.Покупатель)
);
КонецПроцедуры
Таким образом, пользователь сможет выбирать только покупателей, а не всех контрагентов.
FAQ: Ответы на частые вопросы о полях выбора в 1С
Как сделать поле выбора обязательным для заполнения?
В свойствах поля (F4) установите флаг Обязательное. Если поле программно создаётся в модуле, добавьте проверку при сохранении:
Если Элементы.Поле.Значение = Неопределено Тогда
Предупреждение("Заполните поле!");
Отказ = Истина;
КонецЕсли;
Можно ли сделать поле выбора с поиском по нескольким полям?
Да, для этого в запросе, формирующем список выбора, укажите дополнительные поля в условии ПОЛНЫЙТЕКСТОВЫЙПОИСК:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ПОЛНЫЙТЕКСТОВЫЙПОИСК(Номенклатура.Наименование, Номенклатура.Артикул) = &Поиск";
Как ограничить выбор только активными элементами?
Используйте отбор по полю ПометкаУдаления или Активность (если оно есть в справочнике):
Элементы.Поле.СписокВыбора.ПараметрыОтбора.Вставить("ПометкаУдаления", Ложь);
Почему поле выбора не показывает значения после обновления конфигурации?
Это может происходить из-за несовпадения типов данных после обновления. Проверьте:
- Совпадает ли тип данных поля с типом справочника.
- Не изменилась ли структура справочника (например, добавлены новые реквизиты).
- Обновлены ли данные в базе (иногда требуется перезагрузка списков выборки).
Как сделать зависимое поле выбора в 1С 8.3?
Используйте обработчик события ПриИзменении для родительского поля. Пример для зависимости Город → Улица:
&Процедура ГородПриИзменении(Элемент)
Элементы.Улица.СписокВыбора.Очистить();
Если Элементы.Город.Значение <> Неопределено Тогда
Элементы.Улица.СписокВыбора.Загрузить(
"ВЫБРАТЬ Улицы.Ссылка ИЗ Справочник.Улицы КАК Улицы ГДЕ Улицы.Город = &Город",
Новый Структура("Город", Элементы.Город.Значение)
);
КонецЕсли;
КонецПроцедуры