Почему при открытии заказа в 1С:УНФ 1.6 тысячи раз вызывается ОбработкаПолученияПредставления

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

При работе с крупными конфигурациями на базе 1С:Предприятие 8.3, такими как Управление нашей фирмой (УНФ) 1.6, разработчики часто сталкиваются с необъяснимым замедлением открытия форм документов. Одной из самых загадочных проблем является массовый вызов процедуры ОбработкаПолученияПредставления в модуле менеджера конкретного документа (например, документа «Событие») при открытии совершенно другого документа (например, «Заказ покупателя»).

Проанализируем ситуацию: замер производительности показывает 12 000 вызовов, точка останова не дает стека вызовов, а визуально в форме никаких лишних таблиц нет. Разберемся по шагам, почему это происходит и как найти «виновника» этого процесса.

Загадка отсутствующего стека вызовов

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

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

Скрытые динамические списки и их влияние

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

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

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


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Представление = "Событие №" + Данные.Номер + " от " + Формат(Данные.Дата, "ДФ=dd.MM.yyyy");
КонецПроцедуры

Если система пытается отрисовать список из 12 000 событий, этот код будет выполнен ровно 12 000 раз, что существенно затормозит открытие формы заказа.

Особенности УНФ 1.6: Контактный центр и Лента событий

В конфигурации Управление нашей фирмой реализован мощный блок CRM. В форме заказа часто встроены механизмы, которые анализируют «касания» клиента. Разберем основные «подозрительные» места:

Неявное преобразование к строке

Рассмотрим еще одну ситуацию, упомянутую в обсуждении: неявное преобразование ссылки к строке. Это может произойти в коде 1С, который вы не заметили при первом просмотре. Например, если массив ссылок документов «Событие» передается в функцию, которая формирует описание для лога или выводит информацию в отладочное табло.

Пример «опасного» кода:


Для Каждого ТекСобытие Из МассивСобытий Цикл
    // Даже простое добавление в текстовую строку вызовет обработчик представления
    ТекстЛога = ТекстЛога + ТекСобытие + Символы.ПС; 
КонецЦикла;

Если в МассивСобытий попало 12 000 объектов, мы получим соответствующее замедление.

Как найти виновника: пошаговая методика

Если стандартный замер производительности не дает понимания контекста, а стека вызовов нет, рекомендуем выполнить следующие действия:

  1. Проверка табло и локальных переменных: Убедитесь, что у вас в конфигураторе не открыто «Табло» или окно «Локальные переменные», в которых вычисляется значение какой-либо таблицы значений или массива со ссылками на события. Платформа в режиме отладки обновляет представления для всех видимых в табло объектов.
  2. Временное удаление элементов формы: Создайте копию базы и поочередно удаляйте из формы «Заказа покупателя» группы элементов и динамические списки. Если после удаления очередной группы вызовы прекратились — вы нашли проблемный элемент.
  3. Использование Технологического журнала (ТЖ): Это наиболее продвинутый метод. Настройте сбор событий SDBL и CALL. В ТЖ будет видно, какой именно SQL-запрос предшествует массовому вызову представлений. Чаще всего вы увидите запрос к таблице _DocumentJournal или _DocumentX (где X — номер таблицы событий), и по контексту запроса (набору полей) можно будет понять, какой динамический список его инициировал.
  4. Анализ параметров запроса в динамических списках: Проверьте, нет ли в запросах динамических списков обращения к полю Представление. Прямое обращение к Событие.Представление в тексте запроса гарантированно вызывает обработчик в модуле менеджера для каждой выбранной строки.

Итоги проделанного анализа

Ситуация с 12 000 вызовов ОбработкаПолученияПредставления — это классический случай «избыточной выборки данных». Платформа 1С:Предприятие 8.3 старается быть дружелюбной к пользователю и автоматически подготавливает текстовые описания для всех ссылок, которые попадают в зону видимости интерфейса или определенных программных механизмов.

Основные выводы:

← На главную