При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с задачей кастомизации интерфейса под требования пользователей. Одной из популярных просьб является визуальное выделение данных — например, раскраска строк в табличной части документа. Ситуация осложняется, когда конфигурация находится на поддержке и вносить изменения в нее нельзя, а документ, который нужно «раскрасить», еще даже не записан в базу данных.
В этой статье мы подробно разберем, как с помощью механизма внешних обработок и Библиотеки стандартных подсистем (БСП) получить доступ к управляемой форме документа и программно настроить ее условное оформление.
Прежде чем переходить к коду, проанализируем ключевое ограничение управляемых форм. Свойство формы УсловноеОформление (коллекция элементов, отвечающих за раскраску) доступно только на сервере. В то же время внешняя обработка часто вызывается пользователем с клиента. Основная задача — правильно передать контекст формы на сервер, чтобы модифицировать ее интерфейс «на лету».
Если мы используем стандартный механизм подключения дополнительных отчетов и обработок (через справочник в БСП), у нас появляется легальный способ вмешаться в работу формы без изменения кода конфигурации.
Самый правильный и надежный способ — реализовать внешнюю обработку с типом команды ЗаполнениеОбъекта. Рассмотрим пошагово, как это сделать.
Шаг 1. Регистрация обработки
В модуле объекта внешней обработки необходимо описать функцию СведенияОВнешнейОбработке. Важно указать вариант запуска ВызовСерверногоМетода, чтобы система передала нам контекст формы напрямую.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Наименование = "Раскраска табличной части";
ПараметрыРегистрации.Версия = "1.0";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Раскрасить строки";
НоваяКоманда.Идентификатор = "РаскраситьСтрокиТЧ";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 2. Работа с формой на сервере
Теперь реализуем процедуру ВыполнитьКоманду. Благодаря БСП, в структуру ПараметрыВыполнения передается свойство ЭтаФорма. Это и есть та самая управляемая форма документа, из которой была вызвана обработка.
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
Если ИмяКоманды = "РаскраситьСтрокиТЧ" Тогда
// Получаем контекст управляемой формы
ТекущаяФорма = ПараметрыВыполнения.ЭтаФорма;
// Вызываем процедуру настройки оформления
НастроитьУсловноеОформлениеФормы(ТекущаяФорма);
// Оповещаем форму о том, что данные (или оформление) изменились
ТекущаяФорма.Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее, как именно добавить правило раскраски. Допустим, нам нужно раскрасить строки в табличной части Товары, где количество больше 100.
Процедура НастроитьУсловноеОформлениеФормы(ФормаДокумента)
// 1. Очищаем существующее оформление (опционально)
ФормаДокумента.УсловноеОформление.Элементы.Очистить();
// 2. Создаем новый элемент оформления
Элемент = ФормаДокумента.УсловноеОформление.Элементы.Добавить();
// 3. Устанавливаем само оформление (например, ЦветФона)
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаВыделения);
// 4. Указываем условие: "Объект.Товары.Количество > 100"
ЭлементУсловия = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементУсловия.ПравоеЗначение = 100;
// 5. Указываем, какие поля (колонки) нужно раскрашивать
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Товары"); // Раскрасить всю строку ТЧ
КонецПроцедуры
Важный нюанс: Обратите внимание на путь к данным в условии отбора. Мы пишем Объект.Товары.Количество, так как работаем с контекстом формы, где основным реквизитом является Объект.
Иногда условие раскраски нельзя выразить простой проверкой реквизитов (например, нужно проверить данные в другой таблице или выполнить сложный запрос). В этом случае проанализируем следующий алгоритм:
ИзменитьРеквизиты.УсловноеОформление, которое будет ориентироваться на значение этой служебной колонки.Рассмотрим пример добавления реквизита «на лету» в процедуре ВыполнитьКоманду:
// Добавление временного реквизита в форму (только в памяти)
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы("СлужебныйЦвет", Новый ОписаниеТипов("Число"), "Объект.Товары"));
ФормаДокумента.ИзменитьРеквизиты(МассивРеквизитов);
После этого вы можете программно заполнить колонку СлужебныйЦвет в каждой строке и настроить оформление: если СлужебныйЦвет = 1 — красный, если 2 — зеленый. Это позволяет реализовывать логику любой сложности.
Выясним ситуацию: если раскраска должна быть постоянной, а не вызываться каждый раз по кнопке, лучше использовать Расширения конфигурации. Рассмотрим, чем они полезны в данном контексте:
ПриСозданииНаСервере и прописать код настройки оформления там. Пользователю не придется нажимать дополнительные кнопки.В расширении код будет выглядеть практически так же, как мы разобрали выше, но он будет размещен в модуле формы документа с аннотацией &После("ПриСозданииНаСервере").
Проанализировав ситуацию, мы пришли к выводу, что наиболее эффективный способ раскраски формы из внешней обработки — это использование БСП и серверного метода команды заполнения объекта. Это дает нам прямой доступ к УсловноеОформление и позволяет модифицировать интерфейс даже в незаписанных документах. Помните, что все манипуляции с визуальными свойствами элементов (цвета, шрифты, видимость по условию) должны происходить строго на стороне сервера.