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