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

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

Многие разработчики сталкиваются с тем, что при выделении строки таблицы в управляемых формах платформа 1С заливает все ячейки системным цветом (нежно-голубым в версии 8.2 или желтым в 8.3). Это полностью перекрывает или сильно искажает любую пользовательскую раскраску ячеек, заданную через условное оформление. Давайте разберем по шагам, как мы можем побороть этого "зверя" и вернуть контроль над дизайном наших форм.

Почему возникает проблема и как она меняется в версиях платформы

Проблема "назойливого выделения" является следствием глубокой интеграции платформы с системными цветами операционной системы и жесткой логики отрисовки интерфейса. Для анализа структуры элементов удобно использовать редактор форм в режиме предприятия. Рассмотрим подробнее, как это работает под капотом.

Ранее программисты пытались перехватывать вызовы системных библиотек, таких как gdi32.dll, чтобы изменить цвет фона на лету. Однако проанализируем ситуацию глубже: современные версии платформы (особенно в режиме "Такси", где доступна смена интерфейса с компактного на обычный) используют собственное графическое ядро для отрисовки элементов. Вызовы перехватить невозможно, а в Linux-клиентах эти библиотеки и вовсе отсутствуют.

Начиная с версии 8.3.13, разработчики платформы частично устранили проблему исчезновения заданной раскраски. Платформа перешла на другой алгоритм смешивания цветов. Теперь, если для ячейки задано условное оформление, системный цвет накладывается с определенной степенью прозрачности. Сквозь желтизну видно исходный цвет, но оттенок все равно искажается. Более того, в релизах 8.3.15+ добавилась жирная пунктирная рамка, которую программно убрать нельзя. Выясним причину наших дальнейших действий: чтобы получить чистый цвет, нам придется использовать обходные маневры.

Способ 1. Полная очистка выделения (Базовый метод)

Посмотрим на самый простой и популярный метод решения. Суть заключается в том, чтобы заставить платформу сбросить фокус выделения сразу после того, как пользователь кликнет на ячейку. Для этого мы задействуем событие таблицы ПриАктивизацииЯчейки.


&НаКлиенте
Процедура ТаблицаЗначенийПриАктивизацииЯчейки(Элемент)
    Элемент.ВыделенныеСтроки.Очистить();
КонецПроцедуры

Важное замечание: При использовании этого метода перестают работать стандартные сочетания клавиш и действия для работы со строками. Например, пользователи не смогут удалить строку кнопкой Delete или скопировать её, так как для системы ни одна строка физически не выделена. Если мы применяем этот метод, нам придется программно переопределять команды управления списком или обучать пользователей использовать отдельные кнопки на командной панели.

Способ 2. Имитация выделения через условное оформление

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

  1. Добавим в наши данные (например, в ДеревоЗначений или ТаблицуЗначений) скрытую колонку ИдСтроки типа Число.
  2. Добавим на форму два реквизита (это можно сделать через добавление элементов на форму без кодирования): ТекущаяКолонка (Строка) и ИдентификаторТекущейСтроки (Число).
  3. Настроим очистку стандартного выделения и запись текущих координат.

Разберем реализацию обработчиков активизации ячейки и строки:


&НаКлиенте
Процедура ДанныеПриАктивизацииЯчейки(Элемент)
    ТекущаяКолонка = Элементы.Данные.ТекущийЭлемент.Имя;
    Элементы.Данные.ВыделенныеСтроки.Очистить();
КонецПроцедуры

&НаКлиенте
Процедура ДанныеПриАктивизацииСтроки(Элемент)
    ИдентификаторТекущейСтроки = Элементы.Данные.ТекущаяСтрока;
КонецПроцедуры

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Общий элемент для всей строки
    ТекОф = Новый Структура("ЦветФона", Новый Цвет(205, 230, 255));
    ТекПредставление = "Цвет выделенной строки. Общий";
    УсловноеОформление.Элементы.Вставить(2).Представление = ТекПредставление;
    
    ТекОтбор = Новый Соответствие;
    ТекОтбор.Вставить("Данные.ИдСтроки", Новый ПолеКомпоновкиДанных("ИдентификаторТекущейСтроки"));
    УправляемыеФормыКлиентСервер.ИзменитьЭлементУсловногоОформления(УсловноеОформление, ТекОтбор, ТекОф, "Данные", ТекПредставление);
КонецПроцедуры

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

Способ 3. Перехват и восстановление цвета ячейки

Существует еще один интересный алгоритм. Мы можем изменить свойство таблицы формы РежимВыделения на значение Ячейка. Таким образом, платформа будет "портить" цвет только одной конкретной ячейки, а не всей строки. Затем мы можем программно сохранять предыдущий цвет ячейки и восстанавливать его.

Давайте посмотрим на пример такого клиентского кода:


&НаКлиенте
Перем ПрошлаяЯчейка, ПрошлыйФон;

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
    // Восстанавливаем фон предыдущей выделенной ячейки
    Если ПрошлаяЯчейка <> Неопределено И ПрошлаяЯчейка.ЦветФона <> ПрошлыйФон Тогда
        ПрошлаяЯчейка.ЦветФона = ПрошлыйФон;
    КонецЕсли;

    // Снимаем системное выделение
    Элементы.Список.ВыделенныеСтроки.Очистить();

    // Проверяем наличие данных, чтобы избежать ошибок при пустом списке
    Если Элемент.ТекущиеДанные <> Неопределено Тогда
        ПрошлаяЯчейка = Элемент.ТекущиеДанные[Элемент.ТекущийЭлемент.Имя + "ОформлениеЯчейки"];
        ПрошлыйФон = ПрошлаяЯчейка.ЦветФона;
        // Устанавливаем свой пользовательский цвет выделения
        ПрошлаяЯчейка.ЦветФона = Новый Цвет(201, 226, 255);
    КонецЕсли;
КонецПроцедуры

Этот метод хорошо работает в динамических списках и таблицах значений, но требует аккуратной обработки ситуаций, когда список фильтруется или становится пустым (отсюда проверка ТекущиеДанные <> Неопределено).

Способ 4. Изменение глобальных элементов стиля

Если нам нужно решить проблему радикально и на уровне всей конфигурации, давайте разберем подход с системными стилями. В дереве метаданных конфигурации есть ветка Общие -> Элементы стиля.

  1. Находим предопределенный элемент ЦветФонаВыделения (SelectionBackColor).
  2. Находим ЦветТекстаВыделения (SelectionTextColor).

Изменение этих цветов повлияет на все списки в приложении. Мы можем задать нейтральный, светлый тон или полупрозрачный оттенок. Это избавит нас от необходимости писать код очистки выделения в каждой форме платформы, однако этот метод лишает нас гибкости: мы не сможем индивидуально настраивать поведение выделения для разных таблиц.

Способ 5. Альтернативные подходы: Поле HTML документа и фокус

В завершение рассмотрим более экзотические, но эффективные сценарии. Иногда системное поведение 1С невозможно побороть стандартными свойствами.

Сброс фокуса: Системное выделение строки часто становится серым (менее ярким) или вовсе исчезает, когда таблица теряет активность. Мы можем создать на форме невидимую декорацию-надпись и при открытии формы программно передавать фокус на нее через ТекущийЭлемент = Элементы.ПустаяДекорация. Это "притушит" яркость таблицы в момент загрузки формы.

Поле HTML документа: Если дизайн критически важен (например, мы делаем красивый дашборд руководителя или рабочее место кассира), опытные разработчики рекомендуют полностью отказаться от стандартного элемента ТаблицаФормы. Вместо этого мы размещаем на форме Поле HTML документа. В нем, используя стандартную связку HTML + CSS + JavaScript, мы отрисовываем таблицу вручную. Это дает абсолютный контроль: мы можем реализовать любую анимацию, прозрачность, раскраску при наведении мыши (hover-эффекты) и полностью проигнорировать жесткие системные цвета платформы 1С.

← На главную