В процессе администрирования и поддержки конфигураций 1С (например, 1С:Зарплата и управление персоналом 3.1) нередко возникает ситуация: два пользователя с одинаковыми полными правами формируют один и тот же типовой отчет (к примеру, Расчетный листок по одному сотруднику), но у одного формирование занимает 10–11 секунд, а у второго — более минуты. При этом перенос сеанса на другой компьютер или терминальный сервер не меняет картину. Проанализируем, почему возникает такое поведение платформы, как настройки пользователя влияют на исполняемый код и как решить данную проблему.
Когда мы сталкиваемся с подобным поведением, подозрение часто ошибочно падает на локальный кэш пользователя или сервер 1С:Предприятия. Однако копирование настроек проблемного пользователя администратору сразу же воспроизводит замедление. Выясним фундаментальные причины такой разницы:
Сотрудник.Подразделение.Родитель), скрытые группировки или сортировки, СКД автоматически добавляет конструкции LEFT JOIN к таблицам информационной базы. Это кардинально перестраивает план выполнения запроса на стороне СУБД.Начисления, Удержания и регистр накопления Взаиморасчеты с сотрудниками с разной глубиной.ПолныеПрава не всегда отключает механизмы разграничения прав на уровне записей (RLS), управляемые БСП. Если для профиля пользователя включены ограничения по организациям или группам физических лиц, платформа внедряет в итоговые запросы соединения с таблицами ключей доступа.Table Scan вместо индексного поиска Index Seek).Рассмотрим по шагам, как локализовать и точно определить причину задержки при формировании отчета под конкретным пользователем.
Шаг 1. Сравнение настроек компоновщика через XML.
Пользовательские настройки отчета хранятся в объекте КомпоновщикНастроек. Чтобы увидеть реальные различия, выгрузим настройки обоих пользователей в XML через отладчик или внешнюю обработку:
// Пример программной выгрузки пользовательских настроек в XML
НастройкиXML = Новый ЗаписьXML;
НастройкиXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(НастройкиXML, ОтчетОбъект.КомпоновщикНастроек.ПользовательскиеНастройки);
СтрокаXML = НастройкиXML.Закрыть();
Сравним полученные текстовые файлы в любой утилите сравнения (diff). Это сразу покажет, какие скрытые поля, отборы или параметры вывода были активированы у медленного пользователя.
Шаг 2. Замер производительности в Конфигураторе.
Запустим замер производительности и выполним отчет под обоими пользователями. Посмотрим на распределение времени:
ПроцессорКомпоновкиДанных.Инициализировать() или ПроцессорВывода.Вывести() — причина в сложных вычисляемых полях или тяжелых соединениях СКД.Разберем практические способы восстановления нормальной скорости формирования отчета.
1. Очистка и сброс пользовательских настроек отчета
Поскольку настройки вариантов отчетов сохраняются в системных таблицах информационной базы (в частности, ХранилищеВариантовОтчетов и ХранилищеСистемныхНастроек), стандартной очистки локального кэша файлов на диске недостаточно. Выполним следующие действия:
2. Копирование эталонных настроек
Если у одного из пользователей (например, администратора) отчет работает быстро и корректно, скопируем его настройки проблемному пользователю:
3. Обновление статистики и очистка процедурного кэша СУБД
Если сброс настроек привел к непредсказуемому изменению времени формирования (например, время выросло еще сильнее), выполним регламентное обслуживание базы данных на сервере СУБД:
DBCC FREEPROCCACHE), чтобы сервер перестроил планы выполнения тяжелых запросов СКД с учетом актуальной плотности данных.