В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача визуального выделения данных в зависимости от определенных условий. Типичный пример: необходимо окрасить название контрагента или партнера в красный цвет, если установлена галочка «Черный список». Однако начинающие разработчики часто сталкиваются с тем, что цвет меняется только в момент нажатия, а при перезагрузке формы настройки «слетают». В этой статье мы подробно разберем, почему так происходит, и рассмотрим два основных способа решения задачи: программный метод и использование механизма условного оформления.
Проанализируем ситуацию, описанную автором темы. В его коде изменение цвета было прописано только в процедуре ПриИзменении для элемента ЧерныйСписок. Это событие является интерактивным: оно срабатывает исключительно в тот момент, когда пользователь физически нажимает на чекбокс на форме. Когда же мы закрываем форму и открываем её заново, платформа считывает данные из базы данных и строит интерфейс «с нуля». Поскольку в процедурах инициализации формы (таких как ПриЧтенииНаСервере или ПриСозданииНаСервере) логика окрашивания отсутствовала, платформа устанавливала цвет текста по умолчанию — черный.
Кроме того, в исходном коде была допущена еще одна серьезная ошибка — вызов ЭтаФорма.Записать() внутри обработчика изменения визуального свойства. Это крайне избыточно и вредно для производительности, так как при каждом случайном клике по чекбоксу происходит полная запись объекта в базу данных. Визуальное оформление должно существовать отдельно от транзакций записи данных.
Выясним, почему опытные разработчики в сообщении 4 и 6 рекомендуют именно «Условное оформление». Этот механизм специально создан для управления визуальными свойствами элементов формы без написания лишнего кода. Он работает на уровне платформы и автоматически следит за тем, чтобы оформление соответствовало текущим данным, будь то открытие формы, перечитывание данных или интерактивное изменение пользователем.
Рассмотрим по шагам, как настроить условное оформление в конфигураторе:
Цвет текста и установим значение WebЦвета.Красный (или выберем соответствующий цвет стиля).Объект.ЧерныйСписок Равно Истина.Наименование.Важно развеять миф из сообщения 5 о том, что условное оформление работает только для таблиц. В управляемых формах (начиная с версии 8.2) этот механизм прекрасно применяется к любым полям ввода, надписям и группам. Это наиболее надежный и производительный метод.
Если по каким-то причинам использование условного оформления невозможно (например, условие слишком сложное и требует обращения к внешним функциям), мы можем реализовать задачу программно. Чтобы цвет сохранялся при повторном заходе в форму, логику нужно продублировать в событиях, отвечающих за загрузку данных.
Проанализируем ситуацию: нам нужно, чтобы цвет устанавливался и при открытии существующего объекта, и при изменении галочки пользователем. Разберем правильную структуру кода. Создадим общую процедуру для раскраски и будем вызывать ее из нужных мест.
&НаСервере
Процедура УстановитьЦветНаименованияНаСервере()
// Проверяем значение реквизита объекта
Если Объект.ЧерныйСписок Тогда
// Используем цвета стиля для корректной работы в темной теме
Элементы.Наименование.ЦветТекста = ЦветаСтиля.ПоясняющийТекстОшибки;
Иначе
Элементы.Наименование.ЦветТекста = ЦветаСтиля.ТекстЦвет;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЧерныйСписокПриИзменении(Элемент)
// Вызываем серверную процедуру для изменения цвета "на лету"
УстановитьЦветНаименованияНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Это событие срабатывает при открытии формы существующего объекта
// и при нажатии кнопки "Перечитать"
УстановитьЦветНаименованияНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Это событие срабатывает один раз при создании формы,
// полезно для установки начального состояния новых объектов
УстановитьЦветНаименованияНаСервере();
КонецПроцедуры
Посмотрим на ситуацию с точки зрения современных интерфейсов. Начиная с версии платформы 8.3.17, в 1С появилась полноценная поддержка тем оформления, включая темную тему. Если мы жестко пропишем WebЦвета.Черный, то пользователь, включивший темную тему, просто не увидит текст, так как черный текст на темно-сером фоне станет нечитаемым.
Поэтому в коде рекомендуется использовать объект ЦветаСтиля. Например, ЦветаСтиля.ТекстЦвет автоматически станет белым в темной теме и черным в светлой. Для выделения ошибок или важных статусов (как наш «Черный список») лучше использовать ЦветаСтиля.ПоясняющийТекстОшибки или ЦветаСтиля.ОсобыйТекст.
В сообщениях 7 и 8 автор столкнулся с ошибкой: «Процедура или функция не определена». Это произошло из-за попытки вызвать клиентскую процедуру из серверного контекста. В управляемых формах 1С существует четкое разделение:
&НаКлиенте работают в браузере или тонком клиенте.&НаСервере работают на стороне сервера 1С.
Прямой вызов клиентской процедуры из ПриЧтенииНаСервере невозможен. Именно поэтому мы вынесли логику окрашивания в отдельную серверную процедуру УстановитьЦветНаименованияНаСервере(), которая доступна для вызова из любого места серверного кода формы.
Также обратим внимание на сообщение 10, где предлагалось вызвать ЧерныйСписокПриИзменении(0). Никогда не передавайте фиктивные значения (типа 0) вместо объектов Элемент. Если в будущем вы решите доработать процедуру и обратиться к свойствам элемента (например, Элемент.Имя), программа выдаст критическую ошибку, так как у числа нет свойств элемента формы. Правильный путь — создание процедур без параметров для общей логики.
Подводя итог, можно сказать: наиболее современным и правильным способом является Условное оформление. Оно избавляет от необходимости контролировать контексты (клиент/сервер), следить за событиями открытия или записи и писать лишние строки кода. Если же вы выбираете программный путь, обязательно задействуйте событие ПриЧтенииНаСервере, чтобы ваши визуальные изменения сохранялись при каждом открытии формы пользователем.