Визуальное выделение данных в табличных частях документов или справочников — это одна из наиболее частых задач, с которыми сталкивается разработчик 1С. Цветовая индикация позволяет пользователю мгновенно определить статус строки, наличие задолженности или выполнение условий, не вчитываясь в текстовые значения. В этой статье мы подробно разберем, как реализовать раскраску строк в 1С:Предприятие 8 на обычных формах, проанализируем основные события табличного поля и научимся избегать типичных ошибок начинающих разработчиков.
Представим ситуацию: в документе есть табличная часть с колонкой Статус. Данная колонка заполнена значениями из перечисления, которое имеет два значения: Да и Нет. Наша цель — сделать так, чтобы при выборе значения Да вся строка окрашивалась в зеленый цвет, а при выборе Нет — в красный. Рассмотрим, как это реализовать оптимальным способом.
В обычных формах 1С для оформления табличного поля чаще всего используются два события. Разберем их различия, чтобы понять, какое выбрать в нашей ситуации.
Событие ПриВыводеСтроки вызывается для каждой строки в отдельности в тот момент, когда она отрисовывается на экране. Оно простое в использовании, но таит в себе опасность: если внутри этого обработчика вы напишете неоптимальный код (например, запрос к базе данных через точку от реквизита ДанныеСтроки.Ссылка.Реквизит), форма начнет заметно «тормозить» при прокрутке, так как 1С будет выполнять запрос для каждой видимой строки.
Событие ПриПолученииДанных является более предпочтительным с точки зрения производительности. Оно вызывается один раз для всей совокупности строк, которые платформа планирует отобразить в данный момент. Это позволяет получить все необходимые дополнительные данные одним запросом (если это требуется) и массово применить оформление.
Рассмотрим подробнее реализацию через ПриПолученииДанных, так как это «золотой стандарт» разработки в 1С.
Для того чтобы раскрасить строки, нам нужно создать обработчик этого события у табличного поля. Проанализируем пример кода, который решает нашу задачу:
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
// Перебираем коллекцию оформлений строк, переданных платформой
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
// Получаем данные текущей строки.
// Важно: работаем именно с объектом ОформлениеСтроки.ДанныеСтроки
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
// Проверяем условие на основе значения перечисления
Если ДанныеСтроки.Статус = Перечисления.Долг.Да Тогда
// Устанавливаем цвет фона всей строки
ОформлениеСтроки.ЦветФона = Новый Цвет(200, 255, 200); // Светло-зеленый
ОформлениеСтроки.ЦветТекста = WebЦвета.Черный;
ИначеЕсли ДанныеСтроки.Статус = Перечисления.Долг.Нет Тогда
// Устанавливаем красный цвет для отрицательного статуса
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 200, 200); // Светло-красный
ОформлениеСтроки.ЦветТекста = WebЦвета.Черный;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важный нюанс: Обратите внимание на различие между объектами. В ходе обсуждения на форуме возникла типичная ошибка: попытка присвоить цвет напрямую свойству ДанныеСтроки.ЦветФона. Это не сработает, так как ДанныеСтроки — это данные из вашей табличной части (структура или строка ТЧ), у которых нет визуальных свойств. Цвет, шрифт и видимость настраиваются исключительно через объект ОформлениеСтроки.
Многие пользователи замечают, что при изменении статуса в строке цвет не меняется мгновенно — нужно либо прокрутить таблицу, либо кликнуть по другой строке. Это происходит потому, что события оформления вызываются только при отрисовке. Выясним, как заставить форму обновиться сразу.
Для этого в обработчике события ПриИзменении той колонки, которая влияет на цвет (в нашем случае — колонка Статус), нужно добавить принудительное обновление строк табличного поля:
Процедура ТоварыСтатусПриИзменении(Элемент)
// ЭлементыФормы.Товары — это имя вашего табличного поля на форме
ЭлементыФормы.Товары.ОбновитьСтроки();
КонецПроцедуры
Метод ОбновитьСтроки() дает сигнал платформе, что визуальное состояние данных изменилось, и нужно снова вызвать ПриПолученииДанных.
Если логика оформления очень простая и не требует дополнительных обращений к серверу или базе данных, можно использовать событие ПриВыводеСтроки. Рассмотрим пример для этого случая:
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Здесь мы сразу получаем объект оформления и данные конкретной строки
Если ДанныеСтроки.Статус = Перечисления.Долг.Да Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.ЗеленоватоЖелтый;
Иначе
ОформлениеСтроки.ЦветФона = WebЦвета.БледноКрасноФиолетовый;
КонецЕсли;
КонецПроцедуры
Этот метод кажется лаконичнее, так как не требует цикла Для каждого, но помните о производительности при работе с большими списками.
В примерах выше мы использовали несколько способов задания цвета. Проанализируем их подробнее:
Новый Цвет(R, G, B) — позволяет задать точный оттенок, используя значения красного, зеленого и синего от 0 до 255. Это удобно для подбора мягких пастельных тонов, которые не будут «резать» глаза пользователю.WebЦвета — содержит большой набор предопределенных именованных цветов (например, WebЦвета.Золотистый или WebЦвета.СветлоСерый). Это упрощает код и делает его более читаемым.ЦветаСтиля. Если вы укажете цвет стиля (например, ЦветаСтиля.ФонВыделеннойСтроки), ваше оформление будет автоматически подстраиваться под общую тему оформления, выбранную пользователем в Windows или настройках 1С.Иногда требуется выделить цветом не всю строку, а только конкретную ячейку, чтобы акцентировать внимание пользователя на важном поле. В этом случае мы обращаемся к коллекции Ячейки объекта оформления:
// Пример раскраски только одной ячейки "Статус"
ОформлениеСтроки.Ячейки.Статус.ЦветФона = WebЦвета.Красный;
ОформлениеСтроки.Ячейки.Статус.ТолькоПросмотр = Истина;
Через объект ячейки можно также управлять текстом, его отображением, шрифтом и даже доступностью для редактирования прямо в процессе вывода данных.
Проанализируем ситуацию из обсуждения, когда разработчик получал ошибку «Поле объекта не обнаружено (Статус)». Это происходило из-за попытки обратиться к СтрокаСписка.Статус. Помните: СтрокаСписка (или ОформлениеСтроки) — это служебный объект оформления. Сами данные вашей таблицы «спрятаны» внутри свойства ДанныеСтроки. Поэтому правильный путь всегда выглядит так: ОформлениеСтроки.ДанныеСтроки.ВашеИмяПоля.
Также стоит проверять ДанныеСтроки на пустое значение (Неопределено), особенно если в таблице разрешено добавление новых строк. В момент создания новой строки данных в ней может еще не быть, и обращение к свойству Статус вызовет ошибку выполнения.
Мы рассмотрели основные механизмы управления цветом в обычных формах 1С. Подведем итог: для массовой и быстрой отрисовки используйте ПриПолученииДанных, не забывайте про ОбновитьСтроки() при изменении данных пользователем и всегда разделяйте объекты данных и объекты оформления. Использование этих правил позволит вам создавать профессиональные и удобные интерфейсы, которые по достоинству оценят пользователи вашей системы.