Как понять, кто виноват в медленной операции: сервер 1С или СУБД?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Диагностика производительности: 1С сервер vs СУБД
Определение узкого места в медленной операции — критическое умение. В 1С существуют инструменты и методы для выявления виновника: сервер 1С или база данных.
Общий подход к диагностике
Когда операция медленная, возможны два сценария:
1. СУБД ВИНОВАТА
- Медленные SQL запросы
- Отсутствие индексов
- Полное сканирование таблиц
- Блокировки в БД
- Проблемы с памятью БД
2. СЕРВЕР 1С ВИНОВАТ
- Неправильная логика на сервере
- Обработка большого объёма данных в памяти
- Множество циклов и вложенных операций
- Кэш переполнен
- Проблемы с модулями и зависимостями
Инструмент 1: Профилировщик 1С (Performance Monitor)
Встроенный профилировщик показывает время выполнения
// Включение профилирования
Процедура МедленнаяОперация()
// Профилировщик показывает время каждой строки
ВремяНачала = ТекущаяУниверсальнаяДата();
// Операция 1: Запрос к БД
Запрос = Новый Запрос("ВЫБРАТЬ ВСЕ ИЗ Справочник.Товары");
ВремяЗапроса = ТекущаяУниверсальнаяДата() - ВремяНачала;
ВремяОперация = ТекущаяУниверсальнаяДата();
// Операция 2: Обработка в памяти
Результат = Запрос.Выполнить();
ВремяОбработки = ТекущаяУниверсальнаяДата() - ВремяОперация;
Сообщение("Время запроса: " + ВремяЗапроса + " мс");
Сообщение("Время обработки: " + ВремяОбработки + " мс");
КонецПроцедуры
Как включить профилировщик:
- Меню → Сервис → Профилировщик производительности
- Запустить операцию
- Сохранить результаты в файл .perf
- Анализировать отчёт
Инструмент 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"
); // Поле Код обычно индексировано
Проверка индексов в конфигурации:
- Справочник → Индексы
- Убедиться, что есть индексы на часто используемые поля
Метод 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: БД медленно без причины
Сообщение("Причина: проблемы БД (нет индекса?)");
Сообщение("Решение: создать индекс на поле ПометкаУдаления");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Контрольный список диагностики
Если операция медленная, проверь:
-
Время запроса: замеры времени выполнения SQL
- Выполни
EXPLAIN ANALYZE(PostgreSQL) или SET STATISTICS (SQL Server) - Если медленно → виновата БД
- Выполни
-
Наличие индексов:
- Проверь, есть ли индексы на колонки в WHERE
- Добавь индекс если его нет
-
Размер результата:
- Сколько строк возвращает запрос?
- Много строк → нужна оптимизация запроса
-
Обработка в памяти:
- Замери время ПОСЛЕ
Выполнить() - Большое время обработки → виноват сервер 1С
- Замери время ПОСЛЕ
-
Блокировки в БД:
- Проверь монитор сеансов
- Если есть блокировки → другой процесс займет БД
-
Кэш платформы:
- Очисти кэш:
ОбновитьПовторноИспользуемыеЗначения() - Повтори операцию
- Очисти кэш:
-
Логи сервера:
- Проверь logfile.log на ошибки
- Найди медленные операции
Правило 80/20
- В 80% случаев виновата БД (отсутствие индекса, плохой запрос)
- В 20% случаев виноват сервер 1С (плохая логика обработки)
Типичные решения
| Проблема | Решение |
|---|---|
| Медленный SELECT | Добавить индекс на WHERE колонку |
| Медленный UPDATE/DELETE | Добавить индекс, ограничить количество |
| Много памяти | Уменьшить размер выборки, использовать LIMIT |
| Блокировки | Оптимизировать транзакции, снять блокировку |
| Кэш переполнен | Очистить кэш, перезагрузить сеанс |
Владение методами диагностики — это ключ к быстрой и эффективной работе 1С систем.