Почему обработка в 1С выполняется значительно дольше при тех же данных и коде?

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

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

Анализ состояния СУБД: статистика и планы запросов

Первое, на что стоит обратить внимание, — это взаимодействие 1С с SQL-сервером. Даже если вы восстановили базу из вчерашнего бэкапа, окружение SQL-сервера (процедурный кэш, системные базы) осталось прежним. Одной из наиболее вероятных причин является актуальность статистики и проблема Parameter Sniffing.

Разберем подробнее: SQL Server строит план выполнения запроса на основе статистики распределения данных. Если статистика устарела или первый запуск запроса произошел с нетипичными параметрами, сервер может закешировать крайне неэффективный план. В результате вместо быстрого поиска по индексу (Index Seek) может выполняться полное сканирование таблицы (Index Scan).

Для решения этой проблемы выполним следующие действия:

  1. Обновим статистику для всех таблиц базы данных.
  2. Очистим процедурный кэш, чтобы заставить SQL Server перестроить планы запросов.

Рассмотрим пример команды для SQL Server Management Studio, которая поможет обновить статистику:


-- Обновление статистики для текущей базы данных
EXEC sp_updatestats;
GO
-- Очистка кэша планов (выполнять с осторожностью на рабочем сервере!)
DBCC FREEPROCCACHE;
GO

Проверка влияния регламентных заданий и «соседей» по серверу

Зачастую администраторы утверждают, что «в системе ничего не менялось», однако регламентные задания могут запускаться автоматически по расписанию ОС или SQL-сервера. Проанализируем возможные фоновые процессы:

Использование замера производительности 1С

Чтобы не гадать, «где тормозит», воспользуемся встроенным инструментом — Замером производительности. Это позволит точно определить, на какой строке кода или на каком объекте система тратит основное время.

Выполним следующие шаги:

  1. Откроем обработку в режиме «1С:Предприятие».
  2. Включим замер производительности (Меню - Сервис - Замер производительности).
  3. Запустим выполнение обработки на небольшом участке данных.
  4. Проанализируем колонки «Число вызовов» и «Чистая сумма времени».

Если замер показывает, что основное время уходит на метод Записать() или УстановитьПометкуУдаления(), значит, проблема в блокировках или дисковой подсистеме SQL. Если же время тратится на вычисления внутри циклов — проблема в алгоритме или кэшировании данных на стороне сервера приложений.

Логирование ключевых точек в Журнале регистрации

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


Процедура ВыполнитьОбработку()
    
    НачалоЭтапа = ТекущаяДата();
    ЗаписьЖурналаРегистрации("ОбработкаДанных.Старт", УровеньЖурналаРегистрации.Информация, , , "Запуск обработки документов");
    
    // Цикл обработки данных
    Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
        
        // Ключевая операция: проведение документа
        Попытка
            ДокументОбъект = СтрокаДанных.Ссылка.ПолучитьОбъект();
            ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
            ЗаписьЖурналаРегистрации("ОбработкаДанных.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        КонецПопытки;
        
    КонецЦикла;
    
    Длительность = ТекущаяДата() - НачалоЭтапа;
    ЗаписьЖурналаРегистрации("ОбработкаДанных.Завершение", УровеньЖурналаРегистрации.Информация, , , "Обработка завершена за " + Длительность + " сек.");
    
КонецПроцедуры

Проблема кэширования метаданных и сеансовых данных

Сервер 1С:Предприятия активно использует кэширование метаданных в каталоге srvinfo. Иногда в этих данных происходит сбой (так называемое «протухание» кэша), что заставляет сервер тратить лишние ресурсы на десериализацию объектов. Проанализируем возможность очистки временных файлов:

Настройки электропитания сервера

Выясним, не перешел ли сервер в режим энергосбережения. На многих серверных платформах режим Balanced может приводить к тому, что частота процессора снижается в моменты низкой активности. Когда запускается тяжелая обработка 1С, планировщик ОС может не сразу поднять частоту до максимума, или делать это рывками. Всегда устанавливайте режим «Высокая производительность» (High Performance) в настройках электропитания Windows Server и в настройках BIOS сервера.

Заключение

Разница во времени выполнения с 8 до 40 минут — это слишком большой разрыв, чтобы списать его на «погрешность». Скорее всего, мы имеем дело с совокупностью факторов: неоптимальным планом SQL-запроса из-за старой статистики и фоновой нагрузкой на дисковую подсистему. Рекомендуется последовательно исключать каждый фактор, начиная с обновления статистики SQL и заканчивая проверкой режима питания сервера.

← На главную