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