При переходе с файловой версии информационной базы 1С на клиент-серверный вариант (MS SQL Server) системные администраторы и программисты часто сталкиваются с критической ошибкой: «Ошибка загрузки информационной базы. В информационную базу загружены не все данные». В подробном описании ошибки обычно фигурирует фраза: «Попытка вставки неуникального значения в уникальный индекс» (Duplicate key was found).
Давайте разберем, почему возникает эта ситуация, проанализируем структуру проблемных таблиц и рассмотрим пошаговые методы решения, которые помогут успешно завершить миграцию данных.
Основная причина кроется в различиях между файловой СУБД (собственная разработка 1С) и промышленными СУБД (такими как MS SQL Server или PostgreSQL). Файловая база данных менее строго следит за уникальностью записей в таблицах итогов. В результате программных сбоев, некорректного завершения работы или ошибок в коде конфигурации в таблицах итогов (например, по регистрам бухгалтерии или накопления) могут появиться две абсолютно одинаковые записи по комбинации измерений и периода.
При загрузке данных в MS SQL Server платформа 1С пытается создать уникальные индексы для ускорения работы. СУБД SQL Server, обнаружив дубликат, блокирует создание индекса и прерывает загрузку всей базы. В тексте ошибки часто упоминаются таблицы вида _AccRgAT (итоги регистра бухгалтерии) или _AccumRgT (итоги регистра накопления).
Обратим внимание на специфическую дату 3999-11-01. В архитектуре 1С эта дата является служебной и используется для хранения итогов «на будущее время» (так называемые актуальные итоги). Если ошибка возникает именно на этой дате, значит проблема локализована в текущих рассчитанных итогах регистра.
Рассмотрим наиболее безопасный и «штатный» способ, который помог автору темы. Суть метода заключается в том, чтобы заставить систему полностью переформировать таблицы итогов, удалив ошибочные дубли в файловом варианте перед выгрузкой.
Пошаговый алгоритм действий:
.dt и попробуйте загрузить ее в SQL-вариант.Иногда штатный механизм управления итогами через интерфейс не очищает физические записи в таблицах полностью. В этом случае мы можем прибегнуть к программному методу. Разберем пример кода, который сбрасывает период рассчитанных итогов, что заставляет систему очистить таблицу _AccRgAT.
// Пример для регистра бухгалтерии "Хозрасчетный"
Процедура ОчиститьИтогиБухгалтерии()
// Устанавливаем период рассчитанных итогов в глубокое прошлое
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов('00010101');
// Также можно программно отключить использование итогов
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
Сообщить("Период итогов сброшен, использование итогов отключено.");
КонецПроцедуры
После выполнения данного кода в файловой базе рекомендуется выполнить операцию «Сжатие таблиц» через утилиту chdbfl.exe или через ТиИ, чтобы физически удалить помеченные на удаление дублирующиеся записи.
Если стандартные средства 1С не видят проблему, проанализируем ситуацию с помощью утилиты Tool1CD. Это позволяет увидеть базу «глазами СУБД» еще в файловом варианте.
Проанализируем шаги работы с утилитой:
1Cv8.1CD в утилите Tool1CD._AccRgAT11032).chdbfl.exe для проверки целостности файла после ручного вмешательства.Важно: этот метод является радикальным, поэтому всегда делайте резервную копию файла базы данных перед началом работ.
Посмотрим на ситуацию под другим углом: что если данные уже загружены в SQL, но упали только на этапе создания индексов? В этом случае база уже существует в SQL Management Studio (SSMS), но она «битая» с точки зрения 1С.
Рассмотрим план действий в среде SQL:
dbo._AccRgAT11032).
TRUNCATE TABLE dbo._AccRgAT11032;
_AccRgED) заполнена, а таблица итогов пуста. Система автоматически пересчитает итоги «с нуля» и создаст все необходимые уникальные индексы без ошибок.Чтобы избежать подобных проблем в будущем, проанализируем следующие моменты:
ОбменДанными.Загрузка = Истина, это отключает лишние проверки, но требует от разработчика особого контроля за целостностью данных.Таким образом, комбинируя штатные средства платформы и возможность прямого манипулирования данными в таблицах итогов, можно решить проблему «неуникальных значений» и успешно завершить переход на клиент-серверную архитектуру.