Как решить проблему разрастания регистра «Соответствие объектов информационных баз» в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При активном обмене данными между конфигурациями 1С многие специалисты сталкиваются с критическим увеличением объема базы данных. Особенно остро эта проблема проявляется в файловых базах данных (формат .1CD), где каждый лишний гигабайт существенно снижает общую производительность системы. Одним из главных виновников «раздувания» базы часто становится регистр сведений «Соответствие объектов информационных баз» (в современных конфигурациях на базе БСП при обмене через EnterpriseData его аналогом выступает регистр «Публичные идентификаторы синхронизируемых объектов»).

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

Почему индексы регистра соответствия растут быстрее самих данных?

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

  1. Высокая фрагментация из-за специфики GUID: Уникальные идентификаторы (UUID/GUID) представляют собой практически случайные наборы символов. При записи новых соответствий (например, при выгрузке тяжелых справочников вроде партий товаров или штрихкодов) новые записи вставляются СУБД в случайные места индекса, а не последовательно в конец. Это приводит к сильной фрагментации индексных страниц на диске, из-за чего размер файла базы данных лавинообразно увеличивается.
  2. Избыточность и сложность индексов: Платформа 1С строит сложные составные индексы по измерениям регистра (узел обмена, тип и уникальный идентификатор источника/приемника), чтобы обеспечить мгновенный поиск сопоставленных объектов при каждой сессии обмена.

Чем грозит полная очистка регистра соответствий?

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

Сценарий 1: Обмен настроен строго по уникальным идентификаторам (GUID)

Если сопоставление объектов происходит по их внутреннему идентификатору, полная очистка регистра действительно практически безопасна. При следующей синхронизации система сопоставит объекты по их GUID и автоматически заново создаст записи в регистре соответствий. Единственным минусом будет то, что первый обмен после очистки займет значительно больше времени, так как платформе придется заново проанализировать и сопоставить весь массив данных.

Сценарий 2: Используется сопоставление по полям поиска (Код, ИНН, Наименование) или ручное сопоставление

В этом случае очистка регистра гарантированно приведет к массовому появлению дублей (задвоению объектов) в базах данных. Без информации из этого регистра система «забудет», что объект «А» в базе-источнике соответствует объекту «Б» в базе-приемнике, если изначально их внутренние идентификаторы GUID различались. При первой же синхронизации 1С создаст новые копии элементов вместо обновления существующих.

Проблема накопления «мусорных» данных и битых ссылок

Регистр сведений разрастается еще и потому, что при физическом удалении объектов из базы (например, через операцию «Удаление помеченных объектов») соответствующие записи в регистре соответствия часто остаются. Они превращаются в «битые» ссылки с представлением <Объект не найден>.... Со временем доля таких неактуальных записей может составлять до 30–50% от общего объема регистра. Логично, что их удаление не принесет никаких негативных последствий.

Пошаговые методы оптимизации и безопасной очистки

Рассмотрим подробнее профессиональные подходы к решению проблемы разрастания регистра без риска повредить данные.

Способ 1. Точечное удаление «битых» записей с помощью запроса

Вместо радикального удаления всех данных, мы можем написать простую обработку, которая найдет и удалит только записи с несуществующими объектами. Для поиска таких записей в 1С используется проверка системных реквизитов (например, ВерсияДанных) на значение NULL.

Рассмотрим пример кода для поиска и удаления записей с битыми ссылками:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Соответствие.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
    |	Соответствие.СобственныйОбъект КАК СобственныйОбъект,
    |	Соответствие.ИсточникВСопоставлении КАК ИсточникВСопоставлении
    |ИЗ
    |	РегистрСведений.СоответствиеОбъектовИнформационныхБаз КАК Соответствие
    |ГДЕ
    |	Соответствие.СобственныйОбъект.ВерсияДанных ЕСТЬ NULL";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрыСведений.СоответствиеОбъектовИнформационныхБаз.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.УзелИнформационнойБазы.Установить(Выборка.УзелИнформационнойБазы);
    НаборЗаписей.Отбор.СобственныйОбъект.Установить(Выборка.СобственныйОбъект);
    НаборЗаписей.Отбор.ИсточникВСопоставлении.Установить(Выборка.ИсточникВСопоставлении);
    
    // Записываем пустой набор для удаления конкретной записи
    НаборЗаписей.Записать();
КонецЦикла;

Способ 2. Очистка по устаревшим данным

Если в вашей базе хранятся исторические данные по объектам, обмен по которым больше никогда не будет производиться (например, партии товаров за закрытые прошлые года), записи соответствий по ним можно безболезненно удалить. Для этого можно модернизировать вышеописанный запрос, добавив в него отбор по типу объекта или по дате его создания.

Способ 3. Программное отключение регистрации при записи (для самописных правил)

Если вы используете собственные правила обмена данными, можно применить эффективную недокументированную возможность БСП. Чтобы система не тратила ресурсы на запись соответствия для временных или транзитных объектов, мы можем удалить признак необходимости регистрации при записи объекта.

Для этого в обработчике правил обмена «После загрузки» или непосредственно в модуле объекта перед записью используем следующий код:

Объект.ДополнительныеСвойства.Удалить("СоответствияОбъектовИнформационныхБаз");

Этот прием заставляет стандартные механизмы обмена БСП «думать», что данный объект не требует сопоставления в таблице соответствий, предотвращая засорение регистра в будущем.

Способ 4. Обязательное обслуживание файловой базы данных

Обратите внимание: простое удаление записей из регистра программным путем или вручную не уменьшит физический размер файла базы данных на диске. Платформа 1С не отдает операционной системе освободившееся в файле .1CD место автоматически.

Чтобы физически сжать базу данных после очистки регистра, выполним следующие шаги:

  1. Запустим базу данных в режиме Конфигуратор.
  2. Откроем меню Администрирование — Тестирование и исправление....
  3. Установим флажки напротив пунктов «Реиндексация таблиц информационной базы» и «Сжатие таблиц информационной базы».
  4. Нажмем кнопку Выполнить.

Только после завершения этих процедур индексы будут перестроены без фрагментации, а неиспользуемое пространство файла базы данных будет возвращено операционной системе.

← На главную