Как исправить поврежденную таблицу итогов регистра накопления и ошибку SDBL в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Работа с файловыми базами данных в 1С иногда преподносит неприятные сюрпризы в виде логических повреждений данных. Одна из наиболее сложных ситуаций — когда стандартные средства восстановления, такие как утилита chdbfl.exe или штатное «Тестирование и исправление» (ТиИ), не справляются. Рассмотрим ситуацию на примере конфигурации «Управление торговлей 10.3», где ломается регистр накопления ТоварыВРознице, а попытка пересчета итогов приводит к загадочной ошибке SDBL: ожидается create drop rename replace или select.

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

Анализируем симптомы проблемы

Прежде чем приступать к лечению, давайте разберем типичную картину «болезни» базы данных:

  1. Некорректные отчеты: Остатки товаров в отчетах выглядят «кривыми» или не соответствуют реальным движениям.
  2. Бесполезность Chdbfl: Утилита проверки физической целостности не находит ошибок, так как структура файла базы данных цела, а повреждена лишь логика внутри таблиц.
  3. Ошибка SDBL в ТиИ: При попытке выполнить «Пересчет итогов» система выдает низкоуровневую ошибку парсера запросов.
  4. Проблемы при миграции на SQL: При попытке выгрузить базу в формат SQL Server возникает ошибка: 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). Если в основной таблице данных нет, а в итогах они появились — мы имеем дело с «логическим мусором».

Способ 1. Программный пересчет итогов (Самый эффективный)

Если стандартное ТиИ вылетает с ошибкой SDBL, мы можем заставить платформу пересоздать таблицу итогов программно. Этот метод хорош тем, что он принудительно очищает вспомогательную таблицу и заполняет её заново на основе «чистых» движений документов.

Для этого нам понадобится создать внешнюю обработку и выполнить следующий код для проблемного регистра (в нашем примере это ТоварыВРознице):


// Отключаем использование итогов. 
// В этот момент 1С должна полностью очистить таблицу _AccumRgT
РегистрыНакопления.ТоварыВРознице.УстановитьИспользованиеИтогов(Ложь);

// Включаем использование итогов обратно. 
// Система заново просканирует таблицу движений и заполнит итоги корректно
РегистрыНакопления.ТоварыВРознице.УстановитьИспользованиеИтогов(Истина);

// Дополнительно можно выполнить пересчет за весь период
РегистрыНакопления.ТоварыВРознице.ПересчитатьИтоги();

После выполнения этого кода «фантомные» записи в таблице итогов обычно исчезают. Рассмотрим, почему это помогает: метод УстановитьИспользованиеИтогов(Ложь) физически очищает данные в таблице _AccumRgT, а при повторном включении платформа создает индекс заново. Если ошибка SDBL была вызвана некорректным состоянием именно этой таблицы, проблема решится.

Способ 2. Диагностика основной таблицы движений

Рассмотрим ситуацию, если первый способ не помог. Это может означать, что проблема кроется в основной таблице регистра. Проанализируем её на наличие «битых» ссылок. Выясним, нет ли записей, у которых в поле Регистратор содержится значение Объект не найден.

Для поиска таких записей воспользуемся простым запросом:


ВЫБРАТЬ
    ТоварыВРознице.Регистратор,
    ТоварыВРознице.Период
ИЗ
    РегистрНакопления.ТоварыВРознице КАК ТоварыВРознице
ГДЕ
    ТоварыВРознице.Регистратор.Ссылка ЕСТЬ NULL
    И НЕ ТоварыВРознице.Регистратор = ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка) // Добавьте все возможные типы

Если такие записи найдены, их необходимо удалить или восстановить документы-регистраторы. Наличие записи с пустым или некорректным периодом в основной таблице гарантированно приведет к ошибке при попытке рассчитать итоги.

Способ 3. Переход в SQL-вариант для «глубокого» исправления

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

Разберем последовательность действий:

  1. Загружаем базу в MS SQL Server.
  2. Находим таблицу итогов (в нашем случае _AccumRgT6163).
  3. Выполняем команду TRUNCATE TABLE _AccumRgT6163. Это мгновенно очистит таблицу итогов, не затрагивая сами документы.
  4. Заходим в конфигуратор и через меню «Операции» — «Управление итогами» устанавливаем период рассчитанных итогов. Платформа сама заполнит пустую таблицу правильными данными.

Важное примечание: После выполнения этих действий в SQL-версии, рекомендуется выполнить полную выгрузку в .dt и загрузить обратно в файловый вариант. Это часто помогает избавиться от ошибок в системных таблицах, таких как DBSchema, которые и вызывают пресловутую ошибку SDBL.

Почему это происходит? Профилактика

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

Итог: Если вы столкнулись с ошибкой пересчета итогов, не паникуйте. Сначала попробуйте программное отключение/включение итогов через УстановитьИспользованиеИтогов(). В 90% случаев это решает проблему «битых» остатков в файловых базах без потери данных.

← На главную