При разработке на управляемых формах 1С программисты часто сталкиваются с ситуацией, когда добавленный в конфигурацию общий реквизит наотрез отказывается появляться в настройках условного оформления динамического списка. Казалось бы, реквизит включен в состав документа, колонка в списке отображается, но при попытке задать условие (отбор) для раскраски строк, нужного поля просто нет в списке доступных. Рассмотрим подробнее, почему это происходит и как правильно настроить систему, чтобы оформление работало стабильно, даже если пользователь решит скрыть «лишние» колонки.
Проанализируем стандартное поведение динамического списка. Если для списка выбрана основная таблица и НЕ включен флаг «Произвольный запрос», платформа автоматически подтягивает все доступные реквизиты объекта, включая общие. Однако, как только мы переходим к использованию собственного текста запроса, автоматика перестает работать в полной мере.
Разберем по шагам, что нужно сделать в этом случае:
ВЫБРАТЬ. Если поле отсутствует в тексте запроса, оно не будет доступно для условного оформления, даже если оно существует в базе данных.
ВЫБРАТЬ
ДокументПродажа.Ссылка,
ДокументПродажа.Дата,
ДокументПродажа.Номер,
ДокументПродажа.ОбщийРеквизитФилиал // Добавляем явно
ИЗ
Документ.Продажа КАК ДокументПродажа
Ситуация, описанная в теме форума: «Снимаешь видимость с колонки — и оформление перестает работать». Это классическая проблема оптимизации управляемого интерфейса. Платформа 1С стремится минимизировать трафик между сервером и клиентом. Если колонка не отображается на форме (пользователь ее скрыл через «Изменить форму» или разработчик снял флаг видимости), система считает, что данные этого поля передавать на клиент не нужно.
Но для вычисления условий условного оформления данные этого поля необходимы на клиенте! Чтобы решить эту проблему, выполним следующие действия:
ДинамическийСписок).Важный нюанс: Установка этого свойства гарантирует, что значение реквизита будет передаваться в составе каждой строки данных с сервера на клиент, независимо от того, выведена ли соответствующая колонка в таблицу или скрыта пользователем. Теперь раскраска строк не «сломается», даже если пользователь решит навести порядок в своем интерфейсе.
Рассмотрим ситуацию, когда визуальный конструктор по каким-то причинам не позволяет выбрать нужный путь к данным. В таких случаях надежнее всего настроить оформление программно в процедуре ПриСозданииНаСервере. Это гарантирует, что настройки будут применены корректно.
Пример кода для программной раскраски строк по общему реквизиту:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем новый элемент условного оформления
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
// Устанавливаем цвет фона (например, светло-красный)
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветФонаПредупреждения);
// Задаем условие: ОбщийРеквизитФилиал = ЗначениеФилиала
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОбщийРеквизитФилиал");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Параметры.ТекущийФилиал;
// Указываем, какие поля оформлять (если не добавить, оформится вся строка)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Номер");
КонецПроцедуры
Выясним причину, по которой списки могут начать «тормозить» после добавления оформления по общему реквизиту. Если общий реквизит не проиндексирован, то при каждом скроллинге списка серверу базы данных приходится выполнять поиск или фильтрацию по неиндексированному полю, что крайне ресурсозатратно.
Проанализируем настройки реквизита в метаданных:
Индексировать (или Индексировать с доп. упорядочиванием, если планируется сортировка).Если общий реквизит имеет составной тип данных, он может не отображаться в конструкторе из-за неоднозначности полей. В этом случае в произвольном запросе динамического списка рекомендуется использовать функцию ВЫРАЗИТЬ(ОбщийРеквизит КАК Тип). Это явно укажет платформе тип данных поля, и оно станет доступным для выбора в левом значении отбора оформления.
Также стоит помнить о Функциональных опциях. Если общий реквизит включен в функциональную опцию, которая в данный момент отключена для пользователя, поле исчезнет из всех настроек, включая оформление. Проверьте этот момент, если раскраска «мистическим образом» работает у администратора, но не работает у рядового сотрудника.
Подведем итог: для успешного использования общего реквизита в условном оформлении необходимо обеспечить его наличие в выборке (в запросе), гарантировать его передачу на клиент (через «Использовать всегда») и позаботиться о производительности (через индексирование).