Как исправить ошибку «Попытка вставки неуникального значения в уникальный индекс» при создании начального образа в 1С?

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

При попытке выделить отдельную организацию из базы 1С:Бухгалтерия Предприятия 3.0 с помощью распределенной информационной базы (РИБ) разработчики и администраторы часто сталкиваются со сбоем на этапе формирования начального образа. Ошибка возникает при вызове метода СоздатьНачальныйОбраз и сопровождается сообщением от MS SQL Server о невозможности выполнения инструкции CREATE UNIQUE INDEX из-за обнаружения повторяющегося ключа в индексах вида _ByRecorder.

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

Почему возникает ошибка при создании начального образа?

Разберем основные факторы, приводящие к сбою уникальности индексов в СУБД MS SQL Server при формировании начального образа подчиненного узла:

  1. Наличие фантомных дублей в СУБД: В процессе эксплуатации базы в таблицах SQL могут появляться поврежденные или некорректные записи. При обычной работе в 1С они не вызывают сбоев, но при физическом перестроении индексов в процессе выгрузки начального образа СУБД отвергает дубликаты.
  2. Несогласованность фильтров в плане обмена: Если в плане обмена включен фильтр по организации, обработчик ПриОтправкеДанныхПодчиненному или подписки на события отсекают часть документов или движений. В результате выгружаются движения регистра без самого документа-регистратора (или наоборот), либо нарушается порядковый номер записи в наборе, что приводит к совпадению составного ключа индекса _ByRecorder (регистратор + номер строки).
  3. Рассинхронизация таблиц итогов: Нарушение целостности в таблицах итогов регистров накопления или бухгалтерии приводит к ошибочной генерации записей при переносе остатков платформой.
  4. Ограничения разрядности процесса: При работе с крупными базами данных (от 10 ГБ и выше) 32-разрядный клиент или сервер 1С может исчерпать доступную оперативную память, вызывая сбои в формировании потока данных.

Шаг 1. Локализация сбойного регистра на стороне 1С

В тексте ошибки SQL указывает внутреннее имя таблицы СУБД, например dbo._AccumRg25609. Чтобы узнать, какому объекту конфигурации 1С соответствует эта таблица, выполним специальный запрос в режиме 1С:Предприятия или через внешнюю обработку:


ИменаТаблиц = Новый Массив;
ИменаТаблиц.Добавить("РегистрНакопления.УплатаНДФЛНалоговымиАгентами");

СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных(ИменаТаблиц, Истина);

Для Каждого СтрокаТаблицы Из СтруктураБазы Цикл
    Сообщить("Имя таблицы в SQL: " + СтрокаТаблицы.ИмяТаблицыХранения);
КонецЦикла;

Метод ПолучитьСтруктуруХраненияБазыДанных позволяет точно сопоставить имя SQL-объекта с конкретным регистром накопления, сведений или бухгалтерии.

Шаг 2. Тестирование, исправление и пересчет итогов

Простое переиндексирование стандартными средствами 1С в данном случае часто оказывается неэффективным. Для восстановления физической целостности таблиц выполним следующие действия:

  1. Откроем конфигуратор 1С и перейдем в меню Администрирование — Тестирование и исправление.
  2. Установим флаг Реструктуризация таблиц информационной базы. В отличие от переиндексации, реструктуризация полностью пересоздает физические таблицы и индексы в MS SQL Server, удаляя битые ссылки.
  3. Установим флаг Пересчет итогов для восстановления правильного состояния таблиц регистров накопления и бухгалтерии.
  4. Запустим процесс выполнения.

Шаг 3. Очистка неактуальных данных и повторный запуск

Если после реструктуризации ошибка продолжает возникать на конкретном регистре (например, УплатаНДФЛНалоговымиАгентами), и данные этого регистра не используются в выделяемой базе (к примеру, расчет зарплаты и НДФЛ ведется в отдельной программе 1С:ЗУП), можно произвести очистку записей регистра.

Очистить набор записей регистра по сбойной организации или полностью можно программно с помощью следующего кода:


НаборЗаписей = РегистрыНакопления.УплатаНДФЛНалоговымиАгентами.СоздатьНаборЗаписей();
// При необходимости устанавливаем отбор по организации
// НаборЗаписей.Отбор.Организация.Установить(ВыбраннаяОрганизация);
НаборЗаписей.Записать(); // Записываем пустой набор, удаляя данные

После удаления устаревших или поврежденных записей из регистра необходимо повторно выполнить пересчет итогов в конфигураторе, после чего запустить создание начального образа вызовом метода СоздатьНачальныйОбраз.

Альтернативные способы выделения организации в отдельную базу

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

Вариант 1. Создание полного начального образа с последующей обрезкой

Рассмотрим алгоритм, который позволяет обойти проблемы с фильтрацией данных на этапе формирования базы:

  1. Создадим начальный образ РИБ **без фильтрации** по организациям (полный образ базы).
  2. Откроем созданную подчиненную базу и отключим ее от главного узла, выполнив команду в режиме 1С:Предприятие:

УстановитьГлавныйУзел(Неопределено);

  1. В полученной автономной базе физически удалим лишние организации и их документы с помощью стандартного сервиса Удаление помеченных объектов или специальных обработок свертки базы данных.

Вариант 2. Перенос данных через универсальный формат (EnterpriseData / XML)

Если требуется получить чистую базу без истории ошибок в индексах:

  1. Развернем пустую информационную базу той же конфигурации.
  2. Используем стандартную обработку Универсальный обмен данными в формате XML или механизм обмена EnterpriseData.
  3. Выполним выгрузку нормативно-справочной информации и остатков исключительно по нужной организации.

Вариант 3. Использование 64-разрядной платформы

Убедимся, что процедура формирования начального образа выполняется в 64-разрядном окружении (на 64-битном сервере 1С:Предприятия или через 64-битный клиент 1С). Это исключит ошибки недостатка оперативной памяти при обработке крупных таблиц объемом от 10 ГБ.

← На главную