← Назад к вопросам

Как понять, кто виноват в медленной операции: сервер 1С или СУБД?

2.8 Senior🔥 141 комментариев
#Запросы и оптимизация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Диагностика производительности: 1С сервер vs СУБД

Определение узкого места в медленной операции — критическое умение. В 1С существуют инструменты и методы для выявления виновника: сервер 1С или база данных.

Общий подход к диагностике

Когда операция медленная, возможны два сценария:

1. СУБД ВИНОВАТА
   - Медленные SQL запросы
   - Отсутствие индексов
   - Полное сканирование таблиц
   - Блокировки в БД
   - Проблемы с памятью БД

2. СЕРВЕР 1С ВИНОВАТ
   - Неправильная логика на сервере
   - Обработка большого объёма данных в памяти
   - Множество циклов и вложенных операций
   - Кэш переполнен
   - Проблемы с модулями и зависимостями

Инструмент 1: Профилировщик 1С (Performance Monitor)

Встроенный профилировщик показывает время выполнения

// Включение профилирования
Процедура МедленнаяОперация()
    // Профилировщик показывает время каждой строки
    ВремяНачала = ТекущаяУниверсальнаяДата();
    
    // Операция 1: Запрос к БД
    Запрос = Новый Запрос("ВЫБРАТЬ ВСЕ ИЗ Справочник.Товары");
    ВремяЗапроса = ТекущаяУниверсальнаяДата() - ВремяНачала;
    
    ВремяОперация = ТекущаяУниверсальнаяДата();
    // Операция 2: Обработка в памяти
    Результат = Запрос.Выполнить();
    
    ВремяОбработки = ТекущаяУниверсальнаяДата() - ВремяОперация;
    
    Сообщение("Время запроса: " + ВремяЗапроса + " мс");
    Сообщение("Время обработки: " + ВремяОбработки + " мс");
КонецПроцедуры

Как включить профилировщик:

  1. Меню → Сервис → Профилировщик производительности
  2. Запустить операцию
  3. Сохранить результаты в файл .perf
  4. Анализировать отчёт

Инструмент 2: Журнал протокола (Logfile)

Логи показывают время на SQL запросы

// В файле logfile.log видны все SQL запросы
// Пример строки:
// 00:00:00.123 Процедура МедленнаяОперация
// 00:00:00.456 EXECUTE: SELECT * FROM Товары (время: 233ms)
// 00:00:00.789 Обработка результата (время: 333ms)

// Включение логирования:
// В конфиге сервера 1С:
// <logging location="..." enable="1" />

Анализ логов:

# На сервере просмотреть лог
grep "EXECUTE" logfile.log | tail -50

# Найти самые медленные запросы
grep "EXECUTE" logfile.log | sort -t: -k2 -rn | head -20

Инструмент 3: Встроенный анализатор запросов

Встроенный анализатор в конфигураторе

// Меню → Сервис → Анализ
// Проверяет:
// - Правильность синтаксиса запросов
// - Наличие индексов
// - Потенциальные проблемы производительности

Метод 1: Измерение времени выполнения запроса

Отделяем время БД от времени сервера 1С:

Процедура ДиагностикаБД()
    // Шаг 1: Запрос с замером времени
    ВремяДо = ТекущаяУниверсальнаяДата();
    
    Запрос = Новый Запрос(
        "ВЫБРАТЬ
        |   Товары.Наименование,
        |   Товары.Цена,
        |   Товары.Количество
        |ИЗ
        |   Справочник.Товары Как Товары
        |ГДЕ
        |   Товары.ПометкаУдаления = ЛОЖЬ"
    );
    
    ВремяПослеПодготовки = ТекущаяУниверсальнаяДата();
    Результат = Запрос.Выполнить();
    ВремяПослеВыполнения = ТекущаяУниверсальнаяДата();
    
    // Шаг 2: Обработка результата
    Выборка = Результат.Выбрать();
    ВремяПослеВыборки = ТекущаяУниверсальнаяДата();
    
    Пока Выборка.Следующий() Цикл
        // Обработка строки
    КонецЦикла;
    
    ВремяПослеОбработки = ТекущаяУниверсальнаяДата();
    
    // Вывод времени
    Сообщение("Подготовка запроса: " + 
        (ВремяПослеПодготовки - ВремяДо).ТекущаяДата() + " мс");
    Сообщение("Выполнение запроса (БД): " + 
        (ВремяПослеВыполнения - ВремяПослеПодготовки).ТекущаяДата() + " мс");
    Сообщение("Создание выборки: " + 
        (ВремяПослеВыборки - ВремяПослеВыполнения).ТекущаяДата() + " мс");
    Сообщение("Обработка в памяти: " + 
        (ВремяПослеОбработки - ВремяПослеВыборки).ТекущаяДата() + " мс");
КонецПроцедуры

Интерпретация результатов:

  • Если "Выполнение запроса (БД)" большое → виновата БД
  • Если "Обработка в памяти" большое → виноват сервер 1С

Метод 2: Анализ плана выполнения SQL

EXPLAIN PLAN для PostgreSQL (если используется PostgreSQL)

-- Запустить план выполнения
EXPLAIN ANALYZE
SELECT 
    *
FROM 
    товары t
WHERE 
    t.пометка_удаления = FALSE
    AND t.цена > 1000;

-- Результат покажет:
-- - Полное сканирование таблицы (BAD)
-- - Использование индекса (GOOD)
-- - Время выполнения (мс)

Для Microsoft SQL Server (T-SQL)

SET STATISTICS TIME ON;
SET STATISTICS IO ON;

SELECT 
    *
FROM 
    dbo.Товары
WHERE 
    ПометкаУдаления = 0;

SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;

-- Результат покажет время СPU, прошедшее время и операции чтения

Метод 3: Проверка индексов

Нет индекса = медленный запрос

// Запрос БЕЗ индекса — полное сканирование (500 ms)
Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |   Товары.Наименование
    |ИЗ
    |   Справочник.Товары Как Товары
    |ГДЕ
    |   Товары.НеИндексированноеПоле = Значение"
);

// Запрос С индексом — использование индекса (5 ms)
Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |   Товары.Наименование
    |ИЗ
    |   Справочник.Товары Как Товары
    |ГДЕ
    |   Товары.Код = 123"
); // Поле Код обычно индексировано

Проверка индексов в конфигурации:

  1. Справочник → Индексы
  2. Убедиться, что есть индексы на часто используемые поля

Метод 4: Проверка блокировок в БД

Если операция зависла, возможны блокировки

# Для PostgreSQL
psql -c "SELECT * FROM pg_stat_activity WHERE state = active;"

# Для SQL Server (через Management Studio)
SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id > 0;
// В 1С: Администрирование → Монитор сеансов
// Показывает активные сеансы и блокировки

Практический пример диагностики

Сценарий: загрузка всех товаров в таблицу очень медленная

Процедура ДиагностикаМедленнойЗагрузки()
    // Шаг 1: Проверяем время запроса
    ВремяНачала = ТекущаяУниверсальнаяДата();
    
    Запрос = Новый Запрос(
        "ВЫБРАТЬ
        |   КОЛИЧЕСТВО(*) Как Кол
        |ИЗ
        |   Справочник.Товары Где ПометкаУдаления = ЛОЖЬ"
    );
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    КоличествоТоваров = Выборка.Кол;
    
    ВремяЗапроса = ТекущаяУниверсальнаяДата() - ВремяНачала;
    
    Сообщение("Товаров найдено: " + КоличествоТоваров);
    Сообщение("Время запроса: " + ВремяЗапроса.ТекущаяДата() + " мс");
    
    // Шаг 2: Анализируем результат
    Если ВремяЗапроса > 5000 Тогда // 5 секунд
        Если КоличествоТоваров > 100000 Тогда
            // Вывод 1: БД медленно из-за большого объёма
            Сообщение("Причина: большой объём данных в БД");
            Сообщение("Решение: добавить индексы, оптимизировать запрос");
        Иначе
            // Вывод 2: БД медленно без причины
            Сообщение("Причина: проблемы БД (нет индекса?)");
            Сообщение("Решение: создать индекс на поле ПометкаУдаления");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Контрольный список диагностики

Если операция медленная, проверь:

  1. Время запроса: замеры времени выполнения SQL

    • Выполни EXPLAIN ANALYZE (PostgreSQL) или SET STATISTICS (SQL Server)
    • Если медленно → виновата БД
  2. Наличие индексов:

    • Проверь, есть ли индексы на колонки в WHERE
    • Добавь индекс если его нет
  3. Размер результата:

    • Сколько строк возвращает запрос?
    • Много строк → нужна оптимизация запроса
  4. Обработка в памяти:

    • Замери время ПОСЛЕ Выполнить()
    • Большое время обработки → виноват сервер 1С
  5. Блокировки в БД:

    • Проверь монитор сеансов
    • Если есть блокировки → другой процесс займет БД
  6. Кэш платформы:

    • Очисти кэш: ОбновитьПовторноИспользуемыеЗначения()
    • Повтори операцию
  7. Логи сервера:

    • Проверь logfile.log на ошибки
    • Найди медленные операции

Правило 80/20

  • В 80% случаев виновата БД (отсутствие индекса, плохой запрос)
  • В 20% случаев виноват сервер 1С (плохая логика обработки)

Типичные решения

ПроблемаРешение
Медленный SELECTДобавить индекс на WHERE колонку
Медленный UPDATE/DELETEДобавить индекс, ограничить количество
Много памятиУменьшить размер выборки, использовать LIMIT
БлокировкиОптимизировать транзакции, снять блокировку
Кэш переполненОчистить кэш, перезагрузить сеанс

Владение методами диагностики — это ключ к быстрой и эффективной работе 1С систем.

Как понять, кто виноват в медленной операции: сервер 1С или СУБД? | PrepBro