Как правильно изменить визуальное представление элемента справочника в 1С и убрать дублирование в наименовании

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на платформе 1С:Предприятие 8 часто возникает задача изменить то, как элемент справочника отображается в списках, полях выбора или заголовках форм. Например, нужно добавить к названию товара его артикул или название родительской группы. Однако новички часто совершают ошибку, пытаясь записывать эти данные напрямую в реквизит Наименование, что приводит к порче данных и бесконечному дублированию строк. В этой статье мы разберем, как правильно управлять визуальным представлением объекта, не затрагивая его физическое имя в базе данных.

Различие между Наименованием и Представлением

Прежде всего, проанализируем фундаментальное различие между двумя понятиями, которые часто путают. Наименование (Description) — это строка, которая физически хранится в таблице базы данных. Если вы программно измените её и вызовете метод Записать(), значение в базе изменится навсегда.

Представление (Presentation) — это «виртуальная» строка, которую платформа формирует «на лету» для отображения пользователю. Правильный подход заключается в том, чтобы оставлять Наименование чистым (например, «Серебро»), а в коде формирования представления склеивать его с нужными данными (например, «Серебро (Металл)»). Рассмотрим, как это реализовать технически.

Шаг 1. Использование обработчика ОбработкаПолученияПредставления

Основным инструментом для решения нашей задачи является специальное событие в Модуле менеджера справочника — ОбработкаПолученияПредставления. Рассмотрим ситуацию, когда нам нужно добавить к названию элемента имя его родительской группы. Если мы просто сложим строки, не проверяя условия, мы можем получить некорректный вид для самих групп (папок).

Разберем пример кода, который часто приводит к ошибкам, и выясним причину:


// Не совсем верный подход
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    Представление = Данные.Наименование + " (" + СокрЛП(Данные.Родитель) + ")";
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

В данном случае, если мы не установим условие, платформа будет пытаться добавить родителя даже к тем элементам, которые сами являются группами. Кроме того, если в самом Наименовании уже содержится текст, который мы добавляем, возникнет эффект «двоения» (например, «Серебро (Металл) (Металл)»).

Шаг 2. Работа с реквизитом ЭтоГруппа

Чтобы избежать изменения внешнего вида папок в иерархическом справочнике, необходимо использовать реквизит ЭтоГруппа. Это логическое поле (Булево), которое определяет, является ли текущая запись папкой или конечным элементом. Посмотрим на правильную логику реализации:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    // Проверяем, что это не группа (папка)
    Если НЕ Данные.ЭтоГруппа Тогда
        Представление = Данные.Наименование + " (" + Строка(Данные.Родитель) + ")";
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Обратите внимание на использование НЕ Данные.ЭтоГруппа. Это позволяет нам оставить стандартное отображение для групп (папок) и модифицировать представление только для элементов. Пустая ветка в условии Если считается плохим тоном, поэтому инверсия условия — наиболее изящное решение.

Шаг 3. Регистрация полей в ОбработкаПолученияПолейПредставления

Одной из самых частых причин «краха» при попытке реализовать этот функционал является отсутствие нужных полей в структуре Данные. Платформа 1С в целях оптимизации передает в обработчик получения представления не весь объект, а только ограниченный набор полей. Если вы попытаетесь обратиться к Данные.Родитель или Данные.ЭтоГруппа, а они не задекларированы, вы получите неопределенное значение или ошибку.

Выясним, как правильно «заказать» необходимые данные у платформы. Для этого в том же Модуле менеджера используется обработчик ОбработкаПолученияПолейПредставления:


Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
    
    // Добавляем необходимые реквизиты в список полей, 
    // которые будут доступны в обработчике представления
    Поля.Добавить("Наименование");
    Поля.Добавить("Родитель");
    Поля.Добавить("ЭтоГруппа");
    
КонецПроцедуры

Без этого шага ваши попытки обратиться к ЭтоГруппа в коде будут тщетны. Платформа просто не выгрузит это поле из базы данных для формирования строки представления.

Шаг 4. Устранение причин дублирования данных

Если вы видите, что в представлении текст повторяется дважды (например, «Серебро (Металл) (Металл)»), проанализируйте следующие моменты:

  1. Проверьте физическое наименование: Вполне вероятно, что пользователь уже сохранил элемент с текстом «Серебро (Металл)» в поле Наименование. В этом случае обработчик просто добавляет родителя еще раз. Нужно очистить наименование до «Серебро».
  2. Проверьте Модуль объекта и Модуль формы: Проверьте процедуры ПередЗаписью или ПриЗаписи. Возможно, там остался старый код, который принудительно дописывает родителя к наименованию перед сохранением объекта в базу.
  3. Кэширование представлений: Платформа 1С активно кэширует строковые представления. Если вы изменили код в модуле менеджера, старые элементы в открытых списках могут отображаться по-прежнему. Попробуйте создать новый элемент («Какая-то хрень») для проверки актуальности алгоритма.

Шаг 5. Отладка с помощью точки останова

Если поведение системы кажется «магическим», воспользуемся самым надежным способом — отладкой. Поставим точку останова в процедуре ОбработкаПолученияПредставления. Когда система начнет отрисовывать список, выполнение прервется, и мы сможем проанализировать состояние системы:

Важный совет: При сложении строк со ссылочными типами (такими как Данные.Родитель), лучше использовать функцию Строка() или явно обращаться к наименованию родителя, предварительно добавив Родитель.Наименование в список полей представления. Это сделает ваш код более устойчивым к ошибкам преобразования типов.

Таким образом, комбинируя правильное описание полей и грамотную проверку типа объекта через ЭтоГруппа, мы получаем гибкий инструмент управления интерфейсом, который не портит данные в базе и корректно реагирует на перемещение элементов между папками справочника.

← На главную