Как ускорить массовое перепроведение документов в 1С:Управление торговлей при работе с SQL Server?

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

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

Анализ причин замедления

Прежде чем приступать к оптимизации, проанализируем, почему проведение может замедляться со временем. Основными факторами являются рост объема данных в регистрах накопления (особенно в таблицах итогов), фрагментация индексов в SQL Server и неактуальность статистики. Проверим также влияние партионного учета, который в типовых решениях на обычных формах является наиболее «тяжелым» узлом.

Для объективной оценки используем методику замера производительности. Не стоит полагаться на субъективные жалобы пользователей. Проанализируем показатели APDEX (Application Performance Index), чтобы понять, какая именно часть проведения занимает больше всего времени: чтение остатков, расчет партий или физическая запись движений в базу данных.

Обслуживание индексов и статистики в SQL Server

Одной из главных проблем является отсутствие регулярного обслуживания базы данных. Если индексы сильно фрагментированы, SQL Server тратит больше времени на поиск данных. Рассмотрим, какие операции по обслуживанию наиболее критичны:

  1. Реорганизация индексов (Index Reorganize): Это «легкая» операция, которая не блокирует таблицы и может выполняться даже во время работы пользователей. Она дефрагментирует индексы на уровне страниц.
  2. Перестроение индексов (Index Rebuild): Более радикальный метод, который полностью пересоздает индекс. Это требует значительных ресурсов и часто блокирует таблицы (в версии Standard), но дает максимальный эффект.
  3. Обновление статистики (Update Statistics): Это, пожалуй, самая важная операция. Оптимизатор SQL Server строит план выполнения запроса на основе статистики. Если статистика «протухла», SQL может выбрать крайне неэффективный путь получения данных (например, сканирование всей таблицы вместо использования индекса).

Практический совет: Если у вас нет возможности выделить длительное окно для полного перестроения индексов, настройте ежедневную реорганизацию индексов и ежедневное обновление статистики с параметром FULLSCAN для наиболее нагруженных таблиц регистров накопления.

Оптимизация настроек SQL Server (TempDB и Parallelism)

Выясним причину, по которой SQL Server может «захлебываться» при массовой записи. Выполним следующие настройки на уровне СУБД:

1. Настройка TempDB: При проведении документов 1С активно использует временные таблицы. Разделим базу tempdb на несколько файлов одинакового размера (рекомендуется количество файлов, равное количеству ядер процессора, но не более 8). Это значительно снизит конкуренцию за распределение страниц.

2. Параметр MAXDOP: Установим Max Degree of Parallelism в значение 1. Это предотвратит ситуацию, когда SQL Server пытается распараллелить простые запросы 1С, что в многопользовательской среде часто ведет к взаимным блокировкам.

Оптимизация программного кода проведения

Рассмотрим случай, когда перепроведение выполняется для целей управленческого учета. Часто в модулях проведения документов зашито огромное количество проверок (на наличие остатков, на заполнение реквизитов, на соответствие характеристик). При массовом перепроведении за прошлые периоды многие из этих проверок избыточны, так как данные уже проверены при первичном вводе.

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


// Пример упрощенной записи наборов записей регистра накопления
НаборДвижений = РегистрыНакопления.ПартииТоваровНаСкладах.СоздатьНаборЗаписей();
НаборДвижений.Отбор.Регистратор.Установить(СсылкаНаДокумент);

// Формируем таблицу движений (например, на основе рассчитанных данных)
// ... логика расчета ...

НаборДвижений.Загрузить(ТаблицаНовыхДвижений);
НаборДвижений.Записать();

Такой подход позволяет исключить выполнение кода в модулях документа и подписках на события, что может ускорить процесс в несколько раз. Однако будьте осторожны: при таком методе вы берете на себя полную ответственность за корректность данных в регистрах.

Использование отложенного проведения

В конфигурации Управление торговлей 10.3 предусмотрен механизм отложенного проведения по партиям. Разберем, как это работает. В настройках параметров учета можно отключить флаг «Списывать партии при проведении документов». В этом случае при проведении документа формируются только движения по остаткам (оперативный учет), а тяжелый расчет себестоимости и списания партий переносится в регламентную процедуру Проведение по партиям.

Это позволяет пользователям работать быстро днем, а серверу — спокойно рассчитывать партии ночью в монопольном режиме, когда нет конкуренции за таблицы ПартииТоваровНаСкладах.

Административные и системные меры

Проанализируем аппаратную часть и системные настройки сервера. Часто банальные вещи мешают производительности:

В заключение отметим, что лучшим решением всегда является комбинация методов: грамотное регламентное обслуживание SQL Server, очистка базы от неактуальных данных и оптимизация алгоритмов проведения в самой 1С.

← На главную