При эксплуатации конфигурации 1С:Бухгалтерия предприятия 3.0 в клиент-серверном варианте на базе СУБД PostgreSQL технические специалисты нередко сталкиваются с ситуацией, когда проведение банковских документов (платежных поручений, списаний или поступлений на расчетный счет) начинает занимать непозволительно много времени. Характерный признак подобной проблемы: под вновь созданным пользователем программа работает быстро, однако уже спустя день-два скорость работы стремительно деградирует до прежних зависаний. Разберем по шагам, почему возникает такое поведение, как правильно локализовать узкое место и какими способами навсегда устранить зависания.
Для выяснения причин замедления первым делом выполним замер производительности во встроенном конфигураторе. Запустим сеанс тонкого клиента в режиме отладки, включим замер и проведем проблемный документ. Результаты замера показывают критическую точку:
Строка кода, потребляющая более 70% всего времени операции проведения:
Оповестить("ИзменениеВыписки");
Выясним причину, почему обычный метод глобального контекста Оповестить() вызывает длительное зависание клиентского приложения. Метод Оповестить() работает строго синхронно в рамках текущего клиентского сеанса. При его вызове платформа последовательно перебирает все открытые окна и формы (включая неактивные вкладки и элементы начальной страницы), вызывая обработчик события ОбработкаОповещения().
В конфигурации «Бухгалтерия предприятия» на системное событие "ИзменениеВыписки" подписан журнал документов Банковские выписки. Если форма этого журнала открыта у пользователя в соседней вкладке, при проведении платежки она немедленно инициирует серверный контекстный вызов для решения двух задач:
Именно этот неявный серверный вызов при открытом журнале блокирует интерфейс клиента на время проведения каждого отдельного документа.
Рассмотрим подробнее, почему новый пользователь базы работает быстро, а через день начинает испытывать сильные тормоза. Дело заключается в накоплении индивидуальных пользовательских настроек отображения динамического списка в форме журнала выписок:
ORDER BY по этому полю. Если индекс по данному полю отсутствует, СУБД PostgreSQL выполняет полное сканирование таблицы и ресурсоемкую сортировку на диске.Чтобы не пересоздавать учетные записи пользователей каждый день, выполним регламентный сброс только проблемных настроек интерфейса. Проанализируем порядок действий администратора:
После перезапуска сеанса пользователя форма выписок вернется к заводским настройкам, а скорость проведения документов восстановится до штатных значений.
Разберем простое правило работы с документами, полностью исключающее проявление данной проблемы: при массовом проведении или заведении платежных поручений журнал «Банковские выписки» должен быть закрыт.
Если вкладка журнала выписок закрыта, вызов метода Оповестить("ИзменениеВыписки") выполняется за доли миллисекунды, так как в клиенте отсутствует активный получатель оповещения, и тяжелый контекстный серверный вызов не запускается вовсе.
Для стабильной работы динамических списков под управлением PostgreSQL внесем необходимые корректировки в конфигурационный файл postgresql.conf. Стандартные настройки СУБД по умолчанию не рассчитаны на сложные запросы платформы 1С:
work_mem. Дефолтное значение (часто 4MB) приводит к тому, что сортировка динамических списков при наличии пользовательских отборов не помещается в RAM и сбрасывается во временные файлы на диске. Рекомендуется увеличить значение до 32MB или 64MB.random_page_cost. При использовании твердотельных накопителей (SSD/NVMe) обязательно уменьшим параметр с 4.0 до 1.1 - 1.3. Это позволит планировщику запросов PostgreSQL отдавать предпочтение индексным сканированиям вместо тяжелых Seq Scan.autovacuum включен. Для таблиц регистра бухгалтерии и банковских документов выполним ручное обновление статистики командой:
VACUUM ANALYZE;
Совместное применение правильной настройки параметров СУБД, контроля пользовательских фильтров в журнале выписок и своевременной очистки настроек позволяет полностью устранить зависания при проведении платежных документов в 1С:Бухгалтерии.