Работа с табличными частями в 1С:Предприятие 8.3 часто требует визуального выделения строк по определённым критериям — будь то статус документа, просроченные сроки или особые условия. В управляемых формах эта задача решается через механизмы условного оформления, но многие разработчики сталкиваются с нюансами реализации. Без правильной настройки раскраска может не сработать или привести к тормозам интерфейса.
В этой статье мы разберём все этапы: от базовой настройки условного оформления до оптимизации производительности при работе с большими таблицами. Вы узнаете, как применять динамическую раскраску на основе данных, избегать типичных ошибок и использовать ПолеЦвета для гибкого управления палитрой. Материал актуален для платформы 1С:Предприятие 8.3 (включая последние релизы) и подходит как для начинающих, так и для опытных программистов.
Особое внимание уделим двум ключевым подходам: условное оформление через конструктор (для простых задач) и программная раскраска (для сложной логики). Также рассмотрим, как интегрировать раскраску с другими элементами формы, например, с динамическими списками или деревом значений.
Почему стандартные методы раскраски не всегда работают
Многие разработчики пытаются раскрасить строки табличной части через свойство ЦветФона или ЦветТекста напрямую в модуле формы, но сталкиваются с тем, что изменения не применяются. Это происходит потому, что в управляемых формах визуальное оформление контролируется механизмом условного оформления (Conditional Formatting), который имеет приоритет над ручными настройками.
Кроме того, при работе с большими таблицами (например, более 1000 строк) динамическая раскраска может вызывать заметные задержки интерфейса, особенно если логика проверки условий сложная. Платформа 1С:Предприятие не оптимизирована для частого перерисовывания элементов формы, поэтому важно грамотно распределять нагрузку.
- 🔹 Проблема 1: Условное оформление не срабатывает, если не указано
ПолеДанныхв настройках таблицы. - 🔹 Проблема 2: Цвета, заданные программно, сбрасываются при обновлении формы.
- 🔹 Проблема 3: При использовании
ДеревоЗначенийраскраска работает иначе, чем в обычной таблице.
Чтобы избежать этих проблем, необходимо чётко понимать, как взаимодействуют между собой свойства формы, модуль управления и механизм условного оформления. В следующих разделах мы разберём каждый из этих аспектов на практике.
Базовая настройка условного оформления через конструктор
Самый простой способ раскрасить строки — использовать встроенный конструктор условного оформления. Он доступен в режиме редактирования формы и позволяет задавать правила визуального выделения без написания кода. Этот метод подходит для статичных условий, например, выделения строк с отрицательным количеством или просроченными датами.
Чтобы открыть конструктор:
- Откройте форму в Конфигураторе и перейдите на вкладку
Условное оформление. - Нажмите
Добавитьи выберите табличную часть, которую нужно раскрасить. - В поле
Условиеукажите выражение, например:Количество < 0. - Настройте
Цвет фонаиЦвет текстадля строк, удовлетворяющих условию.
Важно: конструктор создаёт правила в формате XML, которые хранятся в свойстве формы УсловноеОформление. Эти правила автоматически применяются при открытии формы, но их можно модифицировать и программно.
Указано корректное поле для условия (например, "Количество", а не "Сумма")
Цвета контрастны и видны на любом фоне
Условие не содержит сложных вычислений (во избежание тормозов)
Правило применено к нужной табличной части (если их несколько)-->
Программная раскраска строк: когда без кода не обойтись
Если логика выделения строк сложная (например, зависит от данных из других таблиц или требует динамического расчёта), придётся писать код в модуле формы. Для этого используется событие ПриАктивизацииСтроки или ПриИзменении, где можно программно задавать цвета.
Пример кода для раскраски строк по статусу документа:
&НаКлиенте
Процедура ТабличнаяЧастьТоварыПриАктивизацииСтроки(Элемент, Строка)
Если Строка.Статус = Перечисление.СтатусыДокументов.Просрочен Тогда
Элемент.ЦветФона = Новый Цвет(255, 200, 200); // Светло-красный
ИначеЕсли Строка.Статус = Перечисление.СтатусыДокументов.Оплачен Тогда
Элемент.ЦветФона = Новый Цвет(200, 255, 200); // Светло-зелёный
КонецЕсли;
КонецПроцедуры
Обратите внимание на два ключевых момента:
- 🔹 Код выполняется на клиенте, поэтому не нагружает сервер.
- 🔹 Цвета задаются через объект
Новый Цвет(R, G, B), где значения от 0 до 255.
Для динамического обновления раскраски при изменении данных используйте событие ПриИзменении:
&НаКлиенте
Процедура ТабличнаяЧастьТоварыПриИзменении(Элемент)
ОбновитьРаскраскуСтрок(Элемент);
КонецПроцедуры
Если раскраска не применяется, проверьте, что свойство табличной части РежимРедактирования установлено в РежимРедактированияТабличногоПоля.Управляемый. В противном случае события ПриАктивизацииСтроки могут не срабатывать.
Оптимизация производительности при раскраске больших таблиц
При работе с таблицами, содержащими более 500 строк, динамическая раскраска может существенно тормозить интерфейс. Это связано с тем, что платформа 1С:Предприятие перерисовывает каждую строку при изменении данных или прокрутке. Чтобы избежать задержек, следуйте этим рекомендациям:
| Проблема | Решение | Пример кода |
|---|---|---|
| Тормоза при прокрутке | Отключить раскраску для невидимых строк | Элемент.Видимость = Ложь; |
| Долгое обновление при изменении данных | Использовать ОтложенноеОбновление |
Элемент.ОтложенноеОбновление = Истина; |
| Сложные условия проверки | Выносить логику в отдельную функцию | Цвет = ПолучитьЦветДляСтроки(Строка); |
Для крайне больших таблиц (10 000+ строк) рассмотрите возможность использования виртуальных таблиц или постраничной загрузки. В этом случае раскраска применяется только к видимой части данных, что значительно ускоряет работу:
&НаКлиенте
Процедура ПриПрокруткеТаблицы(Элемент)
НачатьПозиция = Элемент.ТекущаяОбласть.НачальнаяСтрока;
ЗаканчиватьПозиция = Элемент.ТекущаяОбласть.КонечнаяСтрока;
Для Индекс = НачатьПозиция По ЗаканчиватьПозиция Цикл
Строка = Элемент.Данные[Индекс];
ОбновитьЦветСтроки(Элемент, Индекс, Строка);
КонецЦикла;
КонецПроцедуры
Для таблиц с более чем 1000 строк отдавайте предпочтение условному оформлению через конструктор — оно оптимизировано платформой и работает быстрее программной раскраски.
Раскраска строк в динамических списках и деревьях значений
Если табличная часть привязана к динамическому списку или ДеревуЗначений, подход к раскраске будет отличаться. В динамических списках условное оформление настраивается через свойство Отображение, а для ДереваЗначений требуется ручная обработка.
Пример раскраски строк в ДеревеЗначений:
&НаКлиенте
Процедура ДеревоТоварыПриАктивизацииСтроки(Элемент, Строка)
Если Строка.ТипЗначения = Тип("СправочникСсылка.Товары") Тогда
Если Строка.Ссылка.ПометкаУдаления Тогда
Элемент.ЦветФона = Новый Цвет(255, 220, 220); // Розовый для помеченных на удаление
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для динамических списков раскраска настраивается в Конфигураторе:
- Откройте форму с динамическим списком.
- Перейдите на вкладку
Реквизитыи выберите динамический список. - В свойстве
ОтображениенастройтеУсловное оформлениеаналогично обычной табличной части.
Важно: в динамических списках нельзя программно менять цвет строк через модуль формы — только через условное оформление. Это ограничение платформы 1С:Предприятие 8.3.
Как раскрасить строки в управляемой форме на мобильном клиенте?
На мобильном клиенте 1С:Предприятие механизм условного оформления работает ограниченно. Для раскраски строк используйте:
1. Свойство ЦветФона в событии ПриАктивизацииСтроки (аналогично десктопной версии).
2. Упрощённую логику — избегайте сложных условий, так как они могут тормозить интерфейс на слабых устройствах.
3. Тестируйте на целевых устройствах, так как отображение цветов может отличаться от десктопной версии.
Типичные ошибки и как их избежать
Даже опытные разработчики допускают ошибки при настройке раскраски строк. Вот наиболее распространённые из них и способы их решения:
⚠️ Внимание: Если вы используетеЦветФонаиЦветТекстаодновременно, убедитесь, что цвета контрастны. Например, белый текст на жёлтом фоне будет нечитаемым. Всегда тестируйте сочетания на реальных данных.
- 🚫 Ошибка 1: Раскраска не применяется к новым строкам.
Решение: В событииПриДобавленииСтрокивызовите процедуру обновления цвета. - 🚫 Ошибка 2: Цвета сбрасываются при сортировке таблицы.
Решение: Используйте событиеПриИзмененииОтображениядля повторного применения раскраски. - 🚫 Ошибка 3: Условное оформление конфликтует с программной раскраской.
Решение: Отключите условное оформление для столбцов, которые раскрашиваете в коде (Элемент.УсловноеОформление.Очистить()).
Ещё одна частая проблема — мерцание строк при прокрутке. Это происходит из-за того, что платформа постоянно перерисовывает элементы. Чтобы уменьшить мерцание:
- Сократите количество условий в условном оформлении.
- Используйте
ОтложенноеОбновление = Истинадля таблицы. - Применяйте раскраску только к видимым строкам (как показано в разделе об оптимизации).
Если раскраска всё равно работает некорректно, проверьте:
- 🔹 Наличие ошибок в коде (используйте
ПошаговаяОтладка). - 🔹 Правильность привязки табличной части к данным (свойство
ИсточникДанных). - 🔹 Версию платформы — в старых релизах 1С:Предприятие 8.2 некоторые методы могут не поддерживаться.
Практические примеры: раскраска по разным критериям
Рассмотрим несколько реальных сценариев, с которыми часто сталкиваются разработчики.
Пример 1: Раскраска по дате
Выделение строк с просроченными сроками (например, в табличной части ГрафикПлатежей):
&НаКлиенте
Процедура ТабличнаяЧастьГрафикПриАктивизацииСтроки(Элемент, Строка)
Если Строка.ДатаОплаты < ТекущаяДата() Тогда
Элемент.ЦветФона = Новый Цвет(255, 150, 150); // Красный для просроченных
ИначеЕсли Строка.ДатаОплаты = ТекущаяДата() Тогда
Элемент.ЦветФона = Новый Цвет(255, 255, 150); // Жёлтый для сегодняшней даты
КонецЕсли;
КонецПроцедуры
Пример 2: Раскраска по остаткам на складе
Выделение товаров с отрицательным или критически низким остатком:
&НаКлиенте
Процедура ТабличнаяЧастьТоварыПриАктивизацииСтроки(Элемент, Строка)
Остаток = Строка.Количество - Строка.Резерв;
Если Остаток < 0 Тогда
Элемент.ЦветФона = Новый Цвет(255, 200, 200); // Красный
ИначеЕсли Остаток < Строка.МинимальныйОстаток Тогда
Элемент.ЦветФона = Новый Цвет(255, 230, 200); // Оранжевый
КонецЕсли;
КонецПроцедуры
Пример 3: Раскраска по статусу заказа
Использование разных цветов для статусов "Новый", "В работе", "Выполнен":
&НаКлиенте
Функция ПолучитьЦветПоСтатусу(Статус)
Если Статус = Перечисление.СтатусыЗаказов.Новый Тогда
Возврат Новый Цвет(200, 200, 255); // Синий
ИначеЕсли Статус = Перечисление.СтатусыЗаказов.ВРаботе Тогда
Возврат Новый Цвет(255, 255, 200); // Жёлтый
ИначеЕсли Статус = Перечисление.СтатусыЗаказов.Выполнен Тогда
Возврат Новый Цвет(200, 255, 200); // Зелёный
КонецЕсли;
Возврат Неопределено;
КонецФункции
&НаКлиенте
Процедура ТабличнаяЧастьЗаказыПриАктивизацииСтроки(Элемент, Строка)
Цвет = ПолучитьЦветПоСтатусу(Строка.Статус);
Если Цвет <> Неопределено Тогда
Элемент.ЦветФона = Цвет;
КонецЕсли;
КонецПроцедуры
Для удобства можно вынести логику определения цвета в отдельную функцию (как в примере 3). Это упрощает поддержку кода и позволяет повторно использовать её в других формах.
FAQ: Ответы на частые вопросы
Как сделать, чтобы раскраска работала при печати формы?
Условное оформление, заданное через конструктор, автоматически применяется при печати, если используется стандартный механизм ПечатьФормы(). Для программной раскраски необходимо дублировать логику в модуле печати или использовать ТабличныйДокумент с ручной настройкой цветов.
Можно ли анимировать изменение цвета строк (например, мигание для важных уведомлений)?
Платформа 1С:Предприятие 8.3 не поддерживает анимацию элементов формы. Однако можно имитировать мигание, периодически меняя цвет строк через Таймер:
&НаКлиенте
Процедура ТаймерМигание(Таймер)
Для Каждого Строка Из ТабличнаяЧасть.Данные Цикл
Если Строка.Важное Тогда
Индекс = ТабличнаяЧасть.Данные.Индекс(Строка);
Если Мигает Тогда
ТабличнаяЧасть.ЭлементыФормы[Индекс].ЦветФона = Новый Цвет(255, 200, 200);
Иначе
ТабличнаяЧасть.ЭлементыФормы[Индекс].ЦветФона = Новый Цвет(255, 255, 255);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Мигает = Не Мигает;
КонецПроцедуры
Но помните, что частая смена цветов может раздражать пользователей и увеличивает нагрузку на интерфейс.
Почему при экспорте таблицы в Excel цвета строк пропадают?
При экспорте через ЗаписатьТабличныйДокумент() или КопироватьВБуферОбмена() цвета, заданные программно, не сохраняются. Чтобы передать раскраску в Excel, используйте:
- Создание
ТабличногоДокументас ручным заданием цветов. - Экспорт через COM-объект Excel (требует установленного Microsoft Office).
- Специализированные обработки для экспорта с сохранением оформления.
Как раскрасить только определённые ячейки в строке, а не всю строку?
Для раскраски отдельных ячеек используйте свойство УсловноеОформление конкретного столбца:
- В конструкторе формы выберите нужный столбец табличной части.
- Настройте условное оформление только для этого столбца (например, по значению ячейки).
- Для программной раскраски используйте
Элемент.ЭлементыФормы[ИндексСтроки].ЭлементыФормы[ИмяСтолбца].ЦветФона.
Пример:
Элемент.ЭлементыФормы[0].ЭлементыФормы["Количество"].ЦветФона = Новый Цвет(255, 200, 200);
Можно ли сохранить настройки раскраски для разных пользователей?
Да, для этого:
- Сохраните параметры раскраски (например, используемые цвета и условия) в
ХранилищеНастроекили справочник НастройкиПользователя. - При открытии формы загружайте индивидуальные настройки и применяйте их к условному оформлению.
- Для программной раскраски используйте переменные модуля формы, инициализируемые при запуске.
Пример сохранения настроек:
&НаКлиенте
Процедура СохранитьНастройкиРаскраски(ЦветПросрочки, ЦветОтрицательногоОстатка)
Настройки = Новый Структура("ЦветПросрочки, ЦветОтрицательногоОстатка",
ЦветПросрочки, ЦветОтрицательногоОстатка);
ХранилищеНастроек.Сохранить("РаскраскаТаблицыТовары", Настройки);
КонецПроцедуры