Как переопределить стандартное представление документа в 1С 8.3

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

При стандартной работе платформа 1С формирует строковое представление документа по единому шаблону: синоним метаданных, номер и дата (например, «Бюджет доходов и расходов 0000001 от 01.01.2016»). Однако в реальных задачах управленческого или регламентированного учета пользователям гораздо удобнее видеть прикладную информацию — например, «Бюджет доходов и расходов за январь 2016».

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

Где и как переопределяется представление

Для программного формирования пользовательского представления ссылки используются экспортные процедуры в модуле менеджера соответствующего объекта метаданных. Перейдем в дерево метаданных, откроем модуль менеджера нужного документа и определим логику формирования строки.

Ключевую роль играет событие ОбработкаПолученияПредставления. Чтобы платформа вывела сформированный нами текст, необходимо присвоить результирующее значение параметру Представление и обязательно установить флаг СтандартнаяОбработка = Ложь.

Посмотрим на пример базовой реализации:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) Экспорт

    СтандартнаяОбработка = Ложь;
    
    // Формируем пользовательскую строку представления
    Представление = "БДР за " + Формат(Данные.ПериодПланирования, "ДФ='ММММ гггг'");

КонецПроцедуры

Почему обработчик не вызывается: проверка режима совместимости

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

Проанализируем причину такого поведения. Механизм перехвата формирования представлений на уровне менеджера объектов был добавлен в платформе 1С:Предприятие 8.3.3. Если в свойствах конфигурации включен режим совместимости с версиями 8.2 (например, Версия 8.2.16) или версиями ниже 8.3.3, платформа просто отключает данный функционал и не вызывает назначенные обработчики.

Разберем по шагам, как это исправить:

  1. Откроем палитру свойств корневого элемента конфигурации.
  2. Найдем раздел Совместимость и параметр Режим совместимости.
  3. Установим значение Не использовать или версию не ниже Версия 8.3.3.
  4. Обновим конфигурацию базы данных и повторим проверку работы точки останова.

Оптимизация: парная процедура и предотвращение проблемы N+1

Разберем важнейшую ошибку проектирования, способную парализовать работу базы данных. Если мы обращаемся к реквизитам через свойство Данные.Ссылка.Реквизит, платформа при отображении каждой строки динамического списка или каждой записи отчета отправляет отдельный неявный SQL-запрос к СУБД для чтения этого реквизита. При выводе 1000 строк система выполнит 1000 дополнительных запросов к базе.

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

Посмотрим на правильный совместный шаблон обеих процедур:


Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) Экспорт

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

КонецПроцедуры

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) Экспорт

    СтандартнаяОбработка = Ложь;
    
    // Считываем значение напрямую из структуры Данные без обращения через Данные.Ссылка
    Если Данные.Свойство("ПериодПланирования") И ЗначениеЗаполнено(Данные.ПериодПланирования) Тогда
        Представление = "БДР за " + Формат(Данные.ПериодПланирования, "ДФ='ММММ гггг'");
    Иначе
        Представление = "БДР (период не заполнен)";
    КонецЕсли;

КонецПроцедуры

В таком варианте платформа самостоятельно добавит ПериодПланирования в основной запрос выборки данных списка, не порождая паразитной нагрузки на сервер.

Нюансы и ограничения механизма

Выясним особенности поведения кастомных представлений в интерфейсе «Такси» и на управляемых формах:

  1. Сортировка и поиск в динамических списках: Платформа не может транслировать произвольный код 1С в текст SQL-запроса. Поэтому при попытке отсортировать колонку «Ссылка» в динамическом списке упорядочивание будет выполняться не по полученному тексту, а по внутренним стандартным полям. Поиск по строке также может давать сбои, если вычисленного текста нет среди реальных полей выборки.
  2. Частота вызова: Код модуля менеджера вызывается массово — при вызове функции языка запросов ПРЕДСТАВЛЕНИЕ(), в отчетах СКД, при явном приведении типа Строка(Ссылка) и во всех элементах интерфейса. Категорически избегайте выполнения тяжелых вычислений, вызова внешних сервисов и создания COM-объектов внутри этих процедур.
  3. Использование подписок на события: Если конфигурация находится на поддержке без возможности изменения модуля менеджера документа, аналогичную логику можно реализовать через объект Подписка на событие, выбрав в качестве источника менеджер документа, а в качестве события — ОбработкаПолученияПредставления.

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

← На главную