Нередко при попытке подключить или обновить типовое или стороннее расширение в рабочей базе 1С процесс обновления конфигурации базы данных зависает на долгие часы. Особенно ярко эта проблема проявляется на высоконагруженных и объемных базах, таких как 1С:Управление торговлей или 1С:ERP Управление предприятием, а в окне прогресса реструктуризации отображается обработка регистра сведений ВерсииОбъектов. Разберем по шагам, почему платформа 1С запускает полную перестройку многогигабайтных таблиц, в которых расширение даже не заявлено, и рассмотрим эффективные способы решения этой задачи.
Проанализируем структуру регистра сведений ВерсииОбъектов. Основное ведущее измерение этого регистра — Объект. В типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем) данный реквизит имеет составной тип данных, включающий ссылки на все прикладные объекты системы: СправочникСсылка, ДокументСсылка, БизнесПроцессСсылка, ПланВидовХарактеристикСсылка и другие, либо обобщенный тип ЛюбаяСсылка.
Когда мы добавляем в расширение конфигурации новые собственные справочники или документы, в системе расширяется общий пул ссылочных типов. Поскольку измерение Объект регистра ВерсииОбъектов обязано уметь хранить ссылки на абсолютно любые объекты конфигурации (включая объекты из подключенных расширений), СУБД вынуждена скорректировать внутреннюю структуру таблицы и ее индексов. Аналогичная ситуация возникает и с другими системными регистрами, использующими составные типы или ЛюбаяСсылка (например, регистры соответствия объектов для обмена, дополнительные реквизиты и сведения).
Многие специалисты рассчитывают на включенный механизм быстрой реструктуризации UpdateDBCfg=v2, который на уровне платформы позволяет изменять составные типы без полного физического перезаписывания данных. Однако важно учитывать ключевое архитектурное ограничение платформы 1С: механизм v2 работает исключительно при обновлении основной конфигурации базы данных. При установке, изменении структуры или удалении расширений платформа всегда принудительно переключается на классический механизм реструктуризации v1.
В режиме v1 платформа выполняет следующие операции:
_InfoRg...X1) с обновленной структурой колонок и типов.ХранилищеЗначения, где хранятся сжатые XML-версии объектов, лежат в таблицах TOAST).В базе с историей версионирования за несколько лет таблица ВерсииОбъектов вместе с TOAST-данными может занимать сотни гигабайт. Построчное копирование такого объема порождает колоссальную нагрузку на дисковую подсистему и процессор, затягивая процесс на многие часы.
Если процесс реструктуризации длится слишком долго, возникает соблазн снять зависший сеанс в кластере серверов 1С или перезапустить службу. Выясним последствия такого действия:
X1, X2, которые продолжат занимать гигабайты дискового пространства до ручной очистки.Если детальная история изменений за прошлые периоды не представляет критической ценности, наиболее действенный шаг — уменьшить физический объем таблицы перед обновлением:
Важное замечание для баз на PostgreSQL: штатное удаление записей через интерфейс 1С или оператор DELETE не освобождает физическое место на диске из-за механизма MVCC (многоверсионности). Чтобы платформа 1С не вычитывала миллионы «мертвых» строк при последующей реструктуризации, после очистки записей необходимо обязательно выполнить обслуживание таблицы на уровне СУБД с помощью команды VACUUM FULL или утилиты pg_repack.
Если архитектура внедрения позволяет внести изменения в саму конфигурацию, снимем замок и добавим требуемые справочники и документы непосредственно в основную конфигурацию (например, выделив их в отдельную подсистему):
UpdateDBCfg=v2 отработает штатно.ВерсииОбъектов, а лишь обновит описатели типов метаданных.Если структуру расширения изменить нельзя, а данные версионирования необходимо сохранить в полном объеме, сократим время выполнения реструктуризации v1 за счет временной перенастройки параметров СУБД на технологическое окно:
maintenance_work_mem в значение от нескольких гигабайт (в зависимости от свободной оперативной памяти сервера).max_parallel_maintenance_workers (например, задав 4 или 6 воркеров).synchronous_commit = off. Это существенно снизит задержки дискового ввода-вывода при массовой вставке строк.checkpoint_timeout (например, до 30–60 минут) и max_wal_size, чтобы процесс копирования TOAST-данных не прерывался частыми сбросами контрольных точек на диск.postgresql.conf к стандартным рабочим значениям и перезапустим СУБД.Также убедимся, что на дисковом накопителе сервера СУБД доступно как минимум 120–150% свободного места от текущего размера таблицы ВерсииОбъектов вместе с индексами, иначе в процессе копирования свободное место исчерпается, и реструктуризация завершится аварийной ошибкой.