При разработке управляемых форм часто возникает ситуация: на форме размещен выпадающий список выбора, где каждому скрытому значению (например, числовому идентификатору или служебному коду) сопоставлено текстовое представление. Если такое поле находится непосредственно на форме, то при выборе элемента в поле отображается заданное представление. Однако, если перенести точно такое же поле в колонку таблицы (динамического списка или таблицы значений), после окончания редактирования в ячейке отображается само значение (например, число или код), а не его текстовое представление.
Разберем, почему платформа 1С:Предприятие 8 ведет себя подобным образом и какими способами можно добиться корректного отображения представлений для пользователя.
Проанализируем разницу в архитектуре отображения отдельного элемента управления на форме и ячейки таблицы:
РежимВыбораИзСписка поле ввода сопоставляет текущее значение связанного реквизита со своей коллекцией СписокВыбора и корректно выводит найденное строковое представление.Рассмотрим основной способ решения, когда менять структуру данных нежелательно. С помощью механизма условного оформления формы можно принудительно подменить отображаемый текст в ячейке в зависимости от хранящегося в ней значения.
Если вариантов выбора немного и они фиксированы, условное оформление можно настроить интерактивно в свойствах формы. Однако при динамическом заполнении списка выбора правила условного оформления необходимо формировать программно на сервере.
Разберем по шагам реализацию программной настройки условного оформления:
&НаСервере
Процедура НастроитьОтображениеСпискаВыбораНаСервере()
// Очистим ранее добавленные элементы списка выбора у поля колонки
Колонка = Элементы.ТаблицаТестИмяКолонки;
Колонка.СписокВыбора.Очистить();
Для Сч = 1 По 10 Цикл
ЗначениеЭлемента = Сч;
ПредставлениеЭлемента = "Представление #" + Сч;
// Заполняем список выбора для режима редактирования
Колонка.СписокВыбора.Добавить(ЗначениеЭлемента, ПредставлениеЭлемента);
// Создаем элемент условного оформления для отображения в обычном режиме
ЭлементУО = УсловноеОформление.Элементы.Добавить();
// 1. Устанавливаем оформляемый параметр "Текст"
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Текст", ПредставлениеЭлемента);
// 2. Указываем условие: когда значение в колонке равно нашему значению
ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТаблицаТест.ИмяКолонки");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = ЗначениеЭлемента;
ЭлементУсловия.Использование = Истина;
// 3. Указываем оформляемое поле интерфейса
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаТестИмяКолонки");
ОформляемоеПоле.Использование = Истина;
КонецЦикла;
КонецПроцедуры
Важный момент: в свойстве ЛевоеЗначение отбора обязательно указывается путь к данным строки таблицы (например, Объект.ТаблицаТест.ИмяКолонки или ТаблицаТест.ИмяКолонки), а в коллекции Поля условного оформления указывается имя элемента формы (колонки).
Рассмотрим альтернативный и простой архитектурный подход. Если список динамический, очень длинный или часто меняется, создание сотен правил условного оформления может замедлить работу формы. В этом случае эффективнее разделить хранение значения и его визуальное представление на две колонки:
КодЗначения с типом Число) и видимый (ТекстовоеПредставление с типом Строка).ТекстовоеПредставление, отключаем стандартный режим выбора из списка и перехватываем интерактивный выбор через событие.Посмотрим на пример обработки события НачалоВыбора:
&НаКлиенте
Процедура ТаблицаТестТекстовоеПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокДляВыбора = Новый СписокЗначений;
Для Сч = 1 По 10 Цикл
СписокДляВыбора.Добавить(Сч, "Представление #" + Сч);
КонецЦикла;
Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект);
ПоказатьВыборИзСписка(Оповещение, СписокДляВыбора, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = Элементы.ТаблицаТест.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
ТекущиеДанные.ТекстовоеПредставление = ВыбранныйЭлемент.Представление;
ТекущиеДанные.КодЗначения = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
В результате пользователь видит понятный текст представления, а вся прикладная логика программы может опираться на внутреннее значение из скрытой колонки.
Проанализируем типовые механизмы платформы 1С. Если набор доступных вариантов заранее известен на этапе конфигурирования, оптимальным решением будет создание объекта метаданных Перечисление:
Если же значения формируются на основе ссылочных справочников или планов видов характеристик, вывод представления можно переопределить на уровне модуля менеджера соответствующего объекта с помощью процедур ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления. В таком случае ячейка таблицы автоматически отобразит сформированную строку.