Как правильно настроить выпадающий список на обычной форме в 1С и избежать типичных ошибок

Программист IT и автоматизация бизнеса
← На главную

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

Разбор основной ошибки: Тип реквизита vs Список выбора

Проанализируем ситуацию, с которой столкнулся автор темы. Основная ошибка заключалась в том, что для реквизита, к которому привязано поле на форме, был выбран тип СписокЗначений. Рассмотрим подробнее, почему это неверно.

В системе 1С объект СписокЗначений — это вспомогательный контейнер, предназначенный для хранения набора элементов. Он сам по себе является сложным объектом. Когда мы хотим реализовать выбор одного значения (например, вида документа: "Поступление" или "Реализация"), нам нужно хранить в базе или в памяти только результат выбора — то есть конкретное число, строку или ссылку.

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

Правильный подход: реквизит объекта или формы должен иметь простой тип (Число, Строка) или тип ссылки на объект метаданных. А вот свойство элемента управления СписокВыбора — это и есть тот самый вспомогательный СписокЗначений, который показывает доступные варианты пользователю.

Программное заполнение списка выбора

Разберем по шагам, как правильно написать код для инициализации списка. Предположим, у нас есть реквизит ВидДокумента с типом Число. Посмотрим на пример правильного заполнения в модуле формы:


// В элементе формы "ВидДокумента" установлены свойства:
// РежимВыбораИзСписка = Истина
// КнопкаСпискаВыбора = Истина

Процедура ПриОткрытии()
    // Сначала очищаем список, чтобы избежать дублирования при повторных вызовах
    ЭлементыФормы.ВидДокумента.СписокВыбора.Очистить();
    
    // Добавляем значения: Значение (число) и Представление (строка)
    ЭлементыФормы.ВидДокумента.СписокВыбора.Добавить(0, "Поступление");
    ЭлементыФормы.ВидДокумента.СписокВыбора.Добавить(1, "Реализация");
    
    // Устанавливаем значение по умолчанию, если реквизит еще не заполнен
    Если Не ЗначениеЗаполнено(ВидДокумента) Тогда
        ВидДокумента = 0;
    КонецЕсли;
КонецПроцедуры

Где размещать код: ПриОткрытии или в операторах основного модуля?

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

  1. Производительность: Код в основной части модуля выполняется один раз при инициализации формы. Это позволяет подготовить данные до того, как форма будет представлена пользователю.
  2. Жизненный цикл: Процедура ПриОткрытии выполняется каждый раз, когда форма открывается. Если вы программно закрываете и открываете форму, код выполнится повторно.

Однако, если ваш список выбора зависит от параметров, переданных в форму (например, от прав пользователя или данных владельца), то заполнение должно происходить в процедурах ПередОткрытием или ПриОткрытии. В остальных случаях лучше прислушаться к рекомендациям ИТС и выносить инициализацию в тело модуля.

Важные свойства элемента управления

Даже если код написан верно, поле может не работать как выпадающий список без настройки свойств самого элемента формы. Разберем основные настройки:

Альтернативное решение: Использование Перечислений

Рассмотрим ситуацию шире: если вам нужно выбирать между "Поступлением" и "Реализацией", возможно, создавать список вручную — не самый лучший путь. В 1С для таких целей существует специальный объект метаданных — Перечисление.

Посмотрим на преимущества использования перечисления:

  1. Типизация: Система жестко контролирует возможные значения.
  2. Автоматизация: 1С сама сформирует выпадающий список на форме, вам не придется писать ни одной строки кода для заполнения СписокВыбора.
  3. Локализация: Представления значений легко настраиваются в конфигураторе.

Если же вы все-таки решили использовать программное заполнение (например, когда список должен меняться динамически), всегда помните о правиле: реквизит хранит значение, а СписокВыбора хранит варианты.

Заключение

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

← На главную