МенеджерУсловногоОформления предназначен для создания и управления условным оформлением элементов в интерфейсе на платформе 1С:Предприятие. Он позволяет динамически задавать визуальные свойства элементов формы (цвет фона, цвет текста, шрифт и т.д.) в зависимости от заданных условий и фильтров. Внутри обработки есть Демо, где можно посмотреть примеры использования и поэксперементировать.
- Текучий интерфейс
- Возможно работать с элементами, как оъектом. А не прост передавать строку. Что улучшает поддержку.
- Если всё условное офрмление пропустить, через одно место его проще найти.
Пример из рабочей базы — подсветка строк списка стран.
Было — одно правило, 11 строк кода, четыре объекта-посредника и три флага Использование, которые легко забыть:
Элемент = УсловноеОформление.Элементы.Добавить();
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИнформацияСтран.ИБДОнлайн");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
ОтборЭлемента.Использование = Истина;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЛососьСветлый);
Элемент.Использование = Истина;
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИнформацияСтран.Имя);
ПолеЭлемента.Использование = Истина;Стало — ровно то же самое правило, 4 строки:
Обработки.МенеджерУсловногоОформления.Создать().Установить(УсловноеОформление)
.Элемент(Элементы.ИнформацияСтран)
.Равно(Элементы.ИнформацияСтранИБДОнлайн, Ложь)
.ЦветФона(WebЦвета.ЛососьСветлый);Что здесь стоит заметить:
- Группа отбора не нужна. Старый код кладёт отбор прямо в
Элемент.Отбор.Элементы— без всякой группы. Цепочка без.ГруппаИ()делает буквально то же самое: отборы попадают в отбор элемента и объединяются по И. Группа понадобится, когда условий несколько и нужно ИЛИ или НЕ. - Имена полей берутся из элементов формы, а не из строк.
Элементы.ИнформацияСтранИБДОнлайнвместо"ИнформацияСтран.ИБДОнлайн"— переименование колонки в форме больше не ломает оформление молча. Использованиевыставляется само. Три забытых флага — классическая причина «оформление не применилось».- Второе правило добавляется тем же вызовом. Повторный
.Элемент(...)начинает новый элемент оформления, цепочку рвать не нужно:
Обработки.МенеджерУсловногоОформления.Создать().Установить(УсловноеОформление)
.Очистить()
.Элемент(Элементы.ИнформацияСтран)
.Равно(Элементы.ИнформацияСтранИБДОнлайн, Ложь)
.ЦветФона(WebЦвета.ЛососьСветлый)
.Элемент(Элементы.ИнформацияСтран)
.Больше(Элементы.ИнформацияСтранВыгрузкиСОшибкой, 0)
.ЦветФона(WebЦвета.Розовый);В первом примере .Очистить() нет намеренно — старый код тоже ничего не очищает, он просто добавляет элемент. В реальном коде цепочку обычно начинают с .Очистить(), как во втором примере, чтобы оформление не накапливалось при повторных вызовах.
Рекомендую использовать МенеджерУсловногоОформления внутри конфигурации. Скопируйте обработку к себе и вызывайте:
Процедура УстановитьУсловноеОформление(УсловноеОформление)
Обработки.МенеджерУсловногоОформления.Создать().Установить(УсловноеОформление);
КонецПроцедуры- Передайте объекту условное оформление формы:
.Установить(УсловноеОформление). - Очистите предыдущие настройки (если нужно).
- Добавьте элемент(ы), к которым будет применяться условное оформление с помощью ''.Элемент(...)''.
- Создайте необходимые группы условий ('.ГруппаИ(), .ГруппаИли(), .ГруппаНе()').
- Добавьте условия отбора, например .Равно(...), .Больше(...), .НачинаетсяС(...) и другие.
- Для каждого условия задайте оформление через соответствующие методы, например .ЦветФона(...), .ЦветТекста(...), .Шрифт(...).
- Заканчивайте группы с помощью .КонецГруппы(), если требуется.
Пример:
МенеджерУсловногоОформления.Установить(УсловноеОформление)
.Очистить()
.Элемент(Элементы.Реквизит2)
.ГруппаИ()
.Равно(Элементы.Реквизит2, 0)
.НеРавно(Элементы.Реквизит3, Истина)
.КонецГруппы()
.ЦветФона(WebЦвета.Золотой);Группа отбора не обязательна: если её не открывать, отборы попадут прямо в отбор элемента (неявная ГруппаИ).
Можно генерировать программный код с текущими настройками с помощью .СгенерироватьКод(). Однако метод вернет не Элемент.Реквизит1, а "Реквизит1". Как будто проще пеерписать готовое оформление испльзуюя текущий код. Не очень удобно будет, если условное оформление "натыкивали", но 1С это не рекомендует, по этому думаю таких кейсов будет не много. Так что не совмем понятно, а нужен ли это метод и надо ли его дорабатывать.
Значения отборов и оформления подставляются литералами для строк, чисел, булево, дат, цветов и горизонтального положения. Всё остальное выводится как _ПодставьтеЗначение_ — это место нужно дописать руками.
Имя цвета распознаётся и на русском, и на английском — платформа возвращает представление на языке интерфейса, и оба варианта ищутся в одной таблице из 146 web-цветов. То есть в англоязычной конфигурации LightSalmon будет так же понят, как Лосось светлый в русской. На выходе всегда русский идентификатор:
.Оформление("ЦветФона", WebЦвета.ЛососьСветлый)Если цвет распознать не удалось — подставляется WebЦвета.ЛососьСветлый. Это касается и цветов, заданных через Новый Цвет(R, G, B): у них нет имени, поэтому в сгенерированном коде окажется лосось, а не исходный цвет. Проверяйте цвета в результате генерации.
Дефисы в именах убираются наравне с пробелами: Акварельно-синий → WebЦвета.АкварельноСиний. Без этого генерировался невалидный код.
Тексты исключений хранятся сразу на русском и английском. Какой вариант показать — решает КодЯзыкаПереопределяемый() из области Переопределяемый. Это единственное место, куда нужно заглянуть при встраивании обработки в свою конфигурацию: в вашей базе почти наверняка уже есть источник кода языка — пропишите его один раз и забудьте.
Процедура КодЯзыкаПереопределяемый(КодЯзыка)
КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
КонецПроцедурыЕсли метод не трогать, используется язык самой обработки: у менеджера "ru", у английского близнеца ManagerOfConditionalAppearance — "en". Он задан в одном месте — КодЯзыкаПоУмолчанию().
Кода языка нет в программном интерфейсе: КодЯзыка() не экспортная и вызывается только внутри. Снаружи есть ровно одна точка расширения — переопределяемый метод.
На генерацию кода это не влияет. СгенерироватьКод() всегда выдаёт русский код, GenerateCode() — всегда английский. Язык генерации определяется версией обработки, а не настройкой.
Рядом лежит ManagerOfConditionalAppearance — та же обработка с английскими именами методов и ключевыми словами: Set, Item, Clear, Appearance, AndGroup, Equal, BackColor и так далее. GenerateCode() выдаёт английский код независимо от языка интерфейса: виды сравнения берутся по значениям перечисления, а не через Строка(), а имена параметров оформления и цветов приводятся к английским по таблицам.
ManagerOfConditionalAppearance.Set(ConditionalAppearance)
.Clear()
.Item(Items.Attribute2)
.AndGroup()
.Equal(Items.Attribute2, 0)
.EndGroup()
.BackColor(WebColors.Gold);Тот же пример из раздела «Было / стало» на английском API:
DataProcessors.ManagerOfConditionalAppearance.Create().Set(ConditionalAppearance)
.Item(Items.CountriesInfo)
.Equal(Items.CountriesInfoOnlineDB, False)
.BackColor(WebColors.LightSalmon);Ограничения те же: Format() недоступен (Appearance("Format", ...)), Visible и Show работают только с таблицами.
Основной метод: Оформление(Свойство, Значение)
- Свойство - Строка - То свойство которое хотите задать
- Значение - Произвольный - То значение которое должно работать
| Свойство | Свойство на En | Тип значения |
|---|---|---|
| ЦветФона | BackColor | Цвет |
| ЦветТекста | TextColor | Цвет |
| Шрифт | Font | Шрифт |
| ГоризонтальноеПоложение | ГоризонтальноеПоложение | |
| ВыделятьОтрицательные | MarkNegatives | Булево |
| ОтметкаНезаполненного | MarkIncomplete | Булево |
| Видимость | Visible | Булево — только для таблиц, см. ниже |
| Отображать | Show | Булево — только для таблиц, см. ниже |
| Доступность | Enabled | Булево |
| ТолькоПросмотр | ReadOnly | Булево |
| Текст | Text | Строка, ФорматированнаяСтрока, ПолеКомпоновкиДанных |
| Формат | Format | Строка — только через Оформление("Формат", ...) |
Также можно использовать методы из области оформления: Например: ЦветФона(WebЦвета.ЛососьСветлый)
Видимость и Отображать условное оформление применяет только к элементам таблицы формы — к колонке или к самой таблице. На обычном поле формы, лежащем вне таблицы, оба параметра молча не срабатывают: исключения нет, поле остается видимым.
// Работает: колонка таблицы.
МенеджерУсловногоОформления.Установить(УсловноеОформление)
.Элемент(Элементы.СоставРеквизит3)
.НеЗаполнено(Элементы.СоставРеквизит2)
.Видимость(Ложь)
.Отображать(Ложь);
// НЕ работает: обычное поле формы. Отбор отрабатывает, оформление - нет.
МенеджерУсловногоОформления.Установить(УсловноеОформление)
.Элемент(Элементы.Реквизит1)
.Равно(Элементы.Реквизит3, Истина)
.Видимость(Ложь);Обычное поле формы прячется только кодом:
Элементы.Реквизит1.Видимость = Не Реквизит3;Разница между двумя параметрами: Видимость управляет самим элементом, Отображать — выводом значения.
| Параметр | Заголовок | Тип значения |
|---|---|---|
| ЦветФона | "Цвет фона" | Цвет |
| ЦветТекста | "Цвет текста" | Цвет |
| ЦветВДиаграмме | "Цвет в диаграмме" | Цвет |
| ЦветГраницы | "Цвет границы" | Цвет |
| СтильГраницы | "Стиль границы" | Линия |
| Шрифт | "Шрифт" | Шрифт |
| Отступ | "Отступ" | Число |
| АвтоОтступ | "Автоотступ" | Число |
| ГоризонтальноеПоложение | "Горизонтальное положение" | ГоризонтальноеПоложение |
| ВертикальноеПоложение | "Вертикальное положение" | ВертикальноеПоложение |
| Размещение | "Размещение" | ТипРазмещенияТекстаКомпоновкиДанных |
| ОриентацияТекста | "Ориентация текста" | Число |
| Формат | "Формат" | Строка |
| ВыделятьОтрицательные | "Выделять отрицательные" | Булево |
| ОтметкаНезаполненного | "Отметка незаполненного" | Булево |
| МинимальнаяШирина | "Минимальная ширина" | Число |
| МаксимальнаяШирина | "Максимальная ширина" | Число |
| РастягиватьПоГоризонтали | "Растягивать по горизонтали" | Булево |
| ВесовойКоэффициентШирины | "Весовой коэффициент ширины" | Число |
| МинимальнаяВысота | "Минимальная высота" | Число |
| МаксимальнаяВысота | "Максимальная высота" | Число |
| Текст | "Текст" | Форматированная строка, Поле компоновки данных, Строка |
| Видимость | "Видимость" | Булево |
| Доступность | "Доступность" | Булево |
| ТолькоПросмотр | "Только просмотр" | Булево |
| Отображать | "Отображать" | Булево |
| ОтображатьГрафическоеПредставлениеДанныхВЛегендеДиаграммы | "Отображать в легенде" | ОтображениеВЛегендеДиаграммы |
| ОтображатьГрафическоеПредставлениеДанныхВДиаграмме | "Отображать графическое представление" | ОтображениеВДиаграмме |
| ЛинииТрендаВДиаграмме | "Линии тренда" | ЛинииТрендаДиаграммы |
| ЛинияВДиаграмме | "Линия в диаграмме" | Линия |
| МаркерВДиаграмме | "Маркер в диаграмме" | ТипМаркераДиаграммы |
| ИндикаторВДиаграмме | "Индикатор в диаграмме" | Булево |
| ИнформационнаяЛинияВДиаграмме | "Информационная линия в диаграмме" | Информационная линия |
| ИнформационныйИнтервалВДиаграмме | "Информационный интервал в диаграмме" | Информационный интервал |
| ВыводитьКартинку | "Выводить картинку" | ТипВыводаКартинкиКомпоновкиДанных |
| РазмерКартинки | "Размер картинки" | РазмерКартинки |
| ПоложениеТекстаОтносительноКартинки | "Положение текста относительно картинки" | ПоложениеТекстаОтносительноКартинки |
| ВертикальноеПоложениеКартинки | "Вертикальное положение картинки" | ВертикальноеПоложение |
| ГоризонтальноеПоложениеКартинки | "Горизонтальное положение картинки" | ГоризонтальноеПоложение |
| ТипГрафическогоПредставленияВДиаграмме | "Тип графического представления в диаграмме" | ТипГрафическогоПредставленияСерииДиаграммы |
| ТипНакопленияВДиаграмме | "Тип накопления в диаграмме" | ТипНакопленияСерииДиаграммы |
| ИспользуемаяОсьЗначенийВДиаграмме | "Используемая ось значений в диаграмме" | ИспользуемаяОсьЗначенийДиаграммы |
| Картинка | "Картинка" | Картинка |
| РазделительМножественныхЗначений | "Разделитель множественных значений" | Строка |
| ОтступСлева | "Отступ слева" | Число |
| ОтступСправа | "Отступ справа" | Число |
| ОтступСверху | "Отступ сверху" | Число |
| ОтступСнизу | "Отступ снизу" | Число |
В репозитории лежат готовые инструкции, чтобы Claude, Cursor и GPT писали условное оформление через МенеджерУсловногоОформления, а не вручную через УсловноеОформление.Элементы.Добавить().
| Инструмент | Файл | Как подключается |
|---|---|---|
| Claude Code | .claude/skills/conditional-appearance/SKILL.md |
Agent Skill. Подхватывается сам по описанию либо вызывается как /conditional-appearance |
| Cursor | .cursor/rules/conditional-appearance.mdc |
Project Rule с globs: **/*.bsl — включается при работе с BSL-файлами |
| GPT, Codex | AGENTS.md |
Читается агентами по стандарту AGENTS.md. Содержимое можно целиком вставить в поле Instructions при создании Custom GPT |
Настройка не нужна — достаточно, чтобы файлы лежали в репозитории. Если копируете МенеджерУсловногоОформления к себе в конфигурацию, заберите вместе с ним и нужный файл.
Во всех трёх одно наполнение: способы получения объекта, порядок цепочки, полный список из 40 методов и ограничения платформы, на которых легко потерять время:
ВидимостьиОтображатьне работают вне таблиц- метода
Формат()не существует — имя занято глобальной функцией платформы - имена
WebЦвета.*нельзя угадывать, промах падает только в рантайме - опечатка в имени свойства в
Оформление()проходит молча
Различаются объёмом: у Claude больше всего примеров, правило Cursor сжато — оно подмешивается в контекст на каждом BSL-файле, — а AGENTS.md дополнительно описывает структуру репозитория и то, как проверять правки.
Если меняете программный интерфейс менеджера, обновите список методов во всех трёх файлах: иначе агент начнёт предлагать вызовы, которых уже нет.