Работа с файловыми базами данных в 1С иногда преподносит неприятные сюрпризы в виде логических повреждений данных. Одна из наиболее сложных ситуаций — когда стандартные средства восстановления, такие как утилита chdbfl.exe или штатное «Тестирование и исправление» (ТиИ), не справляются. Рассмотрим ситуацию на примере конфигурации «Управление торговлей 10.3», где ломается регистр накопления ТоварыВРознице, а попытка пересчета итогов приводит к загадочной ошибке SDBL: ожидается create drop rename replace или select.
В этой статье мы разберем причины возникновения таких ошибок, проанализируем структуру таблиц итогов и изучим программный метод восстановления данных, который помогает даже тогда, когда база отказывается загружаться в SQL-сервер из-за дублирующихся ключей.
Прежде чем приступать к лечению, давайте разберем типичную картину «болезни» базы данных:
The CREATE UNIQUE INDEX statement terminated because a duplicate key was found... for the object name 'dbo._AccumRgT6163'.Ошибка указывает на таблицу _AccumRgT. Буква T в названии таблицы (от слова Totals) означает, что проблема локализована именно в таблице итогов регистра накопления, а не в основной таблице движений. Дубли в этой таблице — это записи с абсолютно одинаковыми измерениями на одну и ту же дату (разделитель периодов), чего в норме быть не должно.
Проанализируем ситуацию глубже. Часто при просмотре структуры базы специализированными утилитами в таблице итогов обнаруживаются записи с пустым периодом или датой вида 01.01.2001 (при использовании смещения дат 2000 лет). Платформа 1С пытается построить уникальный индекс по измерениям регистра, но натыкается на две и более одинаковые строки.
Важный момент: Таблица итогов является производной. Она нужна только для ускорения работы отчетов. Все данные в ней строятся на основании основной таблицы движений (_AccumRg). Если в основной таблице данных нет, а в итогах они появились — мы имеем дело с «логическим мусором».
Если стандартное ТиИ вылетает с ошибкой SDBL, мы можем заставить платформу пересоздать таблицу итогов программно. Этот метод хорош тем, что он принудительно очищает вспомогательную таблицу и заполняет её заново на основе «чистых» движений документов.
Для этого нам понадобится создать внешнюю обработку и выполнить следующий код для проблемного регистра (в нашем примере это ТоварыВРознице):
// Отключаем использование итогов.
// В этот момент 1С должна полностью очистить таблицу _AccumRgT
РегистрыНакопления.ТоварыВРознице.УстановитьИспользованиеИтогов(Ложь);
// Включаем использование итогов обратно.
// Система заново просканирует таблицу движений и заполнит итоги корректно
РегистрыНакопления.ТоварыВРознице.УстановитьИспользованиеИтогов(Истина);
// Дополнительно можно выполнить пересчет за весь период
РегистрыНакопления.ТоварыВРознице.ПересчитатьИтоги();
После выполнения этого кода «фантомные» записи в таблице итогов обычно исчезают. Рассмотрим, почему это помогает: метод УстановитьИспользованиеИтогов(Ложь) физически очищает данные в таблице _AccumRgT, а при повторном включении платформа создает индекс заново. Если ошибка SDBL была вызвана некорректным состоянием именно этой таблицы, проблема решится.
Рассмотрим ситуацию, если первый способ не помог. Это может означать, что проблема кроется в основной таблице регистра. Проанализируем её на наличие «битых» ссылок. Выясним, нет ли записей, у которых в поле Регистратор содержится значение Объект не найден.
Для поиска таких записей воспользуемся простым запросом:
ВЫБРАТЬ
ТоварыВРознице.Регистратор,
ТоварыВРознице.Период
ИЗ
РегистрНакопления.ТоварыВРознице КАК ТоварыВРознице
ГДЕ
ТоварыВРознице.Регистратор.Ссылка ЕСТЬ NULL
И НЕ ТоварыВРознице.Регистратор = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) // Добавьте все возможные типы
Если такие записи найдены, их необходимо удалить или восстановить документы-регистраторы. Наличие записи с пустым или некорректным периодом в основной таблице гарантированно приведет к ошибке при попытке рассчитать итоги.
Если база данных все же позволила себя загрузить в SQL (например, после частичного исправления программным кодом), но ошибка SDBL в файловом режиме сохраняется, стоит провести обслуживание на стороне SQL Server.
Разберем последовательность действий:
_AccumRgT6163).TRUNCATE TABLE _AccumRgT6163. Это мгновенно очистит таблицу итогов, не затрагивая сами документы.Важное примечание: После выполнения этих действий в SQL-версии, рекомендуется выполнить полную выгрузку в .dt и загрузить обратно в файловый вариант. Это часто помогает избавиться от ошибок в системных таблицах, таких как DBSchema, которые и вызывают пресловутую ошибку SDBL.
Проанализировав ситуацию, можно выделить несколько причин появления дублей в итогах:
1Cv8.1cd, что приводит к рассинхронизации основной таблицы и таблицы итогов.Итог: Если вы столкнулись с ошибкой пересчета итогов, не паникуйте. Сначала попробуйте программное отключение/включение итогов через УстановитьИспользованиеИтогов(). В 90% случаев это решает проблему «битых» остатков в файловых базах без потери данных.