Реестр документов: ускоряем процесс обновления с XX.5.17 (УТ/КА/ERP)

18.08.25

База данных - HighLoad оптимизация

Ускоряем процесс заполнения идентификаторов в регистре сведений "РеестрДокументов" при обновлении версии ДП ХХ.5.17 на ХХ.5.22.

Всем доброго дня! При подготовке обновления для перехода с версии ДП 2.5.17 на версию 2.5.22 (Комплексная автоматизация) столкнулся у одного клиента с двумя не очень приятными моментами:

  1. Долгая регистрация объектов для отложенного обновления (на тестовом контуре 2 часа)
  2. И совсем уж неприемлемо долгая процедура выполнения обработчиков отложенного обновления (на все том же тестовом контуре - 8 часов)

Все нижеследующие "махинации" применимы для всего семейства УТ/КА/ERP.

 

В ходе недолгих разбирательств была найдена причина в лице многим знакомого (в плохом смысле этого слова))) регистра сведений "РеестрДокументов". Что же именно произошло?

  1. В релизах ХХ.5.20 в этот регистр сведений 1С добавила новое измерение - ИдентификаторЗаписи
  2. При обновлении на релиз ХХ.5.20 и выше происходит регистрация на плане обмена ОбновлениеИнформационнойБазы всех записей регистра с пустым измерением ИдентификаторЗаписи
  3. В процессе отложенного обновления происходит заполнение этого измерения значением Строка(Новый УникальныйИдентификатор)

 

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

  • регистрация изменений на плане обмена занимала в среднем 1.5 часа
  • отложенная обработка - 8 часов в режиме приоритета обновления и больше двух суток в режиме приоритета работы пользователей (помним, что база тестовая и по факту пользователей там не работало все это время).

 

Первое, что пришло на ум - это как-то попытаться ускорить процесс регистрации изменений. Дело в том, что 1С по умолчанию регистрирует изменения порциями по 1000 объектов. В данном случае (несколько упрощенно):

  1. Выбирает все различные значения измерения Ссылка
  2. Создает набор записи с отбором по измерению Ссылка
  3. Добавляет набор в массив текущей порции
  4. Отправляет массив на регистрацию: если порция содержит 1000 элементов - порция регистрируется и массив очищается, если порция меньше 1000 элементов - цикл пополнения порции продолжается
  5. Если после всего цикла в порции остаются элементы, то производиться принудительная регистрация оставшихся наборов записей.

 

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

По факту мы видим, что новое измерение явно является техническим, его заполнения не зависит от состояния информационной базы, а список необработанных записей мы легко можем получить в любой момент и он также не зависит от состояния прочих объектов. Поэтому сразу напрашивается вариант - взять заполнение данного регистра в свои руки. А это сразу означает, что я сэкономлю 1.5 часа, если при обновлении базы данных не буду регистрировать записи на плане обмена. Процедура регистрации располагается в модуле менеджера регистра сведений "РеестрДокументов". Я решил заимствовать его в расширение  с директивой &ИзменениеИКонтроль (на случай, если забуду удалить после обновления и что-то 1С поменяет))

 
 ЗарегистрироватьДанныеКОбработкеДляЗаполненияИдентификаторовЗаписей

 

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

Я решил  пойти по другому пути и разбить порции по  периодам. Поскольку учет ведется с начала 2020 года, было выделено несколько периодов:

  1. До 31.12.2019 - преимущественно по регистраторам расчетов, которые использовались при вводе начальных остатков
  2. По каждому последующему году
  3. С начала 2025 года и далее без ограничения (если  что-то ввели будущей датой)

 

Далее в уже имеющееся расширение добавил серверный модуль с одной процедурой.

 
 sfx_МногопоточнаяОбработка

 

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

И остается, что называется, "на коленке" подготовить код для запуска нескольких фоновых заданий по каждому из периодов. Например, можно подготовить внешнюю обработку с одной кнопкой на форме. Примитивно код запуска 7 фоновых заданий будет иметь вид (можно вбить в консоль кода):

 
 ВыполнитьОбработкуНаСервере

 

Запускал эти обработчики параллельно с другими отложенными обработчиками. В итоге 1.4 млн записей были обработаны за 2 часа и 6 минут, а весь процесс отложенного обновления занял 3.5 часа вместо исходных 6 часов

Что можно  сделать еще? Если вы уверены, что пользователи работают с документами только в определенном периоде, то можно в монопольном режиме перезаполнить записи в "рабочем периоде", после чего уже можно запускать пользователей и параллельно запустить обновление оставшихся записей. Но здесь нужно дополнительно анализировать, на что и как влияет новое измерение, если оно не заполнено.

Вступайте в нашу телеграмм-группу Инфостарт

РеестрДокументов УТ КА ERP ускорение долго обновляется

См. также

HighLoad оптимизация Программист 1С v8.3 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    5907    ivanov660    39    

59

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    8456    ivanov660    13    

60

HighLoad оптимизация Программист 1С v8.3 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    13913    Evg-Lylyk    67    

45

HighLoad оптимизация Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    6724    spyke    29    

52

HighLoad оптимизация Программист 1С v8.3 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    9904    vasilev2015    22    

45

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

5 стартмани

15.02.2024    16504    318    ZAOSTG    100    

123
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JinnWatson 18.08.25 18:50 Сейчас в теме
Спасибо за информацию!
Обратил на это внимание при тестировании обновления, хотя у меня не настолько критичные результаты были, но "цигель", он всегда "ай-лю-лю".
Обязательно попробую ваш метод.
RocKeR_13; +1 Ответить
2. RocKeR_13 1430 19.08.25 09:10 Сейчас в теме
Оставьте свое сообщение