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

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

При реализации интерактивных механизмов в 1С, таких как Drag-and-Drop (перетаскивание значений между строками и колонками), часто возникает задача визуального выделения ячейки-приемника. Начинающие разработчики нередко пытаются установить цвет ячейки напрямую в процедуре-обработчике Перетаскивание, однако у объекта строки таблицы значений или табличной части нет прямого свойства оформления цвета.

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

Принцип динамического оформления в обычных формах

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

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

Посмотрим на алгоритм реализации раскрашивания при перетаскивании по шагам:

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

Реализация через событие ПриПолученииДанных

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


Перем мРаскрашенныеЯчейки; // Соответствие: Ключ - СтрокаТаблицы/КлючСтроки, Значение - ИмяКолонки

Процедура ПриОткрытии()
    мРаскрашенныеЯчейки = Новый Соответствие;
КонецПроцедуры

Процедура ТабличноеПолеПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    СтандартнаяОбработка = Ложь;
    
    // Выполняем перенос значения в ячейку-приемник
    Строка[Поле.Имя] = ПараметрыПеретаскивания.Значение;
    
    // Запоминаем ячейку для раскрашивания
    мРаскрашенныеЯчейки.Вставить(Строка, Поле.Имя);
    
    // Принудительно инициируем обновление визуального отображения
    ЭлементыФормы.ТабличноеПоле.ОбновитьСтроки();
КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого Оформление Из ОформленияСтрок Цикл
        // Проверяем, зарегистрирована ли строка для подсветки
        ИмяКолонки = мРаскрашенныеЯчейки[Оформление.ДанныеСтроки];
        Если ИмяКолонки <> Неопределено Тогда
            Оформление.Ячейки[ИмяКолонки].ЦветФона = Новый Цвет(175, 255, 175); // Мягкий зеленый цвет
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Альтернативный вариант: Условное оформление в управляемых формах

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

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

  1. Добавляем в реквизиты строки таблицы служебную колонку-флаг (например, ЯчейкаИзменена типа Булево).
  2. Настраиваем правило условного оформления формы (в конфигураторе или программно в событии ПриСозданииНаСервере): устанавливаем условие на равенство служебного реквизита значению Истина, задаем оформление ЦветФона и указываем оформляемые поля.
  3. В обработчике ОбработкаПеретаскивания на клиенте просто присваиваем служебному реквизиту значение Истина. Платформа перерисует цвет фона ячейки автоматически.

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


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