Реестр документов: ускоряем процесс обновления с 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С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    6435    ivanov660    48    

52

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

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

18.02.2025    8869    ivanov660    39    

61

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

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

24.06.2024    11305    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

06.06.2024    17534    Evg-Lylyk    73    

46

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

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

13.03.2024    8630    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

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

13.03.2024    12010    vasilev2015    22    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JinnWatson 18.08.25 18:50 Сейчас в теме
Спасибо за информацию!
Обратил на это внимание при тестировании обновления, хотя у меня не настолько критичные результаты были, но "цигель", он всегда "ай-лю-лю".
Обязательно попробую ваш метод.
RocKeR_13; +1 Ответить
2. RocKeR_13 1464 19.08.25 09:10 Сейчас в теме
(1) Всегда пожалуйста)
3. Светлый ум 492 23.12.25 11:09 Сейчас в теме
Вообще там анологичных регистров 2-3 было, все руки не доходили
4. RocKeR_13 1464 23.12.25 11:20 Сейчас в теме
(3) Остальное все более-менее быстро обработалось. Данный подход, конечно, применим только для несложных случаев, когда обновляемые данные можно легко получить в любой момент.
Для отправки сообщения требуется регистрация/авторизация