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

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

При проведении документов (например, «Уведомление об исчисленных суммах налогов») пользователи и администраторы могут столкнуться с аварийным завершением транзакции. СУБД возвращает критическую ошибку: «Нарушено условие уникальности данных. Попытка вставки неуникального значения в уникальный индекс: Cannot insert duplicate key row in object 'dbo._AccRgAT...' with unique index '...'».

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

Анатомия ошибки: что означают данные из сообщения СУБД

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

  1. Имя таблицы (dbo._AccRgAT...): префикс _AccRgAT указывает на то, что сбой произошел в таблице итогов по субконто регистра бухгалтерии. Если у плана счетов включен учет по нескольким субконто, платформа создает отдельные таблицы агрегатов для каждого уровня аналитики (по первому, второму и третьему субконто). В данном случае сбой зафиксирован в таблице итогов второго субконто.
  2. Смещение дат на 2000 лет: в значениях ключа фигурирует дата 4023-05-01 00:00:00. Платформа 1С:Предприятие при работе с Microsoft SQL Server использует внутреннее смещение дат на 2000 лет вперед. Это означает, что реальная дата учетной записи — 01.05.2023. Таблицы итогов регистра бухгалтерии хранят срез на начало календарного месяца, следовательно, коллизия возникла в проводках за май 2023 года.
  3. Поле разделителя итогов: первое значение в ключе индекса — 0. Это поле разделителя итогов (_Splitter), используемое платформой для оптимизации параллельной записи движений.
  4. Значения NULL в ключе: наличие полей <NULL> в уникальном индексе часто свидетельствует о том, что при реструктуризации или изменении состава видов субконто старые записи не получили пустые ссылки требуемого типа, либо в движениях регистра возникли некорректные пустые аналитики.

Способ 1. Временное отключение итогов через пользовательский интерфейс (Рекомендуемый)

Это самый быстрый и безопасный способ, не требующий прямого вмешательства в структуру базы данных средствами СУБД. Суть метода заключается во временном отключении механизма расчета итогов, что позволяет беспрепятственно перезаписать движения документа без проверки уникальности в агрегатных таблицах.

Разберем по шагам порядок действий в режиме 1С:Предприятие:

  1. Перейдем в раздел Администрирование — Обслуживание — Регламентные операции.
  2. Откроем пункт Управление итогами и агрегатами и перейдем по гиперссылке Полные возможности.
  3. В появившемся списке регистров найдем Журнал проводок (бухгалтерский и налоговый учет) (основной регистр бухгалтерии конфигурации) и выделим его курсором.
  4. В командной панели нажмем кнопку Итоги и выберем действие Выключить использование итогов.
  5. Вернемся к документу, вызывавшему ошибку, и проведем его интерактивно. Поскольку запись агрегатов временно остановлена, проводки успешно зафиксируются в таблице движений.
  6. Снова вернемся в форму Управление итогами и агрегатами, выделим наш регистр бухгалтерии и выполним команду Итоги — Включить использование итогов.
  7. Выполним пересчет итогов за проблемный период, нажав кнопку Установить период... или запустив полный пересчет. Платформа корректно перестроит агрегатные таблицы с учетом новых движений.

Способ 2. Очистка сбойной таблицы итогов средствами СУБД

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

Важно: перед выполнением любых операций на уровне СУБД обязательно создадим полную резервную копию информационной базы.

Выполним процедуру восстановления:

  1. Откроем среду SQL Server Management Studio (SSMS) и подключимся к нашему серверу баз данных.
  2. В окне запроса к целевой базе выполним команду быстрой очистки проблемной таблицы (имя берем точно из текста ошибки): TRUNCATE TABLE dbo._AccRgAT237622;
  3. Запустим базу в режиме Конфигуратор.
  4. Откроем меню Администрирование — Тестирование и исправление информационной базы....
  5. Установим флажок только напротив пункта Пересчет итогов и нажмем Выполнить.

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

Способ 3. Поиск и устранение дублирования субконто в движениях

Часто причиной коллизии становится некорректное заполнение аналитики внутри проводки, например, когда в одном наборе записей счета (в частности, 68.01 «НДФЛ при исполнении обязанностей налогового агента») происходит задвоение субконто Регистрация в налоговом органе.

Проанализируем движения за спорный месяц (май 2023 года) с помощью консоли запросов или внешней обработки. Если в поле субконто вместо системной пустой ссылки записано значение NULL (или Неопределено), исправим его программно:


НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Дата("20230501000000"));
// Устанавливаем необходимые отборы по регистратору или счету
НаборЗаписей.Прочитать();

Модифицирован = Ложь;
Для Каждого Проводка Из НаборЗаписей Цикл
    Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НДФЛ Тогда
        // Проверяем заполнение субконто и устраняем некорректные значения
        Если Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РегистрацияВНалоговомОргане] = Неопределено Тогда
            Проводка.СубконтоДт.Вставить(
                ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РегистрацияВНалоговомОргане,
                Справочники.РегистрацииВНалоговомОргане.ПустаяСсылка()
            );
            Модифицирован = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Если Модифицирован Тогда
    НаборЗаписей.Записать();
КонецЕсли;

Способ 4. Реструктуризация через выгрузку в файловый режим

Если штатное тестирование и исправление на сервере SQL завершается с ошибкой построения уникального индекса, обойдем ограничение через временную смену формата базы:

  1. В Конфигураторе выгрузим информационную базу в файл выгрузки (.dt).
  2. Создадим пустую файловую базу и загрузим в нее полученный файл. Механизм пересчета итогов в файловой СУБД обрабатывает агрегаты иначе и не падает на уникальных индексах MS SQL.
  3. В файловой базе выполним полное тестирование и исправление с флажками Реиндексация таблиц информационной базы и Пересчет итогов.
  4. Выгрузим исправленную базу обратно в .dt и восстановим ее на SQL-сервере.
← На главную