Как изменить цвет текста в ячейке таблицы 1С при изменении расчетного значения?

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

При разработке учетных систем часто возникает задача визуального контроля: если колонка таблицы обычно рассчитывается автоматически (например, сумма, скидка или плановая дата), но пользователь отредактировал её вручную, ячейку необходимо выделить цветом. Разберем, какими инструментами платформы 1С:Предприятие решается данная задача в зависимости от типа формы и вида таблицы.

Для начала выясним причину разницы в подходах. Выбор конкретного метода оформления зависит от того, с каким объектом мы работаем:

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

Реализация в управляемых формах через условное оформление

В управляемых формах изменение цвета у колонки через коллекцию Элементы.ИмяКолонки приведет к перекрашиванию всей колонки целиком во всех строках. Единственным штатным и производительным способом индивидуальной раскраски является Условное оформление (коллекция УсловноеОформление).

Рассмотрим подробнее два сценария реализации в управляемом интерфейсе.

Вариант 1. Без создания дополнительного реквизита (через сравнение данных)

Если значение колонки можно однозначно перепроверить по простой формуле (к примеру, Сумма должна равняться Количество * Цена), нам не требуется хранить отдельный признак изменения. Достаточно настроить условное оформление, которое будет автоматически подсвечивать ячейку, если введенное значение не совпадает с расчетным:

  1. В коллекцию УсловноеОформление добавляем новый элемент.
  2. В отборе указываем условие: поле Объект.Товары.Сумма не равно полю Объект.Товары.Количество, помноженному на цену (или проверяем разницу).
  3. В оформляемые поля добавляем элемент ТоварыСумма.
  4. В параметрах оформления устанавливаем свойство ЦветТекста.

Плюс этого метода заключается в том, что подсветка снимется автоматически, если пользователь вернет расчетное значение обратно.

Вариант 2. С использованием флага ручной корректировки

Если алгоритм расчета сложный или зависит от внешних данных (курсов валют, сложных скидок, остатков), целесообразно фиксировать факт изменения пользователем. Для этого добавим булевый признак, например ИзмененоВручную.

Разберем по шагам реализацию данного варианта:

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

Реализация в обычных формах (Табличное поле)

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

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

Реализация в Поле табличного документа

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


Область = Элементы.ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
Область.ЦветТекста = WebЦвета.Красный;

Хранение признака изменения

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

  1. Только на время сеанса редактирования: если факт изменения нужен исключительно в момент ввода документа, признак ИзмененоВручную можно объявить как реквизит формы, колонку таблицы значений на форме или рассчитывать динамически.
  2. Постоянное хранение в базе: если раскраска должна сохраняться после проведения, закрытия и повторного открытия объекта, реквизит с типом Булево обязательно добавляется в состав реквизитов табличной части объекта метаданных в конфигураторе.
← На главную