В процессе разработки и сопровождения крупных систем на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда добавление или удаление обычного справочника инициирует длительную процедуру реструктуризации огромных регистров (например, РегистрСведений.ВерсииОбъектов). На первый взгляд это кажется нелогичным: структура хранения ссылки в базе данных SQL для составных типов вроде бы статична. Разберем детально, почему это происходит, как платформа взаимодействует с СУБД и что меняется во внутренних механизмах 1С.
Для начала проанализируем, как 1С хранит ссылки в таблицах СУБД. Если реквизит имеет простой ссылочный тип (например, только СправочникСсылка.Номенклатура), в таблице создается одно поле _RRRef (UUID объекта). Однако, как только мы включаем составной тип данных или используем общие типы СправочникСсылка, ДокументСсылка или ЛюбаяСсылка, структура поля в SQL меняется. Рассмотрим три ключевых поля, которые образуют составную ссылку:
_RTRef.Казалось бы, если мы добавляем новый справочник, количество этих колонок в таблице регистра не меняется. В _RTRef просто может появиться новое значение. Выясним причину, по которой платформа всё же запускает полную переливку данных.
Рассмотрим основной механизм, который использовался в платформе десятилетиями. Его главная особенность заключается в том, что он ориентируется на описание метаданных, а не на фактическую структуру таблиц в SQL. Проанализируем логику его работы:
Когда вы добавляете новый справочник в конфигурацию, он автоматически становится частью коллекции СправочникСсылка. Поскольку тип данных в регистре определен как составной (включающий все справочники), платформа видит, что описание типа изменилось. Для старого механизма пометка Attribute type CHANGED является безусловным триггером к действию.
Процесс происходит по следующему алгоритму:
_v8_tmp.Именно поэтому на регистре ВерсииОбъектов, где могут быть миллионы записей, этот процесс занимает часы. Платформа не проверяет, изменился ли физический размер колонок в SQL — ей достаточно факта изменения состава типов в метаданных.
Разберем подробнее роль поля _RTRef. Платформа 1С ведет внутренний реестр (DBSchema), где сопоставляет числовые коды с именами таблиц. При добавлении нового объекта метаданных этот реестр расширяется. Реструктуризация в данном случае выступает способом "перерегистрации" поля в схеме базы данных. Платформа должна гарантировать, что механизмы контроля ссылочной целостности и объектная модель (например, метод ПолучитьОбъект()) будут корректно интерпретировать новые значения _RTRef, которые могут появиться в этой колонке.
Ситуация осложняется при удалении справочника. Рассмотрим, почему здесь реструктуризация неизбежна. Даже если в регистре нет ни одной записи, ссылающейся на удаляемый справочник, 1С обязана это проверить. На уровне СУБД выполняется поиск и очистка "битых" ссылок. Старый механизм делает это радикально — через полную перезапись таблицы, фильтруя записи в процессе копирования.
Начиная с версии 8.3.11, разработчики платформы реализовали оптимизированный механизм. Проанализируем ситуацию: как он ведет себя в подобных случаях? В отличие от старого подхода, новый механизм выполняет сравнительный анализ физических схем.
Если поле имеет тип ЛюбаяСсылка, и вы добавили справочник, оптимизированный механизм понимает, что структура _TYPE, _RTRef и _RRRef в SQL не изменилась. В идеальных условиях он должен выполнить только ALTER TABLE или вообще ничего не менять на уровне базы данных.
Однако на практике мы часто видим, что реструктуризация всё равно запускается. Проанализируем возможные причины:
Справочник.Склады и Справочник.Контрагенты), и вы добавили туда третий справочник, 1С может изменить внутренние правила валидации данных.Выясним причину, по которой именно этот регистр становится "бутылочным горлышком". В типовых конфигурациях (на базе БСП) измерение Объект в этом регистре имеет тип ЛюбаяСсылка.
Рассмотрим ситуацию: мы удаляем неиспользуемый справочник БонусыПрошлыхЛет. Платформа анализирует все таблицы, где есть ЛюбаяСсылка. Регистр ВерсииОбъектов попадает в этот список. Чтобы гарантировать, что в базе не останется записей версий для уже несуществующего справочника, 1С запускает процесс обработки этого регистра. Если включен старый механизм реструктуризации — вы получаете полную переливку таблицы на несколько терабайт из-за одного маленького удаленного справочника.
Проанализируем шаги, которые помогут ускорить процесс обновления конфигурации:
ЛюбаяСсылка или СправочникСсылка в огромных таблицах без крайней необходимости. Если вы точно знаете, что в регистре будут храниться только ссылки на 5 конкретных справочников — укажите их явно. Это не избавит от реструктуризации при изменении этих 5 типов, но избавит от нее при добавлении 100 других справочников в систему.DBSchema, но это нарушает условия поддержки и крайне опасно.Таким образом, мы выяснили, что основной причиной "внезапной" реструктуризации является консервативный подход платформы к обеспечению целостности данных и зависимость старого механизма обновления от описания метаданных, а не от физического строения таблиц SQL.