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

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

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

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

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

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


ЭлементУО = УсловноеОформление.Элементы.Добавить();
ЭлементУО.Использование = Истина;
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Зеленый);

ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары.Артикул");

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

Если нам нужно выделить строки по остатку, мы можем получить остаток товара для определенной номенклатуры в строке и добавить программное условие: Номенклатура = [Ссылка] И Количество < [Остаток]. Привязываться лучше именно к номенклатуре или уникальному идентификатору строки, а не к её номеру, так как пользователи могут удалять или перемещать строки.

Недостатки метода: Посмотрим на проблему производительности. Если в документе будет 100 строк, то в условном оформлении формы создастся 100 отдельных элементов отбора. При любой перерисовке интерфейса платформе придется вычислять их все, что приведет к сильным «тормозам», особенно в веб-клиенте. Этот способ подходит только для таблиц с очень малым количеством строк.

Вариант 2: Использование Таблицы Значений на форме

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

Разберем по шагам создание Таблицы Значений на форме:

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

Теперь нам необходимо обеспечить синхронизацию данных. В обработчике ПриЧтенииНаСервере мы перегружаем данные из объекта в нашу таблицу на форме, попутно рассчитывая и заполняя колонку НужноРаскрасить. А в обработчике ПередЗаписьюНаСервере — выгружаем данные обратно из таблицы формы в табличную часть объекта, игнорируя служебные колонки.

Оптимизация получения остатков (кэширование)

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

Рассмотрим правильный подход:

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

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

← На главную