При реализации интерактивных механизмов в 1С, таких как Drag-and-Drop (перетаскивание значений между строками и колонками), часто возникает задача визуального выделения ячейки-приемника. Начинающие разработчики нередко пытаются установить цвет ячейки напрямую в процедуре-обработчике Перетаскивание, однако у объекта строки таблицы значений или табличной части нет прямого свойства оформления цвета.
Разберем подробно, как устроена отрисовка ячеек в платформе 1С:Предприятие и как правильно раскрасить целевую ячейку в обычных и управляемых формах.
В обычном интерфейсе (толстый клиент) табличное поле не хранит настройки визуального оформления внутри самих данных. Отрисовка цветов, шрифтов и видимости происходит "на лету" в специальных предопределенных событиях табличного поля:
ПриВыводеСтроки — вызывается для каждой отдельной видимой строки. Позволяет управлять оформлением через параметр ОформлениеСтроки.ПриПолученииДанных — вызывается пакетно для порции отображаемых на экране строк. Принимает массив ОформленияСтрок, что существенно оптимизирует производительность при больших списках.Посмотрим на алгоритм реализации раскрашивания при перетаскивании по шагам:
Соответствие или структуру) для фиксации строк и колонок, требующих подсветки.Перетаскивание определяем строку и колонку приемника, сохраняем эти координаты в нашу переменную формы и инициируем перерисовку таблицы методом ОбновитьСтроки().ПриПолученииДанных (или ПриВыводеСтроки) считываем сохраненные координаты и задаем свойство ЦветФона у нужной ячейки.Рассмотрим пример кода для обычных форм. Объявим на уровне модуля формы переменную, в которой будем хранить информацию о раскрашиваемых ячейках.
Перем мРаскрашенныеЯчейки; // Соответствие: Ключ - СтрокаТаблицы/КлючСтроки, Значение - ИмяКолонки
Процедура ПриОткрытии()
мРаскрашенныеЯчейки = Новый Соответствие;
КонецПроцедуры
Процедура ТабличноеПолеПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
// Выполняем перенос значения в ячейку-приемник
Строка[Поле.Имя] = ПараметрыПеретаскивания.Значение;
// Запоминаем ячейку для раскрашивания
мРаскрашенныеЯчейки.Вставить(Строка, Поле.Имя);
// Принудительно инициируем обновление визуального отображения
ЭлементыФормы.ТабличноеПоле.ОбновитьСтроки();
КонецПроцедуры
Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого Оформление Из ОформленияСтрок Цикл
// Проверяем, зарегистрирована ли строка для подсветки
ИмяКолонки = мРаскрашенныеЯчейки[Оформление.ДанныеСтроки];
Если ИмяКолонки <> Неопределено Тогда
Оформление.Ячейки[ИмяКолонки].ЦветФона = Новый Цвет(175, 255, 175); // Мягкий зеленый цвет
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное замечание по производительности: события ПриПолученииДанных и ПриВыводеСтроки вызываются платформой непрерывно при прокрутке, смене фокуса и масштабировании. Категорически запрещено выполнять внутри этих процедур запросы к базе данных или ресурсоемкие вычисления.
Если вы работаете в управляемом интерфейсе (тонкий клиент), события ПриВыводеСтроки и ПриПолученииДанных отсутствуют. Вся визуализация строится на механизме Условного оформления (коллекция УсловноеОформление).
Проанализируем порядок действий на управляемых формах:
ЯчейкаИзменена типа Булево).ПриСозданииНаСервере): устанавливаем условие на равенство служебного реквизита значению Истина, задаем оформление ЦветФона и указываем оформляемые поля.ОбработкаПеретаскивания на клиенте просто присваиваем служебному реквизиту значение Истина. Платформа перерисует цвет фона ячейки автоматически.Посмотрим на пример программной настройки условного оформления:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Настраиваем оформление (ЦветФона)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
// Устанавливаем условие
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ЯчейкаИзменена");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = Истина;
// Указываем поле, которое нужно покрасить
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыКоличество");
КонецПроцедуры