При активном обмене данными между конфигурациями 1С многие специалисты сталкиваются с критическим увеличением объема базы данных. Особенно остро эта проблема проявляется в файловых базах данных (формат .1CD), где каждый лишний гигабайт существенно снижает общую производительность системы. Одним из главных виновников «раздувания» базы часто становится регистр сведений «Соответствие объектов информационных баз» (в современных конфигурациях на базе БСП при обмене через EnterpriseData его аналогом выступает регистр «Публичные идентификаторы синхронизируемых объектов»).
В этой статье мы подробно разберем, почему растет этот регистр, к каким последствиям может привести его необдуманная очистка, и рассмотрим безопасные практические методы оптимизации объема базы данных.
Как справедливо замечают разработчики, размер индексов этого регистра часто превышает объем самих записей в несколько раз. Проанализируем технические причины этого явления:
Перед тем как принять решение о полной очистке регистра, необходимо четко понимать, по какому принципу настроена синхронизация данных в ваших базах. Рассмотрим два принципиально разных сценария:
Сценарий 1: Обмен настроен строго по уникальным идентификаторам (GUID)
Если сопоставление объектов происходит по их внутреннему идентификатору, полная очистка регистра действительно практически безопасна. При следующей синхронизации система сопоставит объекты по их GUID и автоматически заново создаст записи в регистре соответствий. Единственным минусом будет то, что первый обмен после очистки займет значительно больше времени, так как платформе придется заново проанализировать и сопоставить весь массив данных.
Сценарий 2: Используется сопоставление по полям поиска (Код, ИНН, Наименование) или ручное сопоставление
В этом случае очистка регистра гарантированно приведет к массовому появлению дублей (задвоению объектов) в базах данных. Без информации из этого регистра система «забудет», что объект «А» в базе-источнике соответствует объекту «Б» в базе-приемнике, если изначально их внутренние идентификаторы GUID различались. При первой же синхронизации 1С создаст новые копии элементов вместо обновления существующих.
Регистр сведений разрастается еще и потому, что при физическом удалении объектов из базы (например, через операцию «Удаление помеченных объектов») соответствующие записи в регистре соответствия часто остаются. Они превращаются в «битые» ссылки с представлением <Объект не найден>.... Со временем доля таких неактуальных записей может составлять до 30–50% от общего объема регистра. Логично, что их удаление не принесет никаких негативных последствий.
Рассмотрим подробнее профессиональные подходы к решению проблемы разрастания регистра без риска повредить данные.
Вместо радикального удаления всех данных, мы можем написать простую обработку, которая найдет и удалит только записи с несуществующими объектами. Для поиска таких записей в 1С используется проверка системных реквизитов (например, ВерсияДанных) на значение NULL.
Рассмотрим пример кода для поиска и удаления записей с битыми ссылками:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Соответствие.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
| Соответствие.СобственныйОбъект КАК СобственныйОбъект,
| Соответствие.ИсточникВСопоставлении КАК ИсточникВСопоставлении
|ИЗ
| РегистрСведений.СоответствиеОбъектовИнформационныхБаз КАК Соответствие
|ГДЕ
| Соответствие.СобственныйОбъект.ВерсияДанных ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрыСведений.СоответствиеОбъектовИнформационныхБаз.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.УзелИнформационнойБазы.Установить(Выборка.УзелИнформационнойБазы);
НаборЗаписей.Отбор.СобственныйОбъект.Установить(Выборка.СобственныйОбъект);
НаборЗаписей.Отбор.ИсточникВСопоставлении.Установить(Выборка.ИсточникВСопоставлении);
// Записываем пустой набор для удаления конкретной записи
НаборЗаписей.Записать();
КонецЦикла;
Если в вашей базе хранятся исторические данные по объектам, обмен по которым больше никогда не будет производиться (например, партии товаров за закрытые прошлые года), записи соответствий по ним можно безболезненно удалить. Для этого можно модернизировать вышеописанный запрос, добавив в него отбор по типу объекта или по дате его создания.
Если вы используете собственные правила обмена данными, можно применить эффективную недокументированную возможность БСП. Чтобы система не тратила ресурсы на запись соответствия для временных или транзитных объектов, мы можем удалить признак необходимости регистрации при записи объекта.
Для этого в обработчике правил обмена «После загрузки» или непосредственно в модуле объекта перед записью используем следующий код:
Объект.ДополнительныеСвойства.Удалить("СоответствияОбъектовИнформационныхБаз");
Этот прием заставляет стандартные механизмы обмена БСП «думать», что данный объект не требует сопоставления в таблице соответствий, предотвращая засорение регистра в будущем.
Обратите внимание: простое удаление записей из регистра программным путем или вручную не уменьшит физический размер файла базы данных на диске. Платформа 1С не отдает операционной системе освободившееся в файле .1CD место автоматически.
Чтобы физически сжать базу данных после очистки регистра, выполним следующие шаги:
Только после завершения этих процедур индексы будут перестроены без фрагментации, а неиспользуемое пространство файла базы данных будет возвращено операционной системе.