Многие технические специалисты, работающие со связкой 1С:Предприятие 8.3 и PostgreSQL, сталкиваются с ситуацией, когда регламентные операции, такие как закрытие месяца, начинают вести себя непредсказуемо. Проблема проявляется следующим образом: процесс стартует бодро, но в определенный момент (часто на конкретной дате или документе) скорость перепроведения резко падает. Если в начале месяца система обрабатывает десятки документов в минуту, то на «проблемном» участке скорость снижается до нескольких документов за десять-пятнадцать минут. При этом аппаратные ресурсы сервера (процессор, оперативная память, дисковая подсистема SSD) могут быть загружены незначительно, а в журнале регистрации отсутствуют явные ошибки.
В данной статье мы разберем причины возникновения таких «затыков», проанализируем влияние механизмов версионирования и специфику работы PostgreSQL, а также рассмотрим эффективные методы решения проблемы, включая тестирование и исправление (ТиИ).
Одной из первых зацепок при диагностике подобных тормозов является работа регистра сведений ВерсииОбъектов. В конфигурации «1С:Бухгалтерия предприятия 3.0» (особенно в версии КОРП) часто включено версионирование наиболее важных документов. Рассмотрим подробнее, как это влияет на производительность:
ВерсииОбъектов.ХранилищеЗначения. Запись и чтение таких данных — ресурсоемкая операция.Рекомендация: Для ускорения массовых операций попробуем временно отключить версионирование или произвести очистку старых версий через раздел «Администрирование — Общие настройки — История изменений».
В современных конфигурациях на базе БСП (включая БП 3.0 и ERP) активно используются механизмы отложенных расчетов. Разберем ситуацию, когда в системе накапливается избыточное количество записей в технических регистрах:
Проанализируем состояние следующих регистров сведений:
ЗаданияКРаспределениюРасчетовСКлиентамиЗаданияКРаспределениюРасчетовСПоставщикамиЕсли в этих регистрах накопились тысячи «зависших» записей, то при проведении любого первичного документа система будет пытаться анализировать эти очереди, что вызывает «рывки» в производительности. Несмотря на то, что это чаще встречается в ERP, в БП 3.0 КОРП механизмы взаиморасчетов также могут создавать значительную нагрузку при перепроведении больших периодов.
Если перенос базы на другой сервер или выполнение операции на копии базы проходит значительно быстрее, значит, проблема кроется в текущем состоянии данных внутри PostgreSQL. Основная особенность этой СУБД — механизм MVCC (Multi-Version Concurrency Control). Рассмотрим, что происходит при интенсивном перепроведении:
autovacuum не успевает обрабатывать таблицу ВерсииОбъектов или таблицы итогов регистров накопления, возникает эффект Bloat — раздувание таблиц и индексов.Практика показывает, что наиболее эффективным «заклинанием» против подобных тормозов является штатная процедура 1С «Тестирование и исправление» (ТиИ) с включенной опцией Реструктуризация таблиц информационной базы. Разберем по шагам, почему это помогает:
Когда мы запускаем реструктуризацию, платформа 1С выполняет следующие действия:
Фактически, после ТиИ база данных становится максимально компактной и оптимизированной. Посмотрим на результат: после проведения реструктуризации перепроведение документов в том же месяце, где наблюдался «затор», обычно восстанавливается до нормальной скорости.
Если проблема повторяется регулярно, нам необходимо настроить инструменты мониторинга, чтобы поймать конкретный SQL-запрос, вызывающий задержку. Для этого выполним следующие действия:
1. Настройка Технологического Журнала (ТЖ). Создадим файл logcfg.xml, который будет собирать информацию о долгих запросах к СУБД. Нам интересны события DBPOSTGRS с длительностью более 10 секунд:
<config xmlns="http://v8.1c.ru/7.4/get/logcfg">
<log location="C:\Logs\SlowSQL" history="24">
<event>
<eq property="Name" value="DBPOSTGRS"/>
<gt property="Duration" value="10000000"/>
</event>
<property name="All"/>
</log>
</config>
2. Мониторинг активных процессов в PostgreSQL. В момент торможения выполним в консоли управления СУБД (например, в pgAdmin) следующий запрос, чтобы увидеть, какие транзакции находятся в состоянии ожидания:
SELECT pid, state, wait_event, wait_event_type, query
FROM pg_stat_activity
WHERE state != 'idle';
Это позволит точно определить, на какой системной таблице или индексе происходит блокировка или долгое выполнение.
Чтобы избежать внезапного замедления закрытия месяца в будущем, рекомендуем придерживаться следующих правил:
autovacuum в postgresql.conf. Снизьте параметры autovacuum_vacuum_scale_factor и autovacuum_analyze_scale_factor до 0.01. Это заставит Postgres чаще чистить «хвосты».ВерсииОбъектов в разумных пределах.Таким образом, мы выяснили, что основной причиной резких замедлений при перепроведении в БП 3.0 КОРП на PostgreSQL является деградация индексов и раздувание таблиц версионирования. Своевременное использование инструментов тестирования и исправления позволяет «обнулить» эти негативные эффекты и вернуть системе былую производительность.