Почему пропадают значения в поле с режимом выбора из списка при открытии формы 1С?

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

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

Причина возникновения проблемы

Основная причина «исчезновения» данных заключается в механизме работы СписокВыбора в управляемом интерфейсе. Когда форма открывается, платформа считывает значение из реквизита объекта и пытается найти его в элементах управления на форме. Если СписокВыбора не сформирован к моменту считывания данных или если сохраненное значение отсутствует в текущем списке, платформа считает такое значение невалидным (не соответствующим допустимым вариантам) и принудительно очищает поле ввода, чтобы избежать несоответствия данных.

Вариант решения №1: Правильная инициализация списка

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

Рассмотрим пример кода для инициализации списка при открытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ТекГод = Формат(Число(ГОД(Объект.Дата)), "ЧГ=0");
    СписокДляВыбора = Элементы.ПериодНачисления.СписокВыбора;
    СписокДляВыбора.Очистить();
    
    СписокДляВыбора.Добавить("Январь " + ТекГод);
    СписокДляВыбора.Добавить("Февраль " + ТекГод);
    // ... и так далее для всех месяцев
КонецПроцедуры

Важно: Если вы используете метод Добавить() с двумя параметрами (значение и представление), убедитесь, что в базу записывается именно Значение. Если представление отличается от значения, при открытии формы платформа может не найти соответствие.

Вариант решения №2: Настройка отображения без принудительного режима выбора

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

  1. В палитре свойств реквизита на форме снимите флажок РежимВыбораИзСписка.
  2. Установите свойство КнопкаСпискаВыбора (или «Кнопка выбора») в значение Истина или Да.
  3. При таком подходе кнопка выбора будет отображаться, но платформа перестанет принудительно очищать поле, если текущее значение не найдено в списке выбора.

Вариант решения №3: Архитектурно правильный подход — использование типа «Дата»

Хранение периода (месяца и года) в виде строки — это распространенная ошибка проектирования, которая в будущем усложнит построение отчетов и аналитику. Мы рекомендуем использовать тип данных Дата для хранения таких реквизитов.

Разберем, как сделать это удобно для пользователя:

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

Заключение и рекомендации

Проанализировав ситуацию, можно выделить следующие правила для стабильной работы:

Надеемся, эти советы помогут вам избежать «шайтанов» в коде и сделать интерфейс вашей программы максимально надежным!

← На главную