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