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