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