При работе в конфигурации 1С:Управление торговлей 11 многие разработчики сталкиваются с ситуацией, когда стандартная операция зачета оплаты или проведение документа занимает непозволительно много времени. Часто это сопровождается зависаниями системы на десятки минут. Давайте разберем, почему это происходит и как мы можем исправить эту проблему своими силами.
Основная причина заключается в том, как платформа 1С:Предприятие и MS SQL Server обрабатывают запросы к регистрам накопления, используемым для учета расчетов. В процессе зачета оплаты система обращается к виртуальным таблицам, таким как РасчетыСКлиентамиПоДокументам.Остатки. Если при этом не переданы конкретные отборы по измерениям (например, по АналитикеУчетаПоПартнерам), SQL-сервер вынужден выполнять полное сканирование таблицы Table Scan по всему массиву накопленных данных за все время существования базы.
В высоконагруженных системах, где количество записей в регистрах исчисляется сотнями тысяч, такая операция критически нагружает дисковую подсистему и процессор, а также создает блокировки, которые мешают другим пользователям работать с документами. Кроме того, регламентное задание ПроведениеПоРасчетамСПартнерами, работающее в фоновом режиме, вступает в конфликт с интерактивными действиями пользователей.
Самый эффективный способ ускорить процесс — ограничить выборку данных на уровне параметров виртуальной таблицы. Когда мы передаем в параметр Остатки отбор по конкретному ключу аналитики или списку ключей, оптимизатор SQL Server получает возможность использовать индексы, что сокращает время выполнения запроса с минут до долей секунды.
Рассмотрим, как внести изменения в модуль РаспределениеВзаиморасчетовВызовСервера. Нам необходимо найти участки кода, где инициализируются обращения к виртуальным таблицам остатков регистров РасчетыСКлиентамиПоДокументам и РасчетыСПоставщикамиПоДокументам.
Для исправления ситуации выполним следующие действия в конфигураторе:
РаспределениеВзаиморасчетовВызовСервера.Остатки.Пример оптимизации кода для регистра РасчетыСКлиентамиПоДокументам:
// Оптимизированный запрос с отбором по аналитике
ВЫБРАТЬ
ДД.РасчетныйДокумент КАК Ссылка,
...
ИЗ
РегистрНакопления.РасчетыСКлиентамиПоДокументам.Остатки(&НачалоПериода,
АналитикаУчетаПоПартнерам В (&АналитикиРасчета) ИЛИ &ПоВсемАналитикам) КАК ДД
Аналогичные изменения следует внести для регистра РасчетыСПоставщикамиПоДокументам. Обратите внимание, что переменная &АналитикиРасчета должна быть предварительно заполнена списком ключей, а параметр &ПоВсемАналитикам должен корректно обрабатывать ситуацию, когда отбор по конкретному партнеру не требуется.
Помимо оптимизации программного кода, важно помнить об общих принципах обслуживания высоконагруженных систем:
Nested Loops или Table Scan, это верный признак того, что индексов не хватает.ПроведениеПоРасчетамСПартнерами блокирует работу пользователей, попробуйте изменить расписание его запуска на периоды минимальной активности или сократите объем выполняемых им операций.АктуализироватьВзаиморасчетыПриФормированииОтчетов и АктуализироватьВзаиморасчетыПриПроведенииДокументов. В крупных базах их включение часто приводит к каскадному замедлению работы всей системы.Применение описанного метода оптимизации виртуальных таблиц позволит вам значительно сократить время отклика системы и избавиться от блокировок при зачете оплат, что подтверждается практическим опытом решения подобных задач в УТ 11.