Почему зависает отчет «Сведения об ОС» в 1С на PostgreSQL и как это исправить?

Системный администратор 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При работе с конфигурацией «Управление торговым предприятием для Украины» (УТП) на связке с PostgreSQL системные администраторы и разработчики часто сталкиваются с проблемой: стандартный отчет Сведения об ОС намертво «вешает» систему. При этом на MS SQL Server тот же самый отчет с той же базой данных отрабатывает корректно и быстро. В данной статье мы подробно разберем, почему возникает эта деградация производительности, как оперативно «оживить» отчет и какие настройки СУБД помогут избежать подобных проблем в будущем.

Анализ проблемы: почему PostgreSQL ведет себя иначе?

Рассмотрим ситуацию: при запуске отчета планировщик PostgreSQL получает сложный запрос, генерируемый платформой 1С. Этот запрос обычно включает в себя множество соединений с виртуальными таблицами остатков, регистрами сведений и справочниками. Основная причина «зависания» заключается в том, что планировщик PostgreSQL ошибочно выбирает неэффективную стратегию выполнения запроса.

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

  1. Ошибки оценки кардинальности: PostgreSQL может решить, что в одной из временных таблиц 1С находится всего одна строка (хотя их там тысячи). На основании этого он выбирает метод Nested Loop (вложенные циклы), который при реальном объеме данных начинает выполняться бесконечно долго.
  2. Сложные соединения: Запросы в УТП часто содержат более 10-15 таблиц. При превышении определенных лимитов планировщик либо тратит слишком много времени на поиск оптимального плана, либо переходит к упрощенному (и не всегда удачному) алгоритму.
  3. Неактуальная статистика: Если база активно используется, а статистика по таблицам не обновлена, СУБД опирается на устаревшие данные.

Оперативное решение: отключение вложенных циклов

Как показала практика обсуждения на форуме, самым быстрым способом заставить отчет работать является изменение параметра enable_nestloop. Выясним, как это сделать и к чему это приведет.

Попробуем временно отключить использование вложенных циклов в конфигурационном файле postgresql.conf или непосредственно для сессии. Это заставит СУБД использовать более подходящие для больших объемов данных методы Hash Join или Merge Join.

Для этого в файле настроек установим:


# В файле postgresql.conf
enable_nestloop = off

Важно: Это решение является «костылем». Отключение enable_nestloop на глобальном уровне может замедлить работу других, более простых запросов, где вложенные циклы были бы эффективны. Однако для тяжелых отчетов в старых версиях УТП это зачастую единственный способ получить результат.

Глубокая настройка PostgreSQL под задачи 1С

Чтобы не просто «заткнуть дыру», а системно решить проблему производительности, разберем по шагам правильную настройку сервера.

Шаг 1. Оптимизация под SSD.

Если ваша база данных размещена на SSD-накопителях (как в рассматриваемом примере с SSD 240GB), стандартные настройки PostgreSQL будут работать против вас. Параметр random_page_cost по умолчанию равен 4.0, что рассчитано на медленные HDD. Это заставляет СУБД избегать использования индексов.

Установим более подходящее значение:

random_page_cost = 1.1

Шаг 2. Настройка лимитов планировщика.

Запросы 1С строятся динамически и часто содержат огромное количество соединений. Рассмотрим параметры from_collapse_limit и join_collapse_limit. Если они слишком малы, планировщик не сможет оптимизировать запрос целиком. Рекомендуется поднять их до 20:


from_collapse_limit = 20
join_collapse_limit = 20

Шаг 3. Обновление статистики (ANALYZE).

После внесения изменений в конфигурацию или после массовой загрузки данных обязательно нужно выполнить процедуру сбора статистики. Выполните в консоли запросов (или через pgAdmin) команду:

ANALYZE;

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

Влияние версии платформы и конфигурации

Проанализируем технические подробности окружения. В теме упоминается платформа 8.3.10.2561. Это достаточно старая версия. Платформа 1С выступает «транслятором» между языком запросов 1С и SQL. В более современных версиях (8.3.15 и выше) механизмы генерации SQL-кода специально для PostgreSQL были значительно улучшены.

Если есть возможность, выполним следующие действия:

  1. Обновим платформу 1С до актуальной (например, ветки 8.3.22 или выше).
  2. Если используется ванильный PostgreSQL, рассмотрим переход на специализированные сборки (например, от Postgres Pro), которые содержат патчи для более эффективной работы с временными таблицами 1С.
  3. Проверим код запроса в отчете. Иногда использование условий в секции ГДЕ вместо параметров виртуальной таблицы в 1С приводит к тому, что PostgreSQL вычитывает всю таблицу целиком (Seq Scan) вместо использования индекса.

Работа с параметром GEQO

Когда запрос становится экстремально сложным (более 11-12 таблиц), PostgreSQL включает Генетический оптимизатор запросов (GEQO). Он работает быстрее классического перебора, но результат часто оказывается непредсказуемым. Если отчет «Сведения об ОС» продолжает виснуть, попробуем увеличить порог включения GEQO:

geqo_threshold = 15

Резюме действий для исправления зависания

Рассмотрим краткий чек-лист для приведения системы в рабочее состояние:

Таким образом, проблема «зависания» отчета Сведения об ОС в УТП на PostgreSQL чаще всего не является ошибкой самого отчета, а является следствием неудачного выбора плана выполнения запроса. Сочетание тонкой настройки параметров планировщика и поддержание актуальной статистики позволяет добиться стабильной работы системы, сопоставимой по скорости с MS SQL Server.

← На главную