В процессе эксплуатации файловых информационных баз 1С:Предприятия нередко возникают ситуации, когда из-за аварийного завершения работы, сбоев питания или сетевых разрывов повреждается внутренняя структура таблиц. Одно из частых проявлений такой проблемы — появление дублирующихся записей по уникальным измерениям в независимых регистрах сведений (например, в служебном регистре ЗамерыВремени). При этом стандартные средства платформы перестают работать: встроенное тестирование и исправление падает с ошибкой СУБД «Файл базы данных поврежден 1Cv8.1CD», а попытка программной очистки через методы набора записей приводит к аварийному завершению сеанса.
Разберем природу данной ошибки и подробно рассмотрим проверенные способы восстановления работоспособности информационной базы.
Проанализируем механику работы файловой СУБД 1С. В файле формата .1CD данные и индексы распределены по страницам фиксированного размера. При сбое записи индексное B-дерево может потерять указатели или зафиксировать некорректное смещение. Физически строки остаются в таблице, но логически индекс нарушен. В результате СУБД допускает повторную запись с тем же набором измерений либо при проверке уникальности обнаруживает конфликт первичного ключа.
Служебный регистр ЗамерыВремени используется подсистемой оценки производительности БСП и не содержит учетных данных (бухгалтерских проводок, остатков, документов). Следовательно, полную очистку или пересоздание таблицы этого регистра можно выполнять без риска потери хозяйственных данных.
Важно: Перед выполнением любых восстановительных операций обязательно создайте резервную копию файла информационной базы 1Cv8.1CD путем прямого копирования в отдельный каталог.
Если повреждение не затронуло страницы физического распределения, иногда удается очистить набор записей, отключив прикладные обработчики платформы. Для этого используется свойство ОбменДанными.Загрузка.
Посмотрим на пример обработки:
НаборЗаписей = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать(Истина);
Если очистка всей таблицы целиком по-прежнему вызывает ошибку СУБД, попробуем точечное удаление проблемных строк с помощью объекта СоздатьМенеджерЗаписи():
МенеджерЗаписи = РегистрыСведений.ЗамерыВремени.СоздатьМенеджерЗаписи();
// Заполняем ключевые измерения проблемной строки
МенеджерЗаписи.КлючеваяОперация = ВыбраннаяОперация;
МенеджерЗаписи.ДатаЗаписи = ВыбраннаяДата;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.ОбменДанными.Загрузка = Истина;
МенеджерЗаписи.Удалить();
КонецЕсли;
Однако если поврежден сам физический файл на уровне страниц базы данных, программные методы встроенного языка вызовут исключение. В таких случаях переходим к структурным методам.
Это наиболее надежный и быстрый способ восстановить целостность файловой базы, если поврежден служебный регистр. Идея заключается в том, чтобы заставить платформу физически удалить поврежденную таблицу и создать ее заново с чистыми индексами.
Разберем этот процесс по шагам:
.cf файл.ЗамерыВремени) и полностью удалим его.1Cv8.1CD..cf файл (или файл типовой конфигурации поставщика той же версии).ЗамерыВремени, после чего нажмем кнопку Выполнить.После выполнения этих шагов запустим тестирование и исправление базы данных — ошибок нарушения целостности больше возникать не будет.
Если структура повреждена настолько, что конфигуратор не позволяет применить изменения метаданных, воспользуемся универсальным переносом учетных данных:
ЗамерыВремени (а также с других служебных регистров замеров производительности), оставив все учетные справочники, документы и регистры.Если конфигуратор позволяет выполнить выгрузку информационной базы в файл выгрузки .dt, можно устранить проблему средствами сторонней СУБД:
.dt через меню Администрирование -> Выгрузить информационную базу...ПолучитьСтруктуруХраненияБазыДанных() определим имя физической таблицы регистра в СУБД (например, _InfoRgXXXX).TRUNCATE TABLE _InfoRgXXXX;..dt и загрузим в файловый вариант.Применение описанных методов позволяет восстановить работоспособность информационной базы без потери учетных данных даже при критических повреждениях файловой СУБД.