Как программно изменить форму и раскрасить табличную часть документа из внешней обработки

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

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

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

Анализ проблемы: клиент-серверное взаимодействие

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

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

Способ 1. Использование механизма «Заполнение объекта» БСП

Самый правильный и надежный способ — реализовать внешнюю обработку с типом команды ЗаполнениеОбъекта. Рассмотрим пошагово, как это сделать.

Шаг 1. Регистрация обработки

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


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Наименование = "Раскраска табличной части";
    ПараметрыРегистрации.Версия = "1.0";
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Раскрасить строки";
    НоваяКоманда.Идентификатор = "РаскраситьСтрокиТЧ";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    
    Возврат ПараметрыРегистрации;
КонецФункции

Шаг 2. Работа с формой на сервере

Теперь реализуем процедуру ВыполнитьКоманду. Благодаря БСП, в структуру ПараметрыВыполнения передается свойство ЭтаФорма. Это и есть та самая управляемая форма документа, из которой была вызвана обработка.


Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
    Если ИмяКоманды = "РаскраситьСтрокиТЧ" Тогда
        // Получаем контекст управляемой формы
        ТекущаяФорма = ПараметрыВыполнения.ЭтаФорма;
        
        // Вызываем процедуру настройки оформления
        НастроитьУсловноеОформлениеФормы(ТекущаяФорма);
        
        // Оповещаем форму о том, что данные (или оформление) изменились
        ТекущаяФорма.Модифицированность = Истина;
    КонецЕсли;
КонецПроцедуры

Подробный разбор программной настройки Условного Оформления

Рассмотрим подробнее, как именно добавить правило раскраски. Допустим, нам нужно раскрасить строки в табличной части Товары, где количество больше 100.


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

Важный нюанс: Обратите внимание на путь к данным в условии отбора. Мы пишем Объект.Товары.Количество, так как работаем с контекстом формы, где основным реквизитом является Объект.

Как раскрасить строки на основе сложных расчетов?

Иногда условие раскраски нельзя выразить простой проверкой реквизитов (например, нужно проверить данные в другой таблице или выполнить сложный запрос). В этом случае проанализируем следующий алгоритм:

  1. Программно добавим на форму документа скрытый реквизит (колонку) через метод ИзменитьРеквизиты.
  2. В обработке заполнения рассчитаем нужные значения и проставим «флаги» (например, Число или Булево) в эту новую колонку.
  3. Настроим УсловноеОформление, которое будет ориентироваться на значение этой служебной колонки.

Рассмотрим пример добавления реквизита «на лету» в процедуре ВыполнитьКоманду:


// Добавление временного реквизита в форму (только в памяти)
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы("СлужебныйЦвет", Новый ОписаниеТипов("Число"), "Объект.Товары"));
ФормаДокумента.ИзменитьРеквизиты(МассивРеквизитов);

После этого вы можете программно заполнить колонку СлужебныйЦвет в каждой строке и настроить оформление: если СлужебныйЦвет = 1 — красный, если 2 — зеленый. Это позволяет реализовывать логику любой сложности.

Преимущества использования расширений

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

В расширении код будет выглядеть практически так же, как мы разобрали выше, но он будет размещен в модуле формы документа с аннотацией &После("ПриСозданииНаСервере").

Резюме

Проанализировав ситуацию, мы пришли к выводу, что наиболее эффективный способ раскраски формы из внешней обработки — это использование БСП и серверного метода команды заполнения объекта. Это дает нам прямой доступ к УсловноеОформление и позволяет модифицировать интерфейс даже в незаписанных документах. Помните, что все манипуляции с визуальными свойствами элементов (цвета, шрифты, видимость по условию) должны происходить строго на стороне сервера.

← На главную