Почему не сохраняется значение в списке выбора на форме 1С и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разберем причину: объект «СписокЗначений» против свойства «Список выбора»

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

  1. Тип данных СписокЗначений: это программный объект, коллекция элементов. Он предназначен для хранения набора данных в памяти. Если вы создадите реквизит формы с таким типом, 1С по умолчанию отобразит его как таблицу, в которую можно добавлять строки. Это не выпадающий список, а именно хранилище.
  2. Свойство «Список выбора» (ChoiceList): это свойство конкретного элемента формы (поля ввода). Оно «привязывается» к обычному реквизиту (например, типу Строка или Число) и просто диктует визуальному интерфейсу: «Не давай пользователю печатать текст, а покажи ему вот этот набор вариантов».

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

Решение №1: Использование стандартных свойств реквизита (без кода)

Проанализируем самый простой способ, который подходит для статичных списков, значения которых не меняются в процессе работы программы. Допустим, нам нужно выбрать тип доставки: «Курьер», «Самовывоз» или «Почта».

Выполним следующие шаги в конфигураторе:

  1. Создадим реквизит формы (или объекта) с типом Строка (длина должна быть достаточной для хранения значения).
  2. Вынесем этот реквизит на форму. В дереве элементов формы выделим созданное поле ввода.
  3. В окне свойств найдем категорию «Использование».
  4. Установим флаг КнопкаСпискаВыбора в значение Да.
  5. Найдем пункт «Список выбора» и нажмем на кнопку с многоточием. Заполним колонку «Значение» (то, что пойдет в базу) и «Представление» (то, что увидит пользователь).
  6. Важный нюанс: Чтобы пользователь не мог вписать свой вариант, установите свойство РежимВыбораИзСписка в значение Да.

Решение №2: Программное заполнение списка выбора

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

Посмотрим на пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Очистим текущий список выбора у элемента формы
    Элементы.ВашРеквизитНаФорме.СписокВыбора.Очистить();
    
    // Добавим новые элементы
    // Метод Добавить(Значение, Представление)
    Элементы.ВашРеквизитНаФорме.СписокВыбора.Добавить("Срочно", "Очень срочная доставка");
    Элементы.ВашРеквизитНаФорме.СписокВыбора.Добавить("Обычная", "Стандартная доставка (3 дня)");
    
    // Укажем, что выбирать можно только из этого списка
    Элементы.ВашРеквизитНаФорме.РежимВыбораИзСписка = Истина;
    
КонецПроцедуры

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

Решение №3: Использование перечислений (Лучшая практика)

Как справедливо заметили участники обсуждения на форуме, использование Перечислений (Enums) — это наиболее профессиональный и надежный подход. Выясним, почему это так:

Рассмотрим алгоритм перехода на перечисления:

  1. В дереве конфигурации найдем ветку Перечисления и создадим новое, например, ТипыНомеров.
  2. На вкладке «Данные» добавим значения: Стандарт, Люкс, Президентский.
  3. У реквизита вашего документа или справочника установим тип ПеречислениеСсылка.ТипыНомеров.
  4. На форме для этого поля 1С автоматически подставит кнопку выбора и сформирует список. Никакого кода писать не нужно!

Резюме и рекомендации

Подводя итог нашему анализу, можно составить краткий чек-лист для проверки, если значение в списке не заполняется:

  1. Проверьте тип данных реквизита. Если реквизит — Число, а в списке выбора в значении стоит «Вариант 1» (строка), запись не произойдет.
  2. Убедитесь, что вы не пытаетесь использовать объект типа СписокЗначений как основной реквизит для выбора одного элемента. Для выбора одного элемента нужен тип Строка, Число или Ссылка.
  3. Всегда проверяйте свойство КнопкаСпискаВыбора — без него пользователь просто не увидит выпадающее меню.
  4. Если список вариантов статичен и важен для логики всей системы — всегда используйте Перечисления.

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

← На главную