Как правильно обойти табличную часть на сервере и настроить условное оформление ячеек в 1С 8.3

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

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

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

Разбор типичных ошибок: почему падает код и не красится ячейка

Давайте проанализируем исходный код, предложенный автором темы, и разберем ключевые ошибки, из-за которых платформа выдает системные сбои.

Ошибка 1. Неверный первый параметр в функции ДанныеФормыВЗначение

Автор пытается получить объектную таблицу значений следующим образом:


ТаблицаОПРиСМП = ДанныеФормыВЗначение(Элементы.ОПРиСМП , Тип("ТаблицаЗначений"));

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

ТаблицаОПРиСМП = ДанныеФормыВЗначение(Объект.ОПРиСМП, Тип("ТаблицаЗначений"));

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

Ошибка 2. Использование условного оформления в обработчике изменения данных

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

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

Ошибка 3. Некорректное заполнение Левого и Правого значений отбора

Посмотрим на этот фрагмент кода:


ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Элементы.НарезкаЗаготовок.Имя);
ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Перечисление.ТХ_ДопускиСотрудников.ПодтверждениеДопуска");

Здесь допущены сразу две серьезные ошибки:

  1. В свойство ЛевоеЗначение передается имя элемента формы. Однако отбор условного оформления работает не с именами элементов интерфейса, а с путями к данным. Правильный путь к реквизиту табличной части выглядит так: Объект.ОПРиСМП.НарезкаЗаготовок.
  2. В свойство ПравоеЗначение ошибочно передается новый объект ПолеКомпоновкиДанных со строковым представлением перечисления. Объект ПолеКомпоновкиДанных служит исключительно для указания путей к полям. Чтобы сравнить реквизит с конкретным значением перечисления, нужно передавать непосредственно само значение перечисления: Перечисления.ТХ_ДопускиСотрудников.ПодтверждениеДопуска.

Как работает условное оформление: красим ячейку, а не всю колонку

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

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

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

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

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

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

Использование Библиотеки стандартных подсистем (БСП) для упрощения кода

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

Рассмотрим пример лаконичной настройки условного оформления с использованием БСП:


&НаСервере
Процедура НастроитьОформлениеПоБСП()

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

КонецПроцедуры

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

Резюме

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

  1. Не вызывайте сервер при каждом изменении. Настраивайте условное оформление один раз в процедуре ПриСозданииНаСервере. Платформа сама применит правила на клиенте.
  2. Передавайте верные типы данных. В ЛевоеЗначение отбора всегда передается ПолеКомпоновкиДанных с путем к реквизиту (например, Объект.ТЧ.ИмяРеквизита), а в ПравоеЗначение — непосредственное значение для сравнения (например, ссылка на элемент справочника или перечисления).
  3. Ограничивайте область действия. Всегда добавляйте целевую колонку в коллекцию Поля элемента условного оформления, чтобы раскрашивалась конкретная ячейка, а не вся строка таблицы.
← На главную