Почему тормозит зачет оплаты в УТ 11 и как ускорить выполнение запросов?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе в конфигурации 1С:Управление торговлей 11 многие разработчики сталкиваются с ситуацией, когда стандартная операция зачета оплаты или проведение документа занимает непозволительно много времени. Часто это сопровождается зависаниями системы на десятки минут. Давайте разберем, почему это происходит и как мы можем исправить эту проблему своими силами.

Анализ причин низкой производительности

Основная причина заключается в том, как платформа 1С:Предприятие и MS SQL Server обрабатывают запросы к регистрам накопления, используемым для учета расчетов. В процессе зачета оплаты система обращается к виртуальным таблицам, таким как РасчетыСКлиентамиПоДокументам.Остатки. Если при этом не переданы конкретные отборы по измерениям (например, по АналитикеУчетаПоПартнерам), SQL-сервер вынужден выполнять полное сканирование таблицы Table Scan по всему массиву накопленных данных за все время существования базы.

В высоконагруженных системах, где количество записей в регистрах исчисляется сотнями тысяч, такая операция критически нагружает дисковую подсистему и процессор, а также создает блокировки, которые мешают другим пользователям работать с документами. Кроме того, регламентное задание ПроведениеПоРасчетамСПартнерами, работающее в фоновом режиме, вступает в конфликт с интерактивными действиями пользователей.

Решение проблемы: оптимизация запросов

Самый эффективный способ ускорить процесс — ограничить выборку данных на уровне параметров виртуальной таблицы. Когда мы передаем в параметр Остатки отбор по конкретному ключу аналитики или списку ключей, оптимизатор SQL Server получает возможность использовать индексы, что сокращает время выполнения запроса с минут до долей секунды.

Рассмотрим, как внести изменения в модуль РаспределениеВзаиморасчетовВызовСервера. Нам необходимо найти участки кода, где инициализируются обращения к виртуальным таблицам остатков регистров РасчетыСКлиентамиПоДокументам и РасчетыСПоставщикамиПоДокументам.

Пошаговое внедрение оптимизации

Для исправления ситуации выполним следующие действия в конфигураторе:

  1. Откроем модуль РаспределениеВзаиморасчетовВызовСервера.
  2. Найдем обращения к виртуальным таблицам Остатки.
  3. Добавим логический отбор, который будет фильтровать данные только по нужной аналитике, если она определена, или по всем аналитикам в противном случае.

Пример оптимизации кода для регистра РасчетыСКлиентамиПоДокументам:


// Оптимизированный запрос с отбором по аналитике
ВЫБРАТЬ
    ДД.РасчетныйДокумент КАК Ссылка,
    ...
ИЗ
    РегистрНакопления.РасчетыСКлиентамиПоДокументам.Остатки(&НачалоПериода, 
        АналитикаУчетаПоПартнерам В (&АналитикиРасчета) ИЛИ &ПоВсемАналитикам) КАК ДД

Аналогичные изменения следует внести для регистра РасчетыСПоставщикамиПоДокументам. Обратите внимание, что переменная &АналитикиРасчета должна быть предварительно заполнена списком ключей, а параметр &ПоВсемАналитикам должен корректно обрабатывать ситуацию, когда отбор по конкретному партнеру не требуется.

Рекомендации по обслуживанию базы данных

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

Применение описанного метода оптимизации виртуальных таблиц позволит вам значительно сократить время отклика системы и избавиться от блокировок при зачете оплат, что подтверждается практическим опытом решения подобных задач в УТ 11.

← На главную