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