В процессе разработки на управляемых формах 1С мы часто сталкиваемся с задачами, когда пользователю необходимо выбрать значение из заранее определенного набора вариантов. Использование свойства РежимВыбораИзСписка кажется простым и удобным решением. Однако нередко возникает странная на первый взгляд ситуация: мы сохраняем документ с выбранным значением (или настраиваем сохранение настроек формы для всех пользователей), а при повторном открытии это поле оказывается пустым. Давайте разберемся, почему так происходит и как заставить платформу корректно отображать данные.
Основная причина «исчезновения» данных заключается в механизме работы СписокВыбора в управляемом интерфейсе. Когда форма открывается, платформа считывает значение из реквизита объекта и пытается найти его в элементах управления на форме. Если СписокВыбора не сформирован к моменту считывания данных или если сохраненное значение отсутствует в текущем списке, платформа считает такое значение невалидным (не соответствующим допустимым вариантам) и принудительно очищает поле ввода, чтобы избежать несоответствия данных.
Если вы твердо решили использовать режим выбора из списка (выполняя программное изменение форм), необходимо обеспечить его заполнение до того, как форма «покажет» пользователю сохраненное значение. Заполнение в обработчике события ПриОткрытии на клиенте — это базовый шаг, но важно убедиться, что список содержит именно то значение, которое было сохранено в базе.
Рассмотрим пример кода для инициализации списка при открытии:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ТекГод = Формат(Число(ГОД(Объект.Дата)), "ЧГ=0");
СписокДляВыбора = Элементы.ПериодНачисления.СписокВыбора;
СписокДляВыбора.Очистить();
СписокДляВыбора.Добавить("Январь " + ТекГод);
СписокДляВыбора.Добавить("Февраль " + ТекГод);
// ... и так далее для всех месяцев
КонецПроцедуры
Важно: Если вы используете метод Добавить() с двумя параметрами (значение и представление), убедитесь, что в базу записывается именно Значение. Если представление отличается от значения, при открытии формы платформа может не найти соответствие.
Часто проблему можно решить, изменив подход к интерфейсу. Если вам не требуется жесткая проверка того, что пользователь может выбрать только из списка (или если список слишком динамичный), попробуйте выполнить следующие шаги:
РежимВыбораИзСписка.КнопкаСпискаВыбора (или «Кнопка выбора») в значение Истина или Да.Хранение периода (месяца и года) в виде строки — это распространенная ошибка проектирования, которая в будущем усложнит построение отчетов и аналитику. Мы рекомендуем использовать тип данных Дата для хранения таких реквизитов.
Разберем, как сделать это удобно для пользователя:
Дата.Формат.ДФ='MMMM yyyy'.При такой настройке 1С будет хранить данные как полноценную дату (что позволяет легко выполнять отборы в запросах, в том числе сортировку и сравнение), а пользователь будет видеть красивое строковое представление «Январь 2023». Для выбора даты можно использовать стандартный календарь, что значительно удобнее для пользователя, чем поиск в длинном выпадающем списке.
Проанализировав ситуацию, можно выделить следующие правила для стабильной работы:
РежимВыбораИзСписка, убедитесь, что список заполняется на сервере при создании формы (ПриСозданииНаСервере). Это гарантирует, что данные будут сопоставлены корректно в момент отрисовки элементов.Объект значение в точности совпадает со строковым представлением в списке выбора (включая пробелы и спецсимволы).Дата с правильным форматированием решает проблему «исчезновения» значений на уровне архитектуры данных.Надеемся, эти советы помогут вам избежать «шайтанов» в коде и сделать интерфейс вашей программы максимально надежным!