При разработке на платформе 1С:Предприятие 8 часто возникает задача изменить то, как элемент справочника отображается в списках, полях выбора или заголовках форм. Например, нужно добавить к названию товара его артикул или название родительской группы. Однако новички часто совершают ошибку, пытаясь записывать эти данные напрямую в реквизит Наименование, что приводит к порче данных и бесконечному дублированию строк. В этой статье мы разберем, как правильно управлять визуальным представлением объекта, не затрагивая его физическое имя в базе данных.
Прежде всего, проанализируем фундаментальное различие между двумя понятиями, которые часто путают. Наименование (Description) — это строка, которая физически хранится в таблице базы данных. Если вы программно измените её и вызовете метод Записать(), значение в базе изменится навсегда.
Представление (Presentation) — это «виртуальная» строка, которую платформа формирует «на лету» для отображения пользователю. Правильный подход заключается в том, чтобы оставлять Наименование чистым (например, «Серебро»), а в коде формирования представления склеивать его с нужными данными (например, «Серебро (Металл)»). Рассмотрим, как это реализовать технически.
Основным инструментом для решения нашей задачи является специальное событие в Модуле менеджера справочника — ОбработкаПолученияПредставления. Рассмотрим ситуацию, когда нам нужно добавить к названию элемента имя его родительской группы. Если мы просто сложим строки, не проверяя условия, мы можем получить некорректный вид для самих групп (папок).
Разберем пример кода, который часто приводит к ошибкам, и выясним причину:
// Не совсем верный подход
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
Представление = Данные.Наименование + " (" + СокрЛП(Данные.Родитель) + ")";
СтандартнаяОбработка = Ложь;
КонецПроцедуры
В данном случае, если мы не установим условие, платформа будет пытаться добавить родителя даже к тем элементам, которые сами являются группами. Кроме того, если в самом Наименовании уже содержится текст, который мы добавляем, возникнет эффект «двоения» (например, «Серебро (Металл) (Металл)»).
Чтобы избежать изменения внешнего вида папок в иерархическом справочнике, необходимо использовать реквизит ЭтоГруппа. Это логическое поле (Булево), которое определяет, является ли текущая запись папкой или конечным элементом. Посмотрим на правильную логику реализации:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Проверяем, что это не группа (папка)
Если НЕ Данные.ЭтоГруппа Тогда
Представление = Данные.Наименование + " (" + Строка(Данные.Родитель) + ")";
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование НЕ Данные.ЭтоГруппа. Это позволяет нам оставить стандартное отображение для групп (папок) и модифицировать представление только для элементов. Пустая ветка в условии Если считается плохим тоном, поэтому инверсия условия — наиболее изящное решение.
Одной из самых частых причин «краха» при попытке реализовать этот функционал является отсутствие нужных полей в структуре Данные. Платформа 1С в целях оптимизации передает в обработчик получения представления не весь объект, а только ограниченный набор полей. Если вы попытаетесь обратиться к Данные.Родитель или Данные.ЭтоГруппа, а они не задекларированы, вы получите неопределенное значение или ошибку.
Выясним, как правильно «заказать» необходимые данные у платформы. Для этого в том же Модуле менеджера используется обработчик ОбработкаПолученияПолейПредставления:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Добавляем необходимые реквизиты в список полей,
// которые будут доступны в обработчике представления
Поля.Добавить("Наименование");
Поля.Добавить("Родитель");
Поля.Добавить("ЭтоГруппа");
КонецПроцедуры
Без этого шага ваши попытки обратиться к ЭтоГруппа в коде будут тщетны. Платформа просто не выгрузит это поле из базы данных для формирования строки представления.
Если вы видите, что в представлении текст повторяется дважды (например, «Серебро (Металл) (Металл)»), проанализируйте следующие моменты:
Наименование. В этом случае обработчик просто добавляет родителя еще раз. Нужно очистить наименование до «Серебро».ПередЗаписью или ПриЗаписи. Возможно, там остался старый код, который принудительно дописывает родителя к наименованию перед сохранением объекта в базу.Если поведение системы кажется «магическим», воспользуемся самым надежным способом — отладкой. Поставим точку останова в процедуре ОбработкаПолученияПредставления. Когда система начнет отрисовывать список, выполнение прервется, и мы сможем проанализировать состояние системы:
Данные. Содержит ли она поле ЭтоГруппа? Какое там значение?Данные.Наименование. Если там уже есть скобки с названием группы, значит, проблема в данных базы, а не в коде.Важный совет: При сложении строк со ссылочными типами (такими как Данные.Родитель), лучше использовать функцию Строка() или явно обращаться к наименованию родителя, предварительно добавив Родитель.Наименование в список полей представления. Это сделает ваш код более устойчивым к ошибкам преобразования типов.
Таким образом, комбинируя правильное описание полей и грамотную проверку типа объекта через ЭтоГруппа, мы получаем гибкий инструмент управления интерфейсом, который не портит данные в базе и корректно реагирует на перемещение элементов между папками справочника.