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

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

Типы полей выбора в 1С: какой выбрать для вашей задачи

В 1С:Предприятие существует несколько видов полей выбора, и их правильный выбор зависит от конкретной задачи. Основные типы:

  • 📌 Поле ввода с выбором из справочника — самое распространённое. Позволяет выбирать элементы из любого справочника (например, контрагенты, номенклатура, сотрудники).
  • 📑 Поле выбора из перечисления — используется для фиксированного набора значений (например, "Да/Нет", "Статус документа: Черновик/Проведён/Отменён").
  • 🔄 Поле выбора из динамического списка — список формируется по запросу или условию (например, только активные контрагенты или товары определённой категории).
  • 🔗 Поле выбора с привязкой к другому полю — когда список зависит от значения в другом поле формы (например, выбор модели автомобиля после выбора марки).

Если вам нужно простое поле для выбора из фиксированного списка (например, "Тип оплаты: Наличные/Безнал/Карта"), достаточно использовать перечисление. Для работы со справочниками (клиенты, товары, сотрудники) подойдёт поле ввода с выбором. А если список должен меняться в зависимости от действий пользователя — потребуется динамический список с программной настройкой.

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

📊 Какой тип поля выбора вы используете чаще всего?
Поле со справочником
Поле с перечислением
Динамический список
Не использую поля выбора

Создание поля выбора через конструктор форм: пошаговая инструкция

Начнём с самого простого способа — создания поля выбора через визуальный конструктор. Этот метод подходит для базовых задач и не требует знания программирования.

Откройте нужную форму в режиме Конфигуратор (например, форму документа или справочника). Перейдите на вкладку Форма и выберите элемент, к которому хотите добавить поле выбора. Далее:

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

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

☑️ Проверка перед сохранением формы

Выполнено: 0 / 5

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

Программное создание поля выбора: когда без кода не обойтись

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

Рассмотрим пример: у нас есть документ ЗаказПокупателя, и мы хотим, чтобы при выборе Контрагента в поле Менеджер автоматически подставлялся ответственный менеджер этого контрагента. Для этого:

&Процедура КонтрагентПриИзменении(Элемент)

Если ЗначениеЗаполнено(Элементы.Контрагент.Значение) Тогда

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| КонтрагентыОтветственные.Менеджер КАК Менеджер

|ИЗ

| Справочник.Контрагенты.Ответственные КАК КонтрагентыОтветственные

|ГДЕ

| КонтрагентыОтветственные.Контрагент = &Контрагент";

Запрос.УстановитьПараметр("Контрагент", Элементы.Контрагент.Значение);

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда

Элементы.Менеджер.Значение = Выборка.Менеджер;

КонецЕсли;

КонецЕсли;

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

Этот код выполняется при изменении поля Контрагент и автоматически заполняет поле Менеджер данными из справочника Ответственные. Аналогичным образом можно настраивать динамические списки для любых полей.

Ещё один распространённый случай — зависимые поля выбора. Например, при выборе ГруппаТоваров в поле Товар должны отображаться только товары из этой группы. Для этого в обработчике изменения группы напишите:

&Процедура ГруппаТоваровПриИзменении(Элемент)

Элементы.Товар.СписокВыбора.Очистить();

Элементы.Товар.СписокВыбора.Загрузить(

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Группа = &Группа",

Новый Структура("Группа", Элементы.ГруппаТоваров.Значение)

);

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

Такие решения позволяют сделать интерфейс более интуитивным и снизить вероятность ошибок при вводе данных.

💡

Всегда проверяйте, что список выборки не пустой, прежде чем загружать его в поле. Иначе пользователь увидит ошибку при попытке открыть выпадающий список.

Настройка отборов и фильтров для поля выбора

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

Отборы можно настроить двумя способами:

  • 🔧 Через свойства поля — если отбор статичный (например, всегда показывать только активные элементы).
  • 💻 Программно в модуле — если отбор зависит от условий (например, от текущего пользователя или даты).

Для статичного отбора:

  1. Откройте свойства поля (F4).
  2. Перейдите на вкладку Данные.
  3. В разделе Отбор добавьте условие, например: ПометкаУдаления = Ложь (чтобы не показывать помеченные на удаление элементы).

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

&Процедура ПриОткрытии()

Элементы.Сотрудник.СписокВыбора.ПараметрыОтбора.Вставить(

"Ответственный",

Новый ЗначениеВМассиве(ПользователиИнформационнойБазы.ТекущийПользователь())

);

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

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

Тип отбора Пример условия Когда использовать
По статусу Статус = &Статус Фильтрация по значению перечисления (например, только активные контрагенты)
По дате Дата >= НачалоМесяца(ТекущаяДата()) Показать только актуальные на текущий период документы
По пользователю Ответственный = ТекущийПользователь() Ограничение доступа к данным по ролям
По связанному полю Группа = Элементы.ГруппаТоваров.Значение Зависимые списки (например, товары → категории)
Что будет, если не настроить отборы?

Без отборов в поле выбора могут отображаться устаревшие или нерелевантные данные, что приведёт к ошибкам в работе. Например, пользователь может выбрать удалённого сотрудника или архивный склад, что нарушит логику бизнес-процесса.

Типичные ошибки при работе с полями выбора и как их избежать

Даже опытные разработчики иногда сталкиваются с проблемами при настройке полей выбора. Рассмотрим самые распространённые ошибки и способы их решения.

⚠️ Внимание: Если поле выбора не открывает список или выдаёт ошибку "Недопустимое значение", проверьте, что тип данных поля совпадает с типом данных справочника или перечисления. Например, поле с типом СправочникСсылка.Контрагенты не сможет работать со справочником Партнёры.

Другие частые проблемы:

  • 🔴 Пустой список выбора — обычно возникает, если неверно указан отбор или список не загружен программно. Проверьте запрос или параметры отбора.
  • 🔴 Медленная загрузка списка — если справочник большой, используйте отбор по умолчанию или настройте ОтложеннуюЗагрузку.
  • 🔴 Не сохраняется выбранное значение — проверьте, что поле связано с реквизитом объекта и тип данных совпадает.
  • 🔴 Ошибка "Объект не найден" — возможно, элемент справочника был удалён, а ссылка на него осталась в документе. Используйте обработку такого случая в коде.

Пример обработки ошибки при выборе удалённого элемента:

&Процедура ТоварПриИзменении(Элемент)

Попытка

Если НЕ Элементы.Товар.Значение.Пустая() И

НЕ Элементы.Товар.Значение.ЭтоГруппа() Тогда

// Проверяем, не удалён ли товар

Если Элементы.Товар.Значение.ПометкаУдаления Тогда

Предупреждение("Выбранный товар помечен на удаление!");

Элементы.Товар.Значение = Неопределено;

КонецЕсли;

КонецЕсли;

Исключение

Сообщить(ОписаниеОшибки());

КонецПопытки;

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

Такой код поможет избежать ошибок при работе с данными, которые могли быть изменены другими пользователями.

💡

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

Оптимизация производительности: как ускорить работу полей выбора

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

  • Отложенная загрузка списка — список выборки грузится только при нажатии на поле, а не при открытии формы. Настройка: Элементы.Поле.ОтложеннаяЗагрузка = Истина;
  • Ограничение количества элементов — если пользователю не нужно видеть все записи, установите лимит, например: ПЕРВЫЕ 100 в запросе.
  • Кэширование часто используемых списков — если список выборки редко меняется, можно загружать его один раз и хранить в переменной модуля.
  • Индексирование полей в запросах — убедитесь, что поля, по которым идёт отбор, проиндексированы в базе данных.

Пример оптимизированного запроса для динамического списка:

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 100

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Группа = &Группа

| И НЕ Номенклатура.ПометкаУдаления

|УПОРЯДОЧИТЬ ПО

| Наименование

|ИНДЕКСИРОВАТЬ ПО

| Группа";

Такой запрос вернёт только 100 первых записей, отсортированных по наименованию, и будет использовать индекс по полю Группа, что ускорит его выполнение.

⚠️ Внимание: Если вы используете ОтложеннуюЗагрузку, убедитесь, что поле выбора не является обязательным для заполнения. Иначе пользователь не сможет сохранить документ, если не откроет список.

Поле выбора в отчётах и обработках: особенности настройки

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

В отчётах поля выбора обычно применяются для параметров. Например, в отчёте Ведомость по товарам можно добавить параметр ГруппаТоваров с возможностью выбора из справочника. Для этого:

  1. Откройте схему компоновки данных отчёта.
  2. Добавьте новый параметр с типом СправочникСсылка.Номенклатура.
  3. В настройках параметра включите опцию Выбор из списка.
  4. Настройте отбор, если нужно ограничить список (например, только группы, а не конкретные товары).

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

&Процедура ПриОткрытии()

// Загружаем список контрагентов с отбором по типу

Элементы.Контрагент.СписокВыбора.Загрузить(

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.ЭтоГруппа = Ложь

| И Контрагенты.ТипКонтрагента = &Тип",

Новый Структура("Тип", Перечисления.ТипыКонтрагентов.Покупатель)

);

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

Таким образом, пользователь сможет выбирать только покупателей, а не всех контрагентов.

FAQ: Ответы на частые вопросы о полях выбора в 1С

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

В свойствах поля (F4) установите флаг Обязательное. Если поле программно создаётся в модуле, добавьте проверку при сохранении:

Если Элементы.Поле.Значение = Неопределено Тогда

Предупреждение("Заполните поле!");

Отказ = Истина;

КонецЕсли;

Можно ли сделать поле выбора с поиском по нескольким полям?

Да, для этого в запросе, формирующем список выбора, укажите дополнительные поля в условии ПОЛНЫЙТЕКСТОВЫЙПОИСК:

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| ПОЛНЫЙТЕКСТОВЫЙПОИСК(Номенклатура.Наименование, Номенклатура.Артикул) = &Поиск";

Как ограничить выбор только активными элементами?

Используйте отбор по полю ПометкаУдаления или Активность (если оно есть в справочнике):

Элементы.Поле.СписокВыбора.ПараметрыОтбора.Вставить("ПометкаУдаления", Ложь);
Почему поле выбора не показывает значения после обновления конфигурации?

Это может происходить из-за несовпадения типов данных после обновления. Проверьте:

  • Совпадает ли тип данных поля с типом справочника.
  • Не изменилась ли структура справочника (например, добавлены новые реквизиты).
  • Обновлены ли данные в базе (иногда требуется перезагрузка списков выборки).
Как сделать зависимое поле выбора в 1С 8.3?

Используйте обработчик события ПриИзменении для родительского поля. Пример для зависимости Город → Улица:

&Процедура ГородПриИзменении(Элемент)

Элементы.Улица.СписокВыбора.Очистить();

Если Элементы.Город.Значение <> Неопределено Тогда

Элементы.Улица.СписокВыбора.Загрузить(

"ВЫБРАТЬ Улицы.Ссылка ИЗ Справочник.Улицы КАК Улицы ГДЕ Улицы.Город = &Город",

Новый Структура("Город", Элементы.Город.Значение)

);

КонецЕсли;

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