Как в колонке таблицы на управляемых формах отображать представление из списка выбора?

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

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

Разберем, почему платформа 1С:Предприятие 8 ведет себя подобным образом и какими способами можно добиться корректного отображения представлений для пользователя.

Выясним причину такого поведения платформы

Проанализируем разницу в архитектуре отображения отдельного элемента управления на форме и ячейки таблицы:

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

Способ 1. Использование условного оформления

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

Если вариантов выбора немного и они фиксированы, условное оформление можно настроить интерактивно в свойствах формы. Однако при динамическом заполнении списка выбора правила условного оформления необходимо формировать программно на сервере.

Разберем по шагам реализацию программной настройки условного оформления:


&НаСервере
Процедура НастроитьОтображениеСпискаВыбораНаСервере()

    // Очистим ранее добавленные элементы списка выбора у поля колонки
    Колонка = Элементы.ТаблицаТестИмяКолонки;
    Колонка.СписокВыбора.Очистить();

    Для Сч = 1 По 10 Цикл
        ЗначениеЭлемента = Сч;
        ПредставлениеЭлемента = "Представление #" + Сч;

        // Заполняем список выбора для режима редактирования
        Колонка.СписокВыбора.Добавить(ЗначениеЭлемента, ПредставлениеЭлемента);

        // Создаем элемент условного оформления для отображения в обычном режиме
        ЭлементУО = УсловноеОформление.Элементы.Добавить();

        // 1. Устанавливаем оформляемый параметр "Текст"
        ЭлементУО.Оформление.УстановитьЗначениеПараметра("Текст", ПредставлениеЭлемента);

        // 2. Указываем условие: когда значение в колонке равно нашему значению
        ЭлементУсловия = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТаблицаТест.ИмяКолонки");
        ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементУсловия.ПравоеЗначение = ЗначениеЭлемента;
        ЭлементУсловия.Использование = Истина;

        // 3. Указываем оформляемое поле интерфейса
        ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаТестИмяКолонки");
        ОформляемоеПоле.Использование = Истина;
    КонецЦикла;

КонецПроцедуры

Важный момент: в свойстве ЛевоеЗначение отбора обязательно указывается путь к данным строки таблицы (например, Объект.ТаблицаТест.ИмяКолонки или ТаблицаТест.ИмяКолонки), а в коллекции Поля условного оформления указывается имя элемента формы (колонки).

Способ 2. Разделение данных на две колонки (значение и представление)

Рассмотрим альтернативный и простой архитектурный подход. Если список динамический, очень длинный или часто меняется, создание сотен правил условного оформления может замедлить работу формы. В этом случае эффективнее разделить хранение значения и его визуальное представление на две колонки:

  1. В строке таблицы заводим два реквизита: скрытый (например, КодЗначения с типом Число) и видимый (ТекстовоеПредставление с типом Строка).
  2. На форме отображаем только колонку ТекстовоеПредставление, отключаем стандартный режим выбора из списка и перехватываем интерактивный выбор через событие.

Посмотрим на пример обработки события НачалоВыбора:


&НаКлиенте
Процедура ТаблицаТестТекстовоеПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    СписокДляВыбора = Новый СписокЗначений;
    Для Сч = 1 По 10 Цикл
        СписокДляВыбора.Добавить(Сч, "Представление #" + Сч);
    КонецЦикла;

    Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект);
    ПоказатьВыборИзСписка(Оповещение, СписокДляВыбора, Элемент);

КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт

    Если ВыбранныйЭлемент = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ТекущиеДанные = Элементы.ТаблицаТест.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ТекущиеДанные.ТекстовоеПредставление = ВыбранныйЭлемент.Представление;
        ТекущиеДанные.КодЗначения = ВыбранныйЭлемент.Значение;
    КонецЕсли;

КонецПроцедуры

В результате пользователь видит понятный текст представления, а вся прикладная логика программы может опираться на внутреннее значение из скрытой колонки.

Способ 3. Использование перечислений или ссылочных типов

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

  1. Платформа 1С берет на себя автоматическое сопоставление имени значения перечисления и его синонима (представления).
  2. Таблица в управляемой форме нативно отображает синонимы перечислений как в режиме просмотра, так и при редактировании без написания дополнительного программного кода.

Если же значения формируются на основе ссылочных справочников или планов видов характеристик, вывод представления можно переопределить на уровне модуля менеджера соответствующего объекта с помощью процедур ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления. В таком случае ячейка таблицы автоматически отобразит сформированную строку.

← На главную