В системе 1С:Предприятие 8 стандартное представление объектов (то, как они выглядят в списках, полях ввода и отчетах) обычно жестко задано в метаданных: для справочников это Наименование или Код, для документов — шаблон из номера и даты. Однако часто возникает задача выводить более информативную строку, например, добавлять ИНН к названию контрагента или артикул к номенклатуре, причем так, чтобы это работало во всей системе сразу.
В современных версиях платформы 1С 8.3 (начиная с 8.3.3) для этих целей предусмотрен штатный механизм переопределения представлений на уровне модуля менеджера. Рассмотрим подробно, как это реализовать, на что обратить внимание при разработке и как избежать критических ошибок производительности.
Для корректного изменения представления нам потребуется реализовать два метода в модуле менеджера объекта (справочника или документа). Эти методы работают в тесной связке:
Разберем реализацию на конкретном примере. Предположим, мы хотим, чтобы в справочнике Договоры представление выглядело как "Номер от Дата".
Откроем модуль менеджера нужного нам объекта и добавим следующий код:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Отключаем стандартную генерацию полей платформой
СтандартнаяОбработка = Ложь;
// Добавляем реквизиты, которые нам нужны для формирования строки
Поля.Добавить("Номер");
Поля.Добавить("Дата");
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Отключаем стандартное формирование представления
СтандартнаяОбработка = Ложь;
// Формируем строку на основе полученных данных
// Используем СтрШаблон для удобства форматирования
Представление = СтрШаблон(НСтр("ru = '№%1 от %2'"),
Данные.Номер,
Формат(Данные.Дата, "ДЛФ=D"));
КонецПроцедуры
Проанализируем этот код. В первом методе мы явно сказали системе: "Нам нужны Номер и Дата". Это позволяет платформе при выполнении запроса (например, в динамическом списке) сразу подтянуть эти поля из базы данных. Если этого не сделать, а сразу обратиться к Данные.Номер во втором методе, система будет вынуждена делать отдельный запрос к БД для каждой строки, что приведет к катастрофическому замедлению работы (проблема N+1).
Если нам нужно применить единую логику формирования представления для целой группы справочников или документов, удобнее использовать Подписки на события. Это избавит нас от дублирования кода в каждом модуле менеджера.
При создании подписки важно правильно выбрать источник. В качестве источника нужно выбирать не СправочникОбъект, а СправочникМенеджер (или ДокументМенеджер). Только у менеджеров доступны события получения представления.
Пример универсальной процедуры для подписки:
Процедура ПолучитьПредставлениеДокумента(Источник, Данные, Представление, СтандартнаяОбработка) Экспорт
СтандартнаяОбработка = Ложь;
// Безопасное получение данных через Свойство()
НомерДок = "";
Если Данные.Свойство("Номер") Тогда
НомерДок = Данные.Номер;
КонецЕсли;
ДатаДок = '00010101';
Если Данные.Свойство("Дата") Тогда
ДатаДок = Данные.Дата;
КонецЕсли;
Представление = СтрШаблон("%1 №%2 от %3",
Источник.Метаданные().Синоним,
НомерДок,
Формат(ДатаДок, "ДЛФ=D"));
КонецПроцедуры
Рассмотрим ситуацию, когда пользователь хочет менять вид представления "на лету", например, переключаться между кратким и полным наименованием. Поскольку обработчики выполняются при каждом выводе элемента, мы можем завязать логику на Параметры сеанса или Функциональные опции. Схожие задачи по настройке вывода данных решаются и при миграции, например, используя перенос данных КА 2 — БП 3.0, который поддерживает выгрузку пары «номенклатура + характеристика» в виде одной позиции.
Проанализируем пример с использованием параметра сеанса:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ПараметрыСеанса.ПоказыватьПолноеНаименование Тогда
Представление = Данные.НаименованиеПолное;
Иначе
Представление = Данные.Наименование;
КонецЕсли;
КонецПроцедуры
Таким образом, изменив значение ПараметрыСеанса.ПоказыватьПолноеНаименование, мы мгновенно обновим вид всех элементов справочника во всех открытых формах и отчетах пользователя.
При работе с этими обработчиками необходимо соблюдать строгие правила, чтобы не нарушить стабильность системы:
ОбработкаПолученияПредставления категорически запрещено выполнять запросы к базе данных или обращаться к реквизитам через точку (например, Данные.Склад.Наименование). Любое обращение "через точку" заставляет 1С прочитать весь объект из базы.УПОРЯДОЧИТЬ ПО Представление, SQL-сервер все равно будет сортировать по стандартному полю (Наименованию или Коду), так как он "не видит" ваш код на языке 1С.Совет: Для формирования строк используйте встроенную функцию СтрШаблон() или функции БСП СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(). Это делает код чище и защищает от ошибок при работе с типами данных. Если вам также потребуется полностью перенастроить интерактивный выбор объектов пользователем, полезно изучить руководство по переопределению ввода по строке в управляемых формах.