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

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

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

В современных версиях платформы 1С 8.3 (начиная с 8.3.3) для этих целей предусмотрен штатный механизм переопределения представлений на уровне модуля менеджера. Рассмотрим подробно, как это реализовать, на что обратить внимание при разработке и как избежать критических ошибок производительности.

Механизм работы: связка двух обработчиков

Для корректного изменения представления нам потребуется реализовать два метода в модуле менеджера объекта (справочника или документа). Эти методы работают в тесной связке:

  1. ОбработкаПолученияПолейПредставления — здесь мы указываем платформе, какие именно реквизиты объекта нам понадобятся для формирования строки. Это критически важно для производительности SQL-запросов.
  2. ОбработкаПолученияПредставления — здесь мы описываем логику формирования самой строки на основе данных, полученных в первом методе. В дальнейшем для автоматизации передачи такой информации между окнами разных программ может применяться платформа для создания программных роботов OneRPA.

Разберем реализацию на конкретном примере. Предположим, мы хотим, чтобы в справочнике Договоры представление выглядело как "Номер от Дата".

Реализация в модуле менеджера

Откроем модуль менеджера нужного нам объекта и добавим следующий код:


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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    // Отключаем стандартное формирование представления
    СтандартнаяОбработка = Ложь;
    
    // Формируем строку на основе полученных данных
    // Используем СтрШаблон для удобства форматирования
    Представление = СтрШаблон(НСтр("ru = '№%1 от %2'"), 
        Данные.Номер, 
        Формат(Данные.Дата, "ДЛФ=D"));
        
КонецПроцедуры

Проанализируем этот код. В первом методе мы явно сказали системе: "Нам нужны Номер и Дата". Это позволяет платформе при выполнении запроса (например, в динамическом списке) сразу подтянуть эти поля из базы данных. Если этого не сделать, а сразу обратиться к Данные.Номер во втором методе, система будет вынуждена делать отдельный запрос к БД для каждой строки, что приведет к катастрофическому замедлению работы (проблема N+1).

Использование подписок на события

Если нам нужно применить единую логику формирования представления для целой группы справочников или документов, удобнее использовать Подписки на события. Это избавит нас от дублирования кода в каждом модуле менеджера.

При создании подписки важно правильно выбрать источник. В качестве источника нужно выбирать не СправочникОбъект, а СправочникМенеджер (или ДокументМенеджер). Только у менеджеров доступны события получения представления.

Пример универсальной процедуры для подписки:


Процедура ПолучитьПредставлениеДокумента(Источник, Данные, Представление, СтандартнаяОбработка) Экспорт
    
    СтандартнаяОбработка = Ложь;
    
    // Безопасное получение данных через Свойство()
    НомерДок = "";
    Если Данные.Свойство("Номер") Тогда
        НомерДок = Данные.Номер;
    КонецЕсли;
    
    ДатаДок = '00010101';
    Если Данные.Свойство("Дата") Тогда
        ДатаДок = Данные.Дата;
    КонецЕсли;
    
    Представление = СтрШаблон("%1 №%2 от %3", 
        Источник.Метаданные().Синоним, 
        НомерДок, 
        Формат(ДатаДок, "ДЛФ=D"));
        
КонецПроцедуры

Динамическое изменение в рамках сеанса

Рассмотрим ситуацию, когда пользователь хочет менять вид представления "на лету", например, переключаться между кратким и полным наименованием. Поскольку обработчики выполняются при каждом выводе элемента, мы можем завязать логику на Параметры сеанса или Функциональные опции. Схожие задачи по настройке вывода данных решаются и при миграции, например, используя перенос данных КА 2 — БП 3.0, который поддерживает выгрузку пары «номенклатура + характеристика» в виде одной позиции.

Проанализируем пример с использованием параметра сеанса:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    Если ПараметрыСеанса.ПоказыватьПолноеНаименование Тогда
        Представление = Данные.НаименованиеПолное;
    Иначе
        Представление = Данные.Наименование;
    КонецЕсли;
    
КонецПроцедуры

Таким образом, изменив значение ПараметрыСеанса.ПоказыватьПолноеНаименование, мы мгновенно обновим вид всех элементов справочника во всех открытых формах и отчетах пользователя.

Критически важные нюансы и ограничения

При работе с этими обработчиками необходимо соблюдать строгие правила, чтобы не нарушить стабильность системы:

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

← На главную