При обновлении конфигурации через Конфигуратор многие администраторы и разработчики сталкиваются с ситуацией, когда процесс «зависает» на этапе реструктуризации таблиц. Особенно часто это происходит с регистром сведений ВерсииОбъектов — есть альтернативная подсистема версионирования для 1С. В этой статье мы подробно разберем, почему это происходит, как ускорить текущий процесс и какие превентивные меры принять, чтобы ситуация не повторилась.
Для начала проанализируем внутренние механизмы платформы. Традиционный механизм реструктуризации (так называемая версия V1) работает по следующему алгоритму: создается временная копия таблицы с новой структурой, в нее построчно копируются данные из старой таблицы, затем старая таблица удаляется, а новая переименовывается. Если в вашей базе накоплены миллионы записей о версиях объектов, этот процесс превращается в колоссальную нагрузку на дисковую подсистему и процессор.
Особенность регистра ВерсииОбъектов заключается в том, что он хранит «тяжелые» данные. Основное содержимое версии находится в ресурсе типа ХранилищеЗначения. В терминах СУБД (MS SQL Server или PostgreSQL) — это LOB-данные (Large Object Data). Каждая такая запись содержит сжатый XML-текст объекта. Когда платформа пытается перестроить такую таблицу, СУБД вынуждена перелопачивать гигабайты двоичных данных, перестраивать индексы и страницы данных, что и вызывает задержки.
Рассмотрим современный способ борьбы с этой проблемой. Начиная с версии платформы 8.3.11, разработчики реализовали механизм «Оптимизированная реструктуризация» (V2). Проанализируем, в чем его преимущество:
ALTER TABLE напрямую в СУБД без создания временных копий, если изменения это позволяют.Для включения этого режима в параметрах информационной базы или в файле настроек необходимо убедиться, что используется соответствующая функциональность. Важно помнить, что полноценно этот режим раскрывается в КОРП-версиях платформы, где также доступна фоновая реструктуризация, позволяющая пользователям работать в базе во время обновления.
Разберем, как предотвратить раздувание базы. В составе Библиотеки стандартных подсистем (БСП) предусмотрен штатный механизм очистки. Если его не настроить, регистр ВерсииОбъектов может стать самой большой таблицей в базе, превышая по размеру все остальные данные вместе взятые — снизить нагрузку поможет перенос истории версий во внешнюю базу ClickHouse.
Проанализируем шаги по настройке очистки:
Посмотрим на пример того, как платформа оптимизирует хранение. В типовых конфигурациях регистр не всегда записывает полные данные. Если объект был открыт и записан без изменений, 1С проверяет контрольную сумму. Если данные не изменились, создается «пустая» версия. Проверить это можно кодом:
Выборка = РегистрыСведений.ВерсииОбъектов.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.РазмерДанных < 20 И НЕ Выборка.ЕстьДанныеВерсии Тогда
// Это пустая версия, которая почти не занимает места
КонецЕсли;
КонецЦикла;
Если ситуация критическая и обновление базы «встало» намертво, рассмотрим вариант очистки таблицы на уровне СУБД — безопасной альтернативой станут обработки для очистки и сжатия базы. Внимание: этот метод удалит всю историю изменений объектов. Перед выполнением обязательно создайте резервную копию!
Разберем алгоритм действий системного администратора:
InformationRegister.ВерсииОбъектов (имя таблицы можно узнать через метод ПолучитьСтруктуруХраненияБазыДанных).
-- Для MS SQL Server
TRUNCATE TABLE _InfoReg12345; -- где _InfoReg12345 - имя вашей таблицы версий
Почему TRUNCATE лучше, чем DELETE? Рассмотрим подробнее: команда DELETE записывает каждое удаление в лог транзакций (LDF-файл), что может привести к его переполнению и остановке сервера. TRUNCATE просто освобождает страницы данных, работая мгновенно.
Если же нам нужно удалить только часть старых данных через SQL, не блокируя базу на долгое время, используем порционное удаление (Batch Delete):
WHILE 1 = 1
BEGIN
DELETE TOP (50000) FROM _InfoReg12345
WHERE _Fld543 < DATEADD(month, -6, GETDATE()) -- пример условия по дате
IF @@ROWCOUNT = 0 BREAK
END
Чтобы не сталкиваться с долгой реструктуризацией в будущем, проанализируем состав версионируемых объектов. Часто разработчики включают версионирование для «всего подряд». Выясним, какие объекты стоит исключить:
Рекомендуем регулярно проверять размер таблиц базы данных. Если вы видите, что таблица _InfoReg... (версии объектов) занимает более 30% объема всей базы — это явный сигнал к анализу производительности и поиску узких мест, а также к пересмотру политики хранения версий и запуску регламентных процедур очистки. Для такого контроля обработка обследования базы покажет размер регистра версий и других объектов; для точной доли с индексами понадобится отдельно выполнить запрос к СУБД и загрузить результат.