Как сохранить условное оформление окрашенных строк динамического списка при выделении курсором?

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

При работе с динамическими списками в 1С:Предприятии 8.3, особенно на управляемых формах, пользователи и разработчики часто сталкиваются с ситуацией, когда условное оформление строк, например, их окрашивание по определенным условиям, перестает быть видимым при выделении текущей строки курсором. Платформа по умолчанию подсвечивает выделенную строку стандартным голубым цветом, перекрывая тем самым заданное нами условное оформление. В этой статье мы подробно рассмотрим причину такого поведения и предложим несколько эффективных способов решения данной проблемы, основанных на опыте сообщества 1С.

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

Понимание проблемы: почему условное оформление исчезает?

Основная причина заключается в стандартном механизме платформы 1С по выделению текущей строки или ячейки. Когда вы устанавливаете курсор на строку в динамическом списке, платформа применяет к этой строке или ячейке собственный стиль выделения (как правило, голубой фон). Этот стиль имеет более высокий приоритет по сравнению с условным оформлением, заданным разработчиком через свойства динамического списка. Таким образом, условный цвет фона строки, который мы установили, перекрывается системным цветом выделения.

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

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

Решение 1: Комбинированное оформление — изменение цвета текста или шрифта

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

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

Разберем по шагам, как настроить комбинированное оформление:

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

  2. Перейдите на вкладку "Условное оформление": В свойствах динамического списка найдите вкладку "Условное оформление" и откройте ее. Здесь вы увидите список уже настроенных правил оформления или сможете добавить новое.

  3. Создайте или отредактируйте правило: Нажмите кнопку "Добавить" для создания нового элемента условного оформления или выберите существующее правило, которое вы хотите изменить.

  4. Укажите условие оформления: В окне настройки условного оформления перейдите на вкладку "Условие" и задайте логическое выражение, при выполнении которого будет применяться ваше оформление. Например, для просроченных заказов это может быть условие, сравнивающее дату отгрузки с текущей датой.

  5. Настройте параметры оформления: Перейдите на вкладку "Оформление".

    • Цвет фона: Выберите желаемый цвет фона (например, красный для просроченных заказов). Мы все равно его укажем, так как он будет виден, когда строка не выделена.

    • Цвет текста: Это критически важный шаг. Выберите контрастный или специфический цвет текста. Например, если фон красный, можно выбрать белый или ярко-желтый текст. Если фон зеленый, можно выбрать темно-зеленый или черный текст. Главное, чтобы он отличался от стандартного черного текста.

    • Шрифт: Дополнительно вы можете изменить шрифт. Например, установить флажок "Полужирный".

      Пример настройки шрифта:

      
      // Пример настройки через программное условное оформление
      // Хотя обычно это делается интерактивно через свойства
      // При интерактивной настройке вы просто выбираете галочку "Полужирный"
      // и задаете цвет текста из палитры.
      
      ЭлементУсловногоОформления = Элементы.ВашДинамическийСписок.УсловноеОформление.Элементы.Добавить();
      ГруппаПолей = ЭлементУсловногоОформления.Поля.Добавить();
      ГруппаПолей.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); // или другое ключевое поле
                      
      // Условие (пример)
      ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
      ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаОтгрузки");
      ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
      ЭлементОтбора.ПравоеЗначение = ТекущаяДата();
      
      // Оформление
      ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 100, 100)); // Красный
      ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(255, 255, 255)); // Белый
      ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Полужирный
      
  6. Примените оформление: Убедитесь, что список оформляемых полей пуст, если вы хотите применить оформление ко всей строке. Если вы хотите оформить только конкретные ячейки, укажите их в списке "Поля".

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

Решение 2: Использование свойства ЦветФонаВыделения

Платформа 1С предоставляет свойство ЦветФонаВыделения для элементов формы, которое позволяет контролировать цвет фона выделенных ячеек или строк. Идея заключается в том, чтобы попытаться установить этот цвет таким образом, чтобы он не перекрывал условное оформление или, по крайней мере, был более информативным.

Мы проанализируем, как можно "поиграться" с этим свойством, как было предложено в одном из сообщений форума:

  1. Доступ к свойству: Свойство ЦветФонаВыделения доступно в палитре свойств элемента формы (например, таблицы или поля ввода, связанного с данными динамического списка). Выберите ваш элемент формы (таблицу) в дереве элементов формы и найдите это свойство.

  2. Настройка цвета: Вы можете попытаться установить для ЦветФонаВыделения тот же цвет, что и в вашем условном оформлении. Однако, здесь есть несколько "но":

    • Приоритет: Не всегда ЦветФонаВыделения, установленный таким образом, будет иметь более высокий приоритет, чем стандартное выделение платформы, или же он может быть применен только к отдельной ячейке, а не ко всей строке, в зависимости от контекста и версии платформы.

    • Универсальность: Если у вас несколько правил условного оформления с разными цветами фона, установка одного ЦветФонаВыделения будет конфликтовать с остальными. Это свойство, как правило, устанавливается для всего элемента формы, а не динамически для каждой строки.

  3. Режим выделения строки: Также на форуме упоминалось свойство РежимВыделенияСтроки. Оно определяет, как будет выделяться строка — целиком или только текущая ячейка. Если установить РежимВыделенияСтроки в значение Ячейка, то при выделении курсором синим будет подсвечиваться только активная ячейка, а не вся строка. Остальные ячейки строки будут подсвечиваться светло-голубым. Это может помочь сохранить видимость условного фона на других ячейках строки, но не решит проблему для активной ячейки.

    Найти и изменить это свойство можно так:

    
    // Пример доступа к свойству РежимВыделенияСтроки в программном коде,
    // но чаще его настраивают интерактивно в свойствах таблицы.
    // ЭлементыФормы.ВашаТаблица.РежимВыделенияСтроки = РежимВыделенияСтрокиТаблицы.Ячейка;
    

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

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

Решение 3: Отключение выделения строки

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

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

Как отключить выделение строки:

  1. Найдите свойство "ВыделениеСтрок" или "РежимВыделенияСтроки": В свойствах элемента формы типа Таблица, который отображает динамический список, найдите свойство "ВыделениеСтрок" (в старых версиях платформы) или "РежимВыделенияСтроки" (в более новых версиях).

  2. Измените значение свойства:

    • Если есть свойство "ВыделениеСтрок", установите его в значение "Нет" или снимите соответствующий флажок.

    • Если есть свойство "РежимВыделенияСтроки", установите его в значение "Нет".

    Пример программного изменения (обычно это делается в конфигураторе):

    
    // В модуле формы ПриСозданииНаСервере
    // Элементы.ВашаТаблица.ВыделениеСтрок = Ложь; // Для старых версий или аналогичных свойств
    // Или
    // Элементы.ВашаТаблица.РежимВыделенияСтроки = РежимВыделенияСтрокиТаблицы.Нет;
    

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

Решение 4: Оформление отдельных ячеек вместо всей строки

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

Мы проанализируем преимущества этого подхода:

Как настроить оформление отдельных ячеек:

  1. Откройте свойства динамического списка и условного оформления: Как и в Решении 1, перейдите в свойства вашего динамического списка на вкладку "Условное оформление".

  2. Создайте или отредактируйте правило: Добавьте новое правило или выберите существующее.

  3. Укажите условие оформления: На вкладке "Условие" задайте логическое выражение для вашего правила.

  4. Настройте параметры оформления: На вкладке "Оформление" задайте цвет фона и/или цвет текста, шрифт.

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

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

Дополнительные рекомендации и замечания

Мы рассмотрим несколько важных аспектов, которые помогут нам глубже понять работу условного оформления и принять наиболее подходящее решение.

Версии платформы:

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

Программное управление условным оформлением:

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


// Пример программного добавления элемента условного оформления
// в модуле формы, например, в обработчике ПриСозданииНаСервере

// Получаем коллекцию условного оформления
УсловноеОформление = Элементы.ВашДинамическийСписок.УсловноеОформление;

// Создаем новый элемент оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// Настраиваем условие
Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Объект.ПолеСтатуса"); // Поле, по которому отбираем
Отбор.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = Перечисления.СтатусыДокументов.Просрочен; // Пример значения

// Настраиваем оформление
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 100, 100)); // Красный фон
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(255, 255, 255)); // Белый текст
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // Полужирный шрифт

// Если нужно оформить только конкретные поля, добавляем их
ПолеОформления = ЭлементОформления.Поля.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Объект.Номер");
ПолеОформления = ЭлементОформления.Поля.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Объект.Дата");

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

Психология пользователя:

При выборе решения всегда учитывайте удобство пользователя. Если отключение выделения строки делает интерфейс менее интуитивным, лучше использовать комбинированное оформление. Цель условного оформления — сделать информацию более наглядной, а не запутать пользователя.

Заключение

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

  1. Комбинированное оформление (цвет текста, шрифт): Наиболее универсальный и рекомендуемый подход, который позволяет сохранить визуальное отличие строки даже при ее выделении. Мы используем изменение цвета текста или шрифта в дополнение к цвету фона.

  2. Свойство ЦветФонаВыделения: Может быть полезно в специфических случаях, но не всегда универсально, особенно при наличии нескольких правил условного оформления.

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

  4. Оформление отдельных ячеек: Хороший компромисс, если мы хотим сохранить стандартное выделение строки, но при этом акцентировать внимание на ключевых данных внутри нее.

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

Надеемся, что этот подробный разбор поможет вам эффективно настроить условное оформление в ваших динамических списках и сделать интерфейс ваших приложений 1С более информативным и удобным для пользователей.

← На главную