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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

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

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

Программный подход к условному оформлению строк

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

Использование события ПриВыводеСтроки

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

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


Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ДанныеСтроки.Ответственный = Справочники.Пользователи.НайтиПоНаименованию("Заказ-интернета") Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.Красный; // Или другой предопределенный цвет
    КонецЕсли;
КонецПроцедуры

В этом примере ДанныеСтроки представляет собой объект, содержащий данные текущей строки табличного поля. Мы обращаемся к его реквизиту Ответственный и, если условие выполняется, устанавливаем ЦветФона.

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

Оптимальное решение: событие ПриПолученииДанных

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

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

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


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        // Допустим, нам нужно покрасить строки, где значение некоторого реквизита равно Истина
        // Для примера используем гипотетический реквизит "КакойТоРеквизит"
        Если ОформлениеСтроки.ДанныеСтроки.КакойТоРеквизит = Истина Тогда
            ОформлениеСтроки.ЦветФона = ЦветСтиля.ФонПодсказки; // Используем цвет из стиля
        КонецЕсли;
        
        // Пример для исходного запроса: покрасить строки, где ответственный "Заказ-интернета"
        // Предположим, что Ответственный - это ссылка на справочник Пользователи
        Если ТипЗнч(ОформлениеСтроки.ДанныеСтроки.Ответственный) = Тип("СправочникСсылка.Пользователи") Тогда
            Если ОформлениеСтроки.ДанныеСтроки.Ответственный.Наименование = "Заказ-интернета" Тогда
                ОформлениеСтроки.ЦветФона = WebЦвета.Красный;
                // Мы также можем изменить цвет текста
                ОформлениеСтроки.ЦветТекста = WebЦвета.Белый;
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
КонецПроцедуры

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

Возможности ПриПолученииДанных:

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

  1. Изменять шрифт: ОформлениеСтроки.Шрифт = Новый Шрифт(...).
  2. Устанавливать высоту строки: ОформлениеСтроки.Высота = 20.
  3. Управлять видимостью ячеек: ОформлениеСтроки.Ячейки.ИмяКолонки.Видимость = Ложь.
  4. Устанавливать картинку в ячейке: ОформлениеСтроки.Ячейки.ИмяКолонки.Картинка = БиблиотекаКартинок.Иконка.
  5. Отображать флажок или новый текст в ячейке: ОформлениеСтроки.Ячейки.ИмяКолонки.ОтображатьФлажок = Истина, ОформлениеСтроки.Ячейки.ИмяКолонки.Текст = "Новое значение".

Важно отметить, что все эти настройки можно применять как для всей строки целиком, так и для отдельной ячейки внутри строки, обращаясь к коллекции ОформлениеСтроки.Ячейки.

Порядок вызова и поведение при прокрутке:

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

Интерактивная настройка условного оформления (через свойства формы)

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

Мы разберем шаги по настройке интерактивного условного оформления:

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

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

Программная настройка условного оформления (коллекция УсловноеОформление.Элементы)

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

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

Пример добавления элемента условного оформления программно:


// Пример (псевдокод) для обычных форм
Процедура ПриОткрытии()
    // Создаем новый элемент условного оформления
    НовыйЭлементОформления = УсловноеОформление.Элементы.Добавить();

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

    // Задаем оформление
    НовоеОформление = НовыйЭлементОформления.Оформление;
    НовоеОформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
    НовоеОформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Белый);

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

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

Особенности для управляемых форм (для полноты картины)

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

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

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

Рекомендации и предостережения

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

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

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

← На главную