При разработке интерфейсов на платформе 1С:Предприятие 8 начинающие программисты часто сталкиваются с ситуацией, когда выпадающий список на форме вроде бы работает (позволяет выбрать строку), но само выбранное значение не записывается в реквизит или отображается некорректно. Давайте детально разберем, почему возникает эта проблема, проанализируем разницу между типами данных и интерфейсными свойствами, а также рассмотрим три проверенных способа реализации выбора из списка.
Первое, что нам необходимо прояснить — это фундаментальное различие между двумя понятиями, которые часто путают. Рассмотрим ситуацию глазами платформы:
СписокЗначений: это программный объект, коллекция элементов. Он предназначен для хранения набора данных в памяти. Если вы создадите реквизит формы с таким типом, 1С по умолчанию отобразит его как таблицу, в которую можно добавлять строки. Это не выпадающий список, а именно хранилище.Строка или Число) и просто диктует визуальному интерфейсу: «Не давай пользователю печатать текст, а покажи ему вот этот набор вариантов».Типичная ошибка новичка заключается в попытке использовать реквизит типа СписокЗначений там, где нужно обычное поле со свойством выбора. Выясним, почему «Представление» видно, а «Значение» не фиксируется: это происходит из-за несоответствия типов. Если ваш реквизит — Число, а в списке выбора вы указали значение типа Строка, платформа не сможет «приземлить» выбор в базу данных.
Проанализируем самый простой способ, который подходит для статичных списков, значения которых не меняются в процессе работы программы. Допустим, нам нужно выбрать тип доставки: «Курьер», «Самовывоз» или «Почта».
Выполним следующие шаги в конфигураторе:
Строка (длина должна быть достаточной для хранения значения).КнопкаСпискаВыбора в значение Да.РежимВыбораИзСписка в значение Да.Если варианты в списке должны зависеть от внешних условий (например, от даты или прав пользователя), нам придется использовать встроенный язык. Рассмотрим, как это сделать правильно в модуле формы. Оптимальнее всего делать это в событии ПриСозданииНаСервере.
Посмотрим на пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Очистим текущий список выбора у элемента формы
Элементы.ВашРеквизитНаФорме.СписокВыбора.Очистить();
// Добавим новые элементы
// Метод Добавить(Значение, Представление)
Элементы.ВашРеквизитНаФорме.СписокВыбора.Добавить("Срочно", "Очень срочная доставка");
Элементы.ВашРеквизитНаФорме.СписокВыбора.Добавить("Обычная", "Стандартная доставка (3 дня)");
// Укажем, что выбирать можно только из этого списка
Элементы.ВашРеквизитНаФорме.РежимВыбораИзСписка = Истина;
КонецПроцедуры
Обратите внимание: мы обращаемся к Элементы, а не к самим данным. Это подчеркивает, что список выбора — это свойство визуального отображения данных, а не самих данных.
Как справедливо заметили участники обсуждения на форуме, использование Перечислений (Enums) — это наиболее профессиональный и надежный подход. Выясним, почему это так:
ПеречислениеСсылка.ВашеИмя, и 1С сама сформирует выпадающий список.Рассмотрим алгоритм перехода на перечисления:
ТипыНомеров.Стандарт, Люкс, Президентский.ПеречислениеСсылка.ТипыНомеров.Подводя итог нашему анализу, можно составить краткий чек-лист для проверки, если значение в списке не заполняется:
Число, а в списке выбора в значении стоит «Вариант 1» (строка), запись не произойдет.СписокЗначений как основной реквизит для выбора одного элемента. Для выбора одного элемента нужен тип Строка, Число или Ссылка.КнопкаСпискаВыбора — без него пользователь просто не увидит выпадающее меню.Мы проанализировали ситуацию и увидели, что платформа 1С предоставляет гибкие инструменты для работы с интерфейсом. Понимание разницы между данными (реквизит) и способом их выбора (список выбора) — это ключ к созданию удобных и безошибочных форм.