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

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

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

Анализируем первоначальный подход и его недостатки

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


&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    НоменклатураАктивизации = ТекущаяСтрока.Номенклатура;
    ЭлементОформления = Объект.Товары.УсловноеОформление.Элементы.Добавить;
    ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(НоменклатураАктивизации);
    ЭлементОтбора.ПравоеЗначение = ТекущаяСтрока.Номенклатура;
    ЭлементОтбора.Использование = Истина;
    Элемент = ЭлементОформления.Оформление.Элементы[0];
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Голубой);
    Элемент.Использование = Истина;
КонецПроцедуры

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

Принцип работы условного оформления в 1С:УФ

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

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

Пошаговая реализация решения

Давайте разберем, как правильно реализовать динамическую подсветку строк с одинаковой номенклатурой.

Шаг 1: Создание реквизита формы

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

  1. Откройте форму документа "Заказ клиента" в конфигураторе.
  2. Перейдите на вкладку "Реквизиты".
  3. Добавьте новый реквизит формы, например, с именем НоменклатураАктивизации и типом "СправочникСсылка.Номенклатура".

Шаг 2: Настройка условного оформления при создании формы на сервере

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


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

Шаг 3: Обновление реквизита формы при активизации строки на клиенте

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


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

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

Важные аспекты и дополнительные рекомендации

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

Альтернативные подходы (из обсуждения)

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

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

← На главную