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