При проведении документов (например, «Уведомление об исчисленных суммах налогов») пользователи и администраторы могут столкнуться с аварийным завершением транзакции. СУБД возвращает критическую ошибку: «Нарушено условие уникальности данных. Попытка вставки неуникального значения в уникальный индекс: Cannot insert duplicate key row in object 'dbo._AccRgAT...' with unique index '...'».
Разберем природу этой ошибки, выясним, почему она возникает в таблицах итогов регистра бухгалтерии, и рассмотрим пошаговые методы устранения сбоя.
Проанализируем текст диагностического сообщения, чтобы точно локализовать проблему:
dbo._AccRgAT...): префикс _AccRgAT указывает на то, что сбой произошел в таблице итогов по субконто регистра бухгалтерии. Если у плана счетов включен учет по нескольким субконто, платформа создает отдельные таблицы агрегатов для каждого уровня аналитики (по первому, второму и третьему субконто). В данном случае сбой зафиксирован в таблице итогов второго субконто.4023-05-01 00:00:00. Платформа 1С:Предприятие при работе с Microsoft SQL Server использует внутреннее смещение дат на 2000 лет вперед. Это означает, что реальная дата учетной записи — 01.05.2023. Таблицы итогов регистра бухгалтерии хранят срез на начало календарного месяца, следовательно, коллизия возникла в проводках за май 2023 года.0. Это поле разделителя итогов (_Splitter), используемое платформой для оптимизации параллельной записи движений.NULL в ключе: наличие полей <NULL> в уникальном индексе часто свидетельствует о том, что при реструктуризации или изменении состава видов субконто старые записи не получили пустые ссылки требуемого типа, либо в движениях регистра возникли некорректные пустые аналитики.Это самый быстрый и безопасный способ, не требующий прямого вмешательства в структуру базы данных средствами СУБД. Суть метода заключается во временном отключении механизма расчета итогов, что позволяет беспрепятственно перезаписать движения документа без проверки уникальности в агрегатных таблицах.
Разберем по шагам порядок действий в режиме 1С:Предприятие:
Журнал проводок (бухгалтерский и налоговый учет) (основной регистр бухгалтерии конфигурации) и выделим его курсором.Если отключение итогов в интерфейсе не помогло или расчет зависает из-за уже накопленных поврежденных записей, применим очистку сбойной таблицы на уровне SQL Server. Таблицы _AccRgAT... содержат только вторичные вычисленные итоги, в них нет первичных учетных документов, поэтому их очистка безопасна при условии последующего пересчета.
Важно: перед выполнением любых операций на уровне СУБД обязательно создадим полную резервную копию информационной базы.
Выполним процедуру восстановления:
SQL Server Management Studio (SSMS) и подключимся к нашему серверу баз данных.
TRUNCATE TABLE dbo._AccRgAT237622;
Платформа заново рассчитает обороты и остатки по всем субконто на основе фактических записей журнала проводок, заполнив очищенную таблицу корректными уникальными строками.
Часто причиной коллизии становится некорректное заполнение аналитики внутри проводки, например, когда в одном наборе записей счета (в частности, 68.01 «НДФЛ при исполнении обязанностей налогового агента») происходит задвоение субконто Регистрация в налоговом органе.
Проанализируем движения за спорный месяц (май 2023 года) с помощью консоли запросов или внешней обработки. Если в поле субконто вместо системной пустой ссылки записано значение NULL (или Неопределено), исправим его программно:
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Дата("20230501000000"));
// Устанавливаем необходимые отборы по регистратору или счету
НаборЗаписей.Прочитать();
Модифицирован = Ложь;
Для Каждого Проводка Из НаборЗаписей Цикл
Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НДФЛ Тогда
// Проверяем заполнение субконто и устраняем некорректные значения
Если Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РегистрацияВНалоговомОргане] = Неопределено Тогда
Проводка.СубконтоДт.Вставить(
ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РегистрацияВНалоговомОргане,
Справочники.РегистрацииВНалоговомОргане.ПустаяСсылка()
);
Модифицирован = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Модифицирован Тогда
НаборЗаписей.Записать();
КонецЕсли;
Если штатное тестирование и исправление на сервере SQL завершается с ошибкой построения уникального индекса, обойдем ограничение через временную смену формата базы:
.dt)..dt и восстановим ее на SQL-сервере.