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