Заметки эксперта. Расследование длительного выполнения отчета “Движение ТМЦ и затрат в производстве” (1С:ERP 2)

19.05.22

База данных - HighLoad оптимизация

Кратко: в ходе проведения нагрузочного тестирования “1С:ERP 2” под ОС Linux на СУБД Postgres выявлено существенное замедление формирования отчета “Движение ТМЦ и затрат в производстве” - до 60 минут. После проведенного расследования и точечной корректировки СКД в отчете, без изменения бизнес-логики результатов его работы, работа отчета была ускорена в 80 раз - средний показатель формирования составил 30 секунд.

Заметки эксперта. Расследование длительного выполнения отчета “Движение ТМЦ и затрат в производстве” (1С:ERP 2)

 

Кратко: в ходе проведения нагрузочного тестирования “1С:ERP 2” под ОС Linux на СУБД Postgres выявлено существенное замедление формирования отчета “Движение ТМЦ и затрат в производстве” - до 60 минут. После проведенного расследования и точечной корректировки СКД в отчете, без изменения бизнес-логики результатов его работы, работа отчета была ускорена в 80 раз - средний показатель формирования составил 30 секунд.

Мы опубликовали в предыдущих двух статьях на наш взгляд интересные и довольно необычные кейсы расследования деградации производительности. Эта статья про случай попроще, но мы считаем, что и он заслуживает вашего внимания. Во-первых, и тут есть существенная проблема с быстродействием. Во-вторых, этот пример показателен тем, что далеко не всегда нужно вообще что-то “переписывать” в конфигурациях 1С. Надеемся, вам будет интересно ;)

Инфраструктура исследуемой системы

  • Технологическая платформа 1С:Предприятие 8, версия 8.3.19.1264
  • Конфигурация: 1С:ERP Управление предприятием 2, версия 2.5.6.234
  • Операционная система: Astra Linux Орел 2.12
  • СУБД: Postgres Pro Enterprise 13
  • Размер базы данных: около 500 Гб
  • Количество пользователей: около 2200

 

Проблема

В ходе проведения нагрузочного тестирования прикладного решения “1С:ERP 2” в рамках программы перехода на операционную систему Linux с использованием СУБД Postgres выявлено длительное формирование отчета "Движение ТМЦ и затрат в производстве”.

Если установить в отчете параметры отбора “Период (месяц)” и “Подразделение”, после чего запустить его формирование – это занимает от 40 до 60 минут. Причем, формирование “под нагрузкой” (одновременная работа пользователей) такого отчета у части пользователей завершается с ошибкой “Недостаточно памяти для получения результата запроса к базе данных”.

В остальных случаях результирующий табличный документ пустой – по установленным отборам данных к выводу нет.
 

Задача

Выявить и устранить причины крайне медленного формирования отчета “Движение ТМЦ и затрат в производстве” в инфраструктуре 1С:ERP 2 / Linux / Postgres.

 

Расследование

На момент выполнения такого рода расследования, у нас должна быть подключена подсистема БСПОценка производительности”, включен технологический журнал 1С (ТЖ 1С), желательно включить подробное логирование в журнале регистраци 1С (ЖР 1С).

Для начала ищем самый длительный замер по ключевой операции формирования этого отчета, полученный подсистемой БСП “Оценка производительности” - запоминаем “Номер сеанса”:

 

Дата начала замера

Дата окончания замера

Номер сеанса

Длительность, сек.

Пользователь

16.01.2022 16:43:18

16.01.2022 17:23:09

2218

2 390,844

ЭкономистПроизводства_012

 

После чего в ТЖ 1С ищем событие CALL (клиент-серверный вызов), соответствующее данному замеру: ”SessionID=11811(2218)”

22:38.093000-2359346998,CALL,1,Usr=ЭкономистПроизводства_012,SessionID=11811(2218),p:processName=erp,Func=Background job,Module=ДлительныеОперации,Method=ВыполнитьСКонтекстомКлиента,Memory=-858220508,MemoryPeak=15575941249,InBytes=117587968,OutBytes=133120366,CpuTime=336095413

Действительно: вызов длился почти 40 минут.

Обращаем внимание на еще один момент: в пике ему потребовалось почти 15 Гб оперативной памяти (свойство MemoryPeak). Это еще одна причина, которая требует расследования (многовато выходит для отчета, который в итоге ничего не выводит).

Кроме этого держим в голове, что у части тестовых пользователей возникала ошибка “Недостаточно памяти для получения результата запроса к базе данных”.

Для анализа ситуации смотрим на запросы, которые выполняются при формировании запроса к базе данных, анализируем события ТЖ 1С  DBPOSTGRS для данного клиент-серверного вызова (сопоставляем по тому же SessionID=11811):

45:09.657000-108177999,DBPOSTGRS,5,process=rphost,p:processName=erp,OSThread=7838,t:clientID=2832,t:applicationName=BackgroundJob,t:computerName=erp02,t:connectID=15586,SessionID=11811,Usr=ЭкономистПроизводства_012,DBMS=DBPOSTGRS,DataBase=erp04\erp,Trans=0,dbpid=27776,Sql="<...>",RowsAffected=42998,Result=PGRES_TUPLES_OK,Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1063 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
    ОбщийМодуль.ДлительныеОперации.Модуль : 1073 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
        ОбщийМодуль.ОбщегоНазначения.Модуль : 5180 : Выполнить(Текст);
             : 1 : ВариантыОтчетов.СформироватьОтчетВФоне(Параметры[0],Параметры[1])
                ОбщийМодуль.ВариантыОтчетов.Модуль : 2773 : Формирование = СформироватьОтчет(Параметры, Ложь, Ложь);
                    ОбщийМодуль.ВариантыОтчетов.Модуль : 1718 : ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
                        Отчет.ПроизводственныеЗатраты.МодульОбъекта : 81 : ПроцессорВывода.Вывести(ПроцессорКомпоновки);'
57:10.549000-720529999,DBPOSTGRS,5,process=rphost,p:processName=erp,OSThread=7838,t:clientID=2832,t:applicationName=BackgroundJob,t:computerName=erp02,t:connectID=15586,SessionID=11811,Usr=ЭкономистПроизводства_012,DBMS=DBPOSTGRS,DataBase=erp04\erp,Trans=0,dbpid=27776,Sql="<...>",RowsAffected=2841404,Result=PGRES_TUPLES_OK,Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1063 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
    ОбщийМодуль.ДлительныеОперации.Модуль : 1073 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
        ОбщийМодуль.ОбщегоНазначения.Модуль : 5180 : Выполнить(Текст);
             : 1 : ВариантыОтчетов.СформироватьОтчетВФоне(Параметры[0],Параметры[1])
                ОбщийМодуль.ВариантыОтчетов.Модуль : 2773 : Формирование = СформироватьОтчет(Параметры, Ложь, Ложь);
                    ОбщийМодуль.ВариантыОтчетов.Модуль : 1718 : ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
                        Отчет.ПроизводственныеЗатраты.МодульОбъекта : 81 : ПроцессорВывода.Вывести(ПроцессорКомпоновки);'
04:07.978000-292160999,DBPOSTGRS,5,process=rphost,p:processName=erp,OSThread=7838,t:clientID=2832,t:applicationName=BackgroundJob,t:computerName=erp02,t:connectID=15586,SessionID=11811,Usr=ЭкономистПроизводства_012,DBMS=DBPOSTGRS,DataBase=erp04\erp,Trans=0,dbpid=28219,Sql="<...>",RowsAffected=3023307,Result=PGRES_TUPLES_OK,Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1063 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
    ОбщийМодуль.ДлительныеОперации.Модуль : 1073 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
        ОбщийМодуль.ОбщегоНазначения.Модуль : 5180 : Выполнить(Текст);
             : 1 : ВариантыОтчетов.СформироватьОтчетВФоне(Параметры[0],Параметры[1])
                ОбщийМодуль.ВариантыОтчетов.Модуль : 2773 : Формирование = СформироватьОтчет(Параметры, Ложь, Ложь);
                    ОбщийМодуль.ВариантыОтчетов.Модуль : 1718 : ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
                        Отчет.ПроизводственныеЗатраты.МодульОбъекта : 81 : ПроцессорВывода.Вывести(ПроцессорКомпоновки);'

Видим, что два запроса выполняются долго - в листинге выше: 720529999 мкс второй запрос, 292160999 мкс третий запрос. Кроме этого, они еще и возвращают в итоге около 3 миллионов строк каждый: RowsAffected=2841404 во втором запросе, RowsAffected=3023307 в третьем запросе.

Это явно избыточная нагрузка на СУБД. К тому же выходит, что фильтрация осуществляется уже после получения данных из базы, ведь результат, как мы помним - у пользователей все равно пустой.

 

Переходим к самому отчету в конфигурации 1С.

Помним: в варианте отчета, вызывающем проблему, отбор устанавливается по периоду и по подразделению.

Открываем настройки схемы компоновки данных (СКД) для данного отчета и видим: отбор по подразделению указан не для отчета, а в отдельных группировках.

 

 

Такая настройка СКД приводит к избыточному чтению данных из СУБД: из базы данных сначала выбираются все данные, без отбора по подразделению. И только после этого компоновщик СКД для каждой группировки накладывает отбор по подразделению.

 

Решение

Проанализировав полученные выше данные по работе 1С с СУБД в контексте этого отчета и структуру его СКД, делаем вывод: основной отбор по подразделению можно перенести в сам отчет, не нарушая логику его работы. Вот так:

 

 

То есть условия в отборе для отчета будут применяться сразу, что ожидаемо снизит нагрузку на СУБД, минимизируя получаемые оттуда данные.

 

Применяем изменения в конфигурации 1С и проверяем формирование отчете в рамках следующей итерации нагрузочного тестирования:

52:05.794000-1516999,DBPOSTGRS,5,process=rphost,p:processName=erp,OSThread=4120,t:clientID=253,t:applicationName=BackgroundJob,t:computerName=erp01,t:connectID=2740,SessionID=2298,Usr=ЭкономистПроизводства_012,DBMS=DBPOSTGRS,DataBase=erp04\erp,Trans=0,dbpid=30344,Sql="<...>",RowsAffected=0,Result=PGRES_TUPLES_OK,Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1063 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
    ОбщийМодуль.ДлительныеОперации.Модуль : 1073 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
        ОбщийМодуль.ОбщегоНазначения.Модуль : 5180 : Выполнить(Текст);
             : 1 : ВариантыОтчетов.СформироватьОтчетВФоне(Параметры[0],Параметры[1])
                ОбщийМодуль.ВариантыОтчетов.Модуль : 2773 : Формирование = СформироватьОтчет(Параметры, Ложь, Ложь);
                    ОбщийМодуль.ВариантыОтчетов.Модуль : 1718 : ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
                        Отчет.ПроизводственныеЗатраты.МодульОбъекта : 81 : ПроцессорВывода.Вывести(ПроцессорКомпоновки);'                        
52:22.199000-15617999,DBPOSTGRS,5,process=rphost,p:processName=erp,OSThread=4120,t:clientID=253,t:applicationName=BackgroundJob,t:computerName=erp01,t:connectID=2740,SessionID=2298,Usr=ЭкономистПроизводства_012,DBMS=DBPOSTGRS,DataBase=erp04\erp,Trans=0,dbpid=30668,Sql="<...>",RowsAffected=0,Result=PGRES_TUPLES_OK,Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1063 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
    ОбщийМодуль.ДлительныеОперации.Модуль : 1073 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
        ОбщийМодуль.ОбщегоНазначения.Модуль : 5180 : Выполнить(Текст);
             : 1 : ВариантыОтчетов.СформироватьОтчетВФоне(Параметры[0],Параметры[1])
                ОбщийМодуль.ВариантыОтчетов.Модуль : 2773 : Формирование = СформироватьОтчет(Параметры, Ложь, Ложь);
                    ОбщийМодуль.ВариантыОтчетов.Модуль : 1718 : ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
                        Отчет.ПроизводственныеЗатраты.МодульОбъекта : 81 : ПроцессорВывода.Вывести(ПроцессорКомпоновки);'
52:25.135000-2789999,DBPOSTGRS,5,process=rphost,p:processName=erp,OSThread=4120,t:clientID=253,t:applicationName=BackgroundJob,t:computerName=erp01,t:connectID=2740,SessionID=2298,Usr=ЭкономистПроизводства_012,DBMS=DBPOSTGRS,DataBase=erp04\erp,Trans=0,dbpid=30562,Sql="<...>",RowsAffected=0,Result=PGRES_TUPLES_OK,Context='
ОбщийМодуль.ДлительныеОперации.Модуль : 1063 : ВызватьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);
    ОбщийМодуль.ДлительныеОперации.Модуль : 1073 : ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыВызова);
        ОбщийМодуль.ОбщегоНазначения.Модуль : 5180 : Выполнить(Текст);
             : 1 : ВариантыОтчетов.СформироватьОтчетВФоне(Параметры[0],Параметры[1])
                ОбщийМодуль.ВариантыОтчетов.Модуль : 2773 : Формирование = СформироватьОтчет(Параметры, Ложь, Ложь);
                    ОбщийМодуль.ВариантыОтчетов.Модуль : 1718 : ОтчетОбъект.СкомпоноватьРезультат(Результат.ТабличныйДокумент, Результат.Расшифровка);
                        Отчет.ПроизводственныеЗатраты.МодульОбъекта : 81 : ПроцессорВывода.Вывести(ПроцессорКомпоновки);'
52:25.333001-25484999,CALL,1,Usr=ЭкономистПроизводства_012,SessionID=2298(766),p:processName=erp,Func=Background job,Module=ДлительныеОперации,Method=ВыполнитьСКонтекстомКлиента,Memory=-184943301,MemoryPeak=14490779,InBytes=0,OutBytes=0,CpuTime=5387584

Видим, что отбор сразу применился на уровне запроса к базе данных (RowsAffected=0). Потребление памяти при этом снизилось до 15 Мб (MemoryPeak=14490779).

Отчет сформировался за 30 секунд:

 

Дата начала замера

Дата окончания замера

Номер сеанса

Длительность, сек.

Пользователь

24.01.2022 12:51:59

24.01.2022 12:52:29

766

29,804

ЭкономистПроизводства_012

 

Таким образом, без серьезной корректировки отчета, не углубляясь в его бизнес-логику и не меняя её, мы ускорили формирование отчета почти в 80 раз. Кроме этого, избавились от высокого потребления памяти процессами сервера, что порождало ошибку недостатка памяти для получения результата запроса и отображению пользователю.

a3e52412cd0e9ba5955aaa995474074f.png

Приобретайте 1С:ERP в Инфостарт с бонусом 15%!

  • Бесплатное демо продукта и консультация
  • Команда экспертов 1С с опытом 10+ лет
  • Оценка проекта, четкий план работ, документация, обучение и поддержка

Закажите расчет внедрения ERP - получите дорожную карту в подарок!


Вступайте в нашу телеграмм-группу Инфостарт

эксперт быстродействие erp 1С:Эксперт технологическим вопросам платформа деградация производительности производительность высокая нагрузка highload

См. также

HighLoad оптимизация Программист 1C:ERP Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    4808    ivanov660    48    

50

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    7868    ivanov660    39    

61

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    10280    ivanov660    13    

63

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    16233    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    7952    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    11249    vasilev2015    22    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapervodichka 7238 19.05.22 16:10 Сейчас в теме
Информативно, спасибо.
mitia.mackarevich; it-expertise; sasha_r; +3 Ответить
2. starik-2005 3201 19.05.22 17:52 Сейчас в теме
3. TMV 3 20.05.22 00:05 Сейчас в теме
Собирать ТЖ в данном случае излишне.
echo77; zqzq; RustIG; +3 Ответить
4. sasha_r 20.05.22 09:28 Сейчас в теме
(3) почему? Мне казалось, собирать ТЖ никогда не вредно.
it-expertise; +1 Ответить
5. TMV 3 20.05.22 10:43 Сейчас в теме
(4) Это не вредно, но и не нужно именно здесь - из пушки по воробьям.
15. bugagashenka 205 23.05.22 08:45 Сейчас в теме
(5) чтобы посмотреть потребление памяти вызовом, например. Без ТЖ не посмотришь.
Опять же, в запросе может быть несколько временных таблиц и увидеть, на какой именно проблема, поможет либо ТЖ, либо трассировка. Но, из первого предложения возникает логичная гипотеза, что с помощью ТЖ можно увидеть сразу всю картину.

Можно было бы еще в дополнение план запроса посмотреть и там явно было бы видно, что ближе к концу на входе в оператор толстая линия, а на выходе тонкая, что тоже говорит о позднем отборе.

Я бы лично сначала план посмотрел, но любой подход верный, если приведет к положительному результату.
it-expertise; +1 Ответить
16. TMV 3 23.05.22 10:03 Сейчас в теме
(15)из Москвы в СПБ можно улететь, а можно и в плацкарте доехать - вопрос эффективности.
17. bugagashenka 205 23.05.22 11:22 Сейчас в теме
(16) Вопрос эффективности - итоговое время формирования отчета при наименьших трудозатратах на оптимизацию. В данном случае пусть и не совсем обычно подошли к экспертизе, так как обычно начинается все с плана запроса, но тем не менее, расследование с помощью ТЖ, как одно из фундаментальных средств показал результат.
Предложите свой вариант, как бы Вы расследовали.
Напомню, что у части пользователей отчет вылетал по памяти.
it-expertise; +1 Ответить
7. IT_Magnit 20.05.22 14:24 Сейчас в теме
(3) Как и писать статью..
6. capitan 2545 20.05.22 12:05 Сейчас в теме

Давайте поговорим об этом)
1. При чем тут переход
под ОС Linux на СУБД Postgres
, разве на windows & mssql СКД по другому работает?
В СКД можно поймать итоговый запрос, а в ТЖ можно поймать его план
2. Что будет с пользователем который не хочет в разрезе подразделений такой отчет строить, например старший экономист ?)

Не относящееся к делу замечание,
да какое уж там замечание, просто камень в огород секты центосников как сервера 1С)
На Astra Linux перешли все кто только мог, а он то на дебиане
8. s22 23 20.05.22 15:58 Сейчас в теме
Логика вроде изменилась.

Сейчас отбор накладывается на все таблицы, а раньше только на одну
9. s22 23 20.05.22 16:00 Сейчас в теме
А вообще от 1с нужны функции получения от запроса плана и скл варианта.
Сделать просто, поможет сильно
it-expertise; sapervodichka; +2 Ответить
10. ivanov660 4897 20.05.22 16:27 Сейчас в теме
Внесу свои пять копеек)
1. Должны быть отборы обязательно - без отборов тормоза случаются).
2. Что-то очень странное условие отбора "Группировка ИЛИ". Если задача стояла в том, чтобы пользователь обязательно указывал подразделение. то это делается значительно проще - во вкладке СКД "Параметры" ставится флаг "запрещать незаполненные значения".
3. Рекомендую также пользоваться обработкой "Консоль системы компоновки данных" с ИТС, она покажет какой запрос формируется в итоге на языке запросов 1С. В результате можно увидеть к чему приводят различные манипуляции со схемой СКД.
11. s22 23 20.05.22 17:01 Сейчас в теме
(10)
2. Что-то очень странное условие отбора "Группировка ИЛИ". Если задача стояла в том, чтобы пользователь обязательно указывал подразделение. то это делается значительно проще - во вкладке СКД "Параметры" ставится флаг "запрещать незаполненные значения".


Нормальное. Если заполнено подразделение то отбор по нему иначе нет отбора.
triviumfan; +1 Ответить
12. ivanov660 4897 20.05.22 17:57 Сейчас в теме
(11)Тогда вышеуказанная оптимизация на половину бессмысленная, сняли отбор и опять тормоза.
13. Fragster 1163 20.05.22 18:17 Сейчас в теме
На картинке в статье не показано, как быстро отловить это дело (отсутствие фильтрации в запросе) в настройках:
14. echo77 1935 22.05.22 11:38 Сейчас в теме
(0) Спасибо, что еще раз обратили на это внимание.
Вспоминая себя: чем больше знаешь, тем более изощренными(сложными) способами решаешь задачи.
Наверное, стоило начать с обзора настроек компоновщика настроек, за тем посмотреть итоговый запрос с параметрами в консоли СКД и уж потом...
VladC#; it-expertise; +2 Ответить
18. Andrekaa 24.05.22 08:05 Сейчас в теме
а в техподдержку 1С написали о своих результатах?
19. it-expertise 442 24.05.22 08:55 Сейчас в теме
(18) мы довольно плотно сотрудничаем с 1С по линии производительности и отказоустойчивости.
Для отправки сообщения требуется регистрация/авторизация