Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Описание

МенеджерУсловногоОформления предназначен для создания и управления условным оформлением элементов в интерфейсе на платформе 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;

Разница между двумя параметрами: Видимость управляет самим элементом, Отображать — выводом значения.

Параметр Заголовок Тип значения
ЦветФона "Цвет фона" Цвет
ЦветТекста "Цвет текста" Цвет
ЦветВДиаграмме "Цвет в диаграмме" Цвет
ЦветГраницы "Цвет границы" Цвет
СтильГраницы "Стиль границы" Линия
Шрифт "Шрифт" Шрифт
Отступ "Отступ" Число
АвтоОтступ "Автоотступ" Число
ГоризонтальноеПоложение "Горизонтальное положение" ГоризонтальноеПоложение
ВертикальноеПоложение "Вертикальное положение" ВертикальноеПоложение
Размещение "Размещение" ТипРазмещенияТекстаКомпоновкиДанных
ОриентацияТекста "Ориентация текста" Число
Формат "Формат" Строка
ВыделятьОтрицательные "Выделять отрицательные" Булево
ОтметкаНезаполненного "Отметка незаполненного" Булево
МинимальнаяШирина "Минимальная ширина" Число
МаксимальнаяШирина "Максимальная ширина" Число
РастягиватьПоГоризонтали "Растягивать по горизонтали" Булево
ВесовойКоэффициентШирины "Весовой коэффициент ширины" Число
МинимальнаяВысота "Минимальная высота" Число
МаксимальнаяВысота "Максимальная высота" Число
Текст "Текст" Форматированная строка, Поле компоновки данных, Строка
Видимость "Видимость" Булево
Доступность "Доступность" Булево
ТолькоПросмотр "Только просмотр" Булево
Отображать "Отображать" Булево
ОтображатьГрафическоеПредставлениеДанныхВЛегендеДиаграммы "Отображать в легенде" ОтображениеВЛегендеДиаграммы
ОтображатьГрафическоеПредставлениеДанныхВДиаграмме "Отображать графическое представление" ОтображениеВДиаграмме
ЛинииТрендаВДиаграмме "Линии тренда" ЛинииТрендаДиаграммы
ЛинияВДиаграмме "Линия в диаграмме" Линия
МаркерВДиаграмме "Маркер в диаграмме" ТипМаркераДиаграммы
ИндикаторВДиаграмме "Индикатор в диаграмме" Булево
ИнформационнаяЛинияВДиаграмме "Информационная линия в диаграмме" Информационная линия
ИнформационныйИнтервалВДиаграмме "Информационный интервал в диаграмме" Информационный интервал
ВыводитьКартинку "Выводить картинку" ТипВыводаКартинкиКомпоновкиДанных
РазмерКартинки "Размер картинки" РазмерКартинки
ПоложениеТекстаОтносительноКартинки "Положение текста относительно картинки" ПоложениеТекстаОтносительноКартинки
ВертикальноеПоложениеКартинки "Вертикальное положение картинки" ВертикальноеПоложение
ГоризонтальноеПоложениеКартинки "Горизонтальное положение картинки" ГоризонтальноеПоложение
ТипГрафическогоПредставленияВДиаграмме "Тип графического представления в диаграмме" ТипГрафическогоПредставленияСерииДиаграммы
ТипНакопленияВДиаграмме "Тип накопления в диаграмме" ТипНакопленияСерииДиаграммы
ИспользуемаяОсьЗначенийВДиаграмме "Используемая ось значений в диаграмме" ИспользуемаяОсьЗначенийДиаграммы
Картинка "Картинка" Картинка
РазделительМножественныхЗначений "Разделитель множественных значений" Строка
ОтступСлева "Отступ слева" Число
ОтступСправа "Отступ справа" Число
ОтступСверху "Отступ сверху" Число
ОтступСнизу "Отступ снизу" Число

Скиллы для AI-агентов

В репозитории лежат готовые инструкции, чтобы 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 дополнительно описывает структуру репозитория и то, как проверять правки.

Если меняете программный интерфейс менеджера, обновите список методов во всех трёх файлах: иначе агент начнёт предлагать вызовы, которых уже нет.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages