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

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

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

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

Основы работы с обработчиком "ПриПолученииДанных" для динамического списка

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

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

Рассмотрим базовый пример изменения цвета текста всей строки или ее доступности. Если нам нужно, чтобы вся строка меняла цвет или становилась недоступной, мы можем напрямую работать со свойствами объекта ОформлениеСтроки.

Предположим, у нас есть динамический список, отображающий элементы справочника "Номенклатура". Мы хотим выделить красным цветом те позиции, остаток которых равен нулю, чтобы пользователь сразу видел отсутствующие товары.


&НаКлиенте
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Проверяем условие, например, остаток равен 0
        Если ОформлениеСтроки.ДанныеСтроки.Остаток = 0 Тогда
            // Устанавливаем красный цвет текста для всей строки
            ОформлениеСтроки.ЦветТекста = Новый Цвет(255, 0, 0); // Красный цвет (RGB)
            // Также можем сделать всю строку недоступной для редактирования
            // ОформлениеСтроки.Доступность = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

В этом примере мы перебираем все объекты ОформлениеСтроки, доступные в текущем наборе данных. Свойство ОформлениеСтроки.ДанныеСтроки предоставляет нам ссылку на базовый объект данных (в нашем случае, элемент справочника "Номенклатура"), что позволяет получить его поля, такие как Остаток. Если условие выполняется, мы устанавливаем свойство ЦветТекста в красный цвет, используя конструктор Новый Цвет(). Аналогично, можно управлять свойством Доступность для всей строки.

Однако, как справедливо заметил автор исходного вопроса, такой подход имеет свои ограничения: он применяется ко всей строке целиком. Что делать, если нам нужно изменить свойства только для отдельной колонки, или применить более сложное форматирование, такое как изменение шрифта или границ?

Доступ к данным строки и управление оформлением отдельных ячеек

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

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

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

Изменение цвета текста в зависимости от условия для конкретной колонки

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


&НаКлиенте
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Проверяем условие на основе данных строки
        Если ОформлениеСтроки.ДанныеСтроки.Остаток = 0 Тогда
            // Устанавливаем красный цвет текста для ячейки "Наименование"
            ОформлениеСтроки.Ячейки.Наименование.ЦветТекста = Новый Цвет(255, 0, 0); // Красный
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Здесь ОформлениеСтроки.Ячейки.Наименование позволяет нам получить объект, представляющий ячейку в колонке с именем "Наименование" для текущей строки. К этому объекту мы уже можем применять свойства оформления, аналогичные свойствам ОформлениеСтроки. Конструктор Новый Цвет(Красный, Зеленый, Синий) позволяет задать любой желаемый оттенок. Важно указывать правильное имя колонки, как оно задано в свойствах динамического списка или в его запросе.

Управление доступностью отдельных колонок

Одним из мощных преимуществ программного оформления является возможность управлять доступностью отдельных полей. Стандартное условное оформление формы обычно не предоставляет такой гибкости. Предположим, мы хотим сделать колонку "СрокГодности" недоступной для редактирования (если список позволяет редактирование), когда срок годности товара уже истек.


&НаКлиенте
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Проверяем условие, например, просроченный срок годности
        Если ОформлениеСтроки.ДанныеСтроки.СрокГодности < ТекущаяДата() Тогда
            // Делаем ячейку "СрокГодности" недоступной для редактирования
            ОформлениеСтроки.Ячейки.СрокГодности.Доступность = Ложь;
            // Можно также изменить цвет фона, чтобы визуально выделить недоступность
            ОформлениеСтроки.Ячейки.СрокГодности.ЦветФона = Новый Цвет(240, 240, 240); // Светло-серый
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

В этом примере мы обращаемся к ячейке "СрокГодности" и устанавливаем ее свойство Доступность в Ложь. Это предотвратит интерактивное изменение данных в этой ячейке. Мы также добавили изменение цвета фона для дополнительной визуальной индикации того, что поле недоступно. Это делает интерфейс более интуитивным для пользователя.

Расширенное оформление: шрифт и границы

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

Динамическое изменение шрифта в ячейке

Если нам нужно выделить текст в ячейке, например, сделав его жирным или изменив размер, мы можем использовать свойство Шрифт объекта ЯчейкаОформленияСтроки. Для этого нам потребуется создать новый объект Шрифт с нужными параметрами.

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


&НаКлиенте
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Проверяем наличие "ВажногоПризнака"
        Если ОформлениеСтроки.ДанныеСтроки.ВажныйПризнак Тогда
            // Создаем новый шрифт на основе стандартного, делаем его жирным
            // Новый Шрифт(БазовыйШрифт, РазмерШрифта, Жирный, Курсив, Подчеркивание, ЦветШрифта)
            ОформлениеСтроки.Ячейки.Наименование.Шрифт = Новый Шрифт(СтандартныйШрифт, , Истина); // Жирный шрифт, остальные параметры как у стандартного
            // Или, если хотим изменить размер:
            // ОформлениеСтроки.Ячейки.Наименование.Шрифт = Новый Шрифт(СтандартныйШрифт, 12, Истина); // Жирный шрифт размером 12
        КонецЕсли;
        // Важно: если условие перестает выполняться, явно сбрасывайте шрифт,
        // так как объекты ОформлениеСтроки могут переиспользоваться.
        Иначе
            ОформлениеСтроки.Ячейки.Наименование.Шрифт = СтандартныйШрифт; // Сбрасываем шрифт к стандартному
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Конструктор Новый Шрифт() позволяет нам задать множество параметров: базовый шрифт, размер, признак жирности, курсива, подчеркивания и даже цвет шрифта. Если мы хотим оставить какой-либо параметр по умолчанию (как у стандартного шрифта), мы просто опускаем его или передаем пустое значение. Объект СтандартныйШрифт доступен глобально и представляет текущий стандартный шрифт системы. Очень важно помнить, что объекты оформления могут переиспользоваться платформой, поэтому если условие перестает выполняться, необходимо явно сбросить измененные свойства к их исходным значениям, иначе оформление может "залипнуть" на неверных строках.

Настройка границ отдельных ячеек

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

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


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

Здесь мы используем конструктор Новый Граница(), который позволяет задать стиль и толщину линии для каждой из четырех сторон ячейки. Каждый параметр в Новый Граница() сам по себе является объектом Линия, который создается с помощью Новый Линия(СтильЛинии.Сплошная, Толщина). Мы можем использовать различные стили линий (например, СтильЛинии.Пунктирная, СтильЛинии.Двойная и т.д.) и задавать разную толщину для каждой стороны. Аналогично предыдущим примерам, критически важно сбрасывать границы и их цвет, если условие перестает выполняться, чтобы избежать некорректного отображения.

Мы также можем устанавливать различные границы для разных сторон ячейки, создавая, например, только нижнюю подчеркивающую линию или вертикальные разделители. Пример: Новый Граница(, , , Новый Линия(СтильЛинии.Сплошная, 1)) – только нижняя линия.

Рекомендации и важные аспекты при использовании "ПриПолученииДанных"

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

  1. Производительность: Обработчик ПриПолученииДанных вызывается очень часто — для каждой строки динамического списка при каждом его обновлении (прокрутка, сортировка, фильтрация). Это означает, что код внутри этого обработчика должен быть максимально оптимизирован. Избегайте выполнения тяжелых запросов к базе данных или сложных вычислений внутри цикла. Если вам нужны дополнительные данные для оформления, старайтесь получить их заранее (например, в запросе динамического списка через присоединение к другим таблицам) или кэшировать, если это возможно.
  2. Сброс оформлений: Как мы уже неоднократно подчеркивали, объекты ОформлениеСтроки и ЯчейкаОформленияСтроки могут переиспользоваться платформой. Это означает, что если вы установили какое-либо свойство (цвет, шрифт, граница) для строки/ячейки при выполнении условия, но затем это условие перестало выполняться для другой строки, которая использует тот же объект оформления, то оформление "залипнет". Всегда явно сбрасывайте свойства к их стандартным значениям в блоке Иначе или в начале цикла, если условие не выполняется. Для цвета это может быть Неопределено или СтандартныйЦвет, для шрифта — СтандартныйШрифт, для границ — Неопределено.
  3. Взаимодействие с условным оформлением формы: Если на вашей форме уже настроено условное оформление (через конструктор условного оформления), оно будет применено к элементам списка. Правила, установленные в ПриПолученииДанных, обычно имеют приоритет над условным оформлением формы, но это может зависеть от конкретных свойств и версии платформы. Всегда тестируйте взаимодействие, если используете оба механизма. В некоторых случаях, условное оформление формы может быть более эффективным для простых задач, а ПриПолученииДанных – для тех, что требуют программной логики или затрагивают недоступные для условного оформления свойства.
  4. Отладка: При возникновении проблем с оформлением, используйте отладчик 1С. Установите точки останова в обработчике ПриПолученииДанных и пошагово пройдитесь по коду, чтобы проверить, какие значения принимают ваши условия и как изменяются свойства объектов ОформлениеСтроки и ЯчейкаОформленияСтроки. Это поможет выявить логические ошибки.
  5. Имена колонок: Убедитесь, что вы правильно указываете имена колонок при обращении к коллекции ОформлениеСтроки.Ячейки. Имя колонки должно соответствовать имени, заданному в конфигураторе для элемента поля формы или имени поля в запросе динамического списка. Ошибки в именах приведут к ошибкам времени выполнения или отсутствию желаемого оформления.
  6. Использование рассчитанных полей для простого выделения: Иногда для индикации состояния вместо сложного форматирования текста можно использовать более простой подход: добавить в запрос динамического списка рассчитанное поле, которое будет возвращать, например, булево значение или числовое значение, определяющее "статус". Затем это поле можно использовать для вывода картинки-индикатора (например, светофора) в отдельной колонке или для простого условного оформления. Это может быть менее ресурсоемким для очень больших списков.

Заключение

Обработчик события ПриПолученииДанных динамического списка на управляемых формах 1С:Предприятия 8.3 является мощным и гибким инструментом для детального программного управления внешним видом строк и отдельных ячеек. Мы рассмотрели, как использовать свойства ОформлениеСтроки и ЯчейкаОформленияСтроки для динамического изменения цвета текста, доступности, шрифта и границ в зависимости от конкретных условий данных. Это позволяет разработчикам создавать высокоинформативные и интерактивные интерфейсы, значительно улучшая пользовательский опыт.

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

← На главную