Рано или поздно многие администраторы и разработчики систем на базе «1С:Предприятие» сталкиваются с проблемой лавинообразного роста файловой базы данных. Ситуация, когда при сравнительно небольшом объеме вводимых документов (например, около 1000 документов в месяц) файл базы данных 1Cv8.1CD увеличивается на сотни мегабайт ежемесячно, не является редкостью. При этом архивный файл выгрузки (.dt) может весить всего 100 Мб, в то время как сама файловая база раздувается до 3,5 Гб и более.
В этой статье мы подробно разберем, почему возникает такая колоссальная разница между размером базы и размером ее архива, какие архитектурные ошибки приводят к «распуханию» таблиц и какими инструментами можно локализовать и устранить эту проблему.
Для начала проанализируем физику процесса хранения данных. Файл выгрузки информационной базы (.dt) — это сжатый архив, содержащий только «чистые» данные (записи справочников, документов, движений регистров) в специальном XML-подобном формате. При формировании .dt-файла платформа полностью игнорирует индексы таблиц, так как они могут быть легко перестроены при последующей загрузке базы.
Файл же файловой базы данных 1Cv8.1CD содержит в себе:
Если разница между размером 1CD и dt составляет десятки раз (например, 3.5 Гб против 100 Мб), это явный маркер того, что база раздута за счет индексов, итогов или пустого зарезервированного пространства.
Одной из наиболее частых архитектурных ошибок в самописных или доработанных конфигурациях является некорректная работа с регистрами накопления остатков. Рассмотрим подробнее, как устроено хранение остатков в платформе 1С.
Регистр накопления остатков физически состоит из двух ключевых таблиц базы данных:
Когда мы проводим документ расхода, платформа должна полностью закрыть в ноль соответствующий приход по всем измерениям регистра (например: Номенклатура, Склад, Характеристика). Если из-за программной ошибки или неверной логики проведения на остатках зависает копейка или микроскопическая дробная часть (например, пришло 10 шт, а списалось 9.99999 шт вследствие ошибок округления), эта запись остатка считается активной.
Каждый раз при наступлении нового месяца платформа копирует все ненулевые остатки из предыдущего периода в новый. Если в базе скопились тысячи таких «висящих» копеечных остатков, таблица итогов начинает лавинообразно увеличиваться при каждом переходе на новый месяц. Даже если новые документы в базу не вводятся, размер файла 1Cv8.1CD продолжит стабильно расти за счет ежемесячного дублирования незакрытых записей в таблице итогов. Это явление часто называют «пухнущими итогами».
Прежде чем приступать к оптимизации, необходимо точно выяснить, какая именно таблица в файле 1Cv8.1CD занимает больше всего места. Для этого мы можем использовать как встроенные средства платформы 1С, так и специализированные внешние инструменты.
Начиная с версии платформы 8.3.15, разработчикам доступны мощные встроенные программные методы, позволяющие оценить объем занимаемой памяти объектами метаданных прямо в коде. Рассмотрим пример простой обработки, которую можно написать для анализа «толстых мест» базы данных:
ТаблицаРезультатов = Новый ТаблицаЗначений;
ТаблицаРезультатов.Колонки.Добавить("ИмяОбъекта", Новый ОписаниеТипов("Строка"));
ТаблицаРезультатов.Колонки.Добавить("РазмерБ", Новый ОписаниеТипов("Число"));
ТаблицаРезультатов.Колонки.Добавить("РазмерМБ", Новый ОписаниеТипов("Число"));
// Анализируем справочники
Для Каждого Справочник Из Метаданные.Справочники Цикл
Размер = ПолучитьРазмерДанныхБазыДанных(Справочник);
Если Размер > 0 Тогда
НоваяСтрока = ТаблицаРезультатов.Добавить();
НоваяСтрока.ИмяОбъекта = Справочник.ПолноеИмя();
НоваяСтрока.РазмерБ = Размер;
НоваяСтрока.РазмерМБ = Окр(Размер / (1024 * 1024), 2);
КонецЕсли;
КонецЦикла;
// Анализируем регистры накопления
Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
Размер = ПолучитьРазмерДанныхБазыДанных(Регистр);
Если Размер > 0 Тогда
НоваяСтрока = ТаблицаРезультатов.Добавить();
НоваяСтрока.ИмяОбъекта = Регистр.ПолноеИмя();
НоваяСтрока.РазмерБ = Размер;
НоваяСтрока.РазмерМБ = Окр(Размер / (1024 * 1024), 2);
КонецЕсли;
КонецЦикла;
ТаблицаРезультатов.Сортировать("РазмерБ Убыв");
// Выводим результат в консоль или таблицу формы...
Функция ПолучитьРазмерДанныхБазыДанных() возвращает размер данных, занимаемый конкретным объектом метаданных. Метод ПолучитьСтруктуруХраненияБазыДанных() позволяет сопоставить имена объектов метаданных с их физическими именами таблиц в файле 1CD (например, определить, к какому регистру относится таблица _InfoReg1234 или _AccumRegTotals5678).
Для тех, кто использует более ранние версии платформы или предпочитает готовые интерактивные инструменты, рекомендуется использовать внешние утилиты диагностики, такие как «Базопузомер» (специальный анализатор физической структуры файла 1CD) или отчеты, построенные на чтении заголовков таблиц файловой базы.
Индексы создаются для ускорения поиска и выборки данных, но за это приходится платить дисковым пространством. В самописных конфигурациях часто допускают ошибку, устанавливая свойство «Индексировать» (или «Индексировать с доп. упорядочиванием») для всех измерений и реквизитов подряд.
Проанализируем следующие правила создания индексов:
В процессе эксплуатации файловой базы важно помнить о технологических ограничениях формата 1CD. Исторически максимальный размер одной таблицы в файловой базе ограничивался 4 Гб (при стандартном размере страницы данных 4 Кб). При превышении этого лимита база аварийно завершает работу, а выгрузка или загрузка данных становится невозможной.
Начиная с версии платформы 8.3.8, фирма 1С добавила возможность создания баз с увеличенным размером страницы данных (8, 16, 32 и 64 Кб). При использовании размера страницы 64 Кб максимальный размер одной таблицы увеличивается до 16 Гб (в современных релизах платформы).
Для того чтобы преобразовать формат существующей базы и увеличить лимиты таблиц, выполним следующие шаги:
1Cv8.1CD путем его копирования в безопасное место.bin текущего релиза).CNVDBFL.EXE, указав максимальный размер страницы 64 Кб (параметр -p 64k):
CNVDBFL.EXE -c -f 8.3.8 -p 64k "C:\PathToYourBase\1Cv8.1CD"
После выполнения этой операции база будет переведена на новый формат. Стоит учитывать, что сам файл 1CD после этого может незначительно увеличиться в размере, поскольку данные теперь будут выравниваться по границам более крупных страниц (64 Кб), однако это полностью нивелирует угрозу упереться в лимит 4 Гб для ключевых таблиц на долгое время.
Чтобы окончательно решить проблему быстрого роста и стабилизировать размер базы данных, выполним комплекс мероприятий:
1CD не высвобождается автоматически. Чтобы уменьшить размер файла, запустите Конфигуратор, перейдите в меню «Администрирование» — «Тестирование и исправление», установите флаг «Сжатие таблиц информационной базы» и запустите процесс.Систематическое проведение аудита структуры хранения данных, оптимизация индексов и контроль за закрытием регистров позволят вам держать размер файловой базы 1С под полным контролем, обеспечивая высокое быстродействие системы и надежность хранения информации.