При разработке интерфейсов на управляемых формах программисты часто сталкиваются с неприятной особенностью платформы 1С:Предприятие 8.3: стандартное синее выделение активной строки полностью перекрывает настройки Условного оформления. Если вы настроили подсветку строк (например, зеленым для выполненных заказов (поможет раскраска строк по статусам в списках 1С) или красным для просроченных), то при активации такой строки пользователем она становится синей, и информативность интерфейса теряется. В этой статье мы подробно разберем, как обойти это ограничение и заставить таблицу отображать нужные нам цвета даже для текущей строки.
Проанализируем ситуацию: в платформе 1С существует строгая иерархия отрисовки элементов. Системное выделение (фокус) имеет высший приоритет над параметрами УсловногоОформления. Цвет этого выделения задается на уровне системных стилей конфигурации (параметр Цвет фона выделения). Поскольку платформа проектировалась для обеспечения доступности и навигации с клавиатуры, разработчики жестко закрепили индикацию фокуса. Однако существуют программные методы, позволяющие "обмануть" этот механизм или изменить его поведение.
Рассмотрим наиболее популярный метод, который заключается в принудительном снятии системного выделения при активации строки. Таким образом, строка перестает быть "синей", и на первый план выходит ваш цвет из условного оформления. Чтобы пользователь понимал, какая строка сейчас выбрана, мы будем использовать альтернативный маркер (например, жирный шрифт или символ-стрелку в отдельной колонке) — для этого подойдёт графические маркеры и иконки в списках 1С.
Разберем по шагам реализацию этого метода в модуле формы:
ТекущийНомерСтрокиДляОформления (тип Число).ПриАктивизацииЯчейки (или ПриАктивизацииСтроки) пропишем следующий код:
&НаКлиенте
Процедура ТоварыПриАктивизацииЯчейки(Элемент)
// 1. Очищаем коллекцию выделенных строк, чтобы убрать синий фон
Элементы.Товары.ВыделенныеСтроки.Очистить();
// 2. Получаем идентификатор текущей строки
ТекИдентификатор = Элементы.Товары.ТекущаяСтрока;
Если ТекИдентификатор <> Неопределено Тогда
// Находим данные строки для получения ее номера или другого признака
СтрокаДанных = Объект.Товары.НайтиПоИдентификатору(ТекИдентификатор);
// Записываем признак текущей строки в реквизит для Условного Оформления
ТекущийНомерСтрокиДляОформления = СтрокаДанных.НомерСтроки;
КонецЕсли;
КонецПроцедуры
Важный нюанс: при использовании метода ВыделенныеСтроки.Очистить() визуальный фокус пропадает. Чтобы пользователь не терялся, в условном оформлении рекомендуется добавить правило: если НомерСтроки = ТекущийНомерСтрокиДляОформления, то установить Шрифт в положение Жирный. Также можно использовать генератор форматированной строки, чтобы добавить вычисляемую колонку, которая будет выводить символ ">" для активной строки.
Если ваша таблица является Динамическим списком, мы можем применить более продвинутый метод, который работает на уровне подготовки данных для отрисовки. Выясним причину, почему обычное обращение к оформлению строки часто не дает результата: данные оформления ячеек инициализируются платформой не сразу.
Посмотрим на пример кода, который позволяет программно управлять оформлением каждой ячейки:
&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого СтрокаСписка Из Строки Цикл
// Инициализируем доступ к оформлению (хак для платформы)
Оформление = СтрокаСписка.Значение.Оформление[""];
// Теперь мы можем динамически менять свойства, например:
// Если выполняется бизнес-условие, принудительно ставим цвет
Если СтрокаСписка.Значение.Статус = Перечисления.СтатусыЗаказов.Выполнен Тогда
СтрокаСписка.Значение.Оформление["Наименование"].УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод более производителен для больших списков, так как оформление применяется только к видимым на экране строкам. Однако стоит помнить, что системное выделение активной строки все равно может накладываться сверху в зависимости от настроек платформы.
Проанализируем свойства самой таблицы в редакторе формы. У объекта Таблица есть свойство РежимВыделения. По умолчанию установлено значение Выделение строки. Для подобных задач кастомизации есть модуль настройки интерфейса без программирования.
Если задача позволяет, попробуем изменить этот режим на Выделение ячейки. В этом случае:
УсловномОформлении.Это компромиссное решение, которое не требует сложного кода и сохраняет навигацию с клавиатуры в рабочем состоянии.
Если ваша задача — полностью избавиться от яркого синего цвета во всей программе (например, вы создаете специализированный терминальный интерфейс), можно изменить системный стиль. Рассмотрим этот путь:
Цвет фона выделения на более нейтральный (например, светло-серый) или максимально близкий к белому.Внимание: это изменение затронет абсолютно все формы, списки и документы в информационной базе. Используйте этот метод только в том случае, если дизайн-код системы предполагает отсутствие контрастного выделения.
При реализации вышеуказанных методов важно учитывать среду выполнения. Проанализируем типичные проблемы:
Мобильная платформа: Метод ВыделенныеСтроки.Очистить() в мобильном приложении может работать нестабильно или игнорироваться системными драйверами отрисовки Android/iOS. В мобильных решениях рекомендуется использовать Поле HTML-документа для создания сложных цветных списков, так как стандартные таблицы там имеют крайне ограниченные возможности кастомизации.
Web-клиент: В браузере цвет выделения часто определяется CSS-классами. Если база опубликована на веб-сервере, опытные разработчики иногда внедряют собственные CSS-файлы, чтобы переопределить класс .grid-row-selected, сделав его прозрачным. Однако это не является штатным средством 1С и может перестать работать при обновлении платформы.
Мы разобрали несколько стратегий борьбы с системным цветом выделения строки. Наиболее универсальным и безопасным для программиста является Способ 1 (сочетание Очистить() и визуальных маркеров в условном оформлении). Он позволяет сохранить полный контроль над цветовой гаммой интерфейса, не жертвуя при этом логикой работы управляемых форм.