Как исправить ошибку «Запись с такими ключевыми полями существует» в 1С:ERP при отражении документов и замере производительности?

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

При работе в 1С:ERP Управление предприятием (особенно версий линейки 2.4) пользователи и администраторы часто сталкиваются с критической ошибкой «Запись с такими ключевыми полями существует». Ситуация осложняется тем, что ошибка возникает «плавающим» образом: при ручном проведении одного документа она может не проявиться, но стабильно возникает при работе фоновых заданий или массовом отражении документов в учете. В данной статье мы подробно разберем причины этой проблемы и методы ее «лечения» для двух наиболее уязвимых областей: международного учета и подсистемы оценки производительности.

Анализ проблемы в регистре «Отражение документов в международном учете»

Рассмотрим ситуацию, когда при проведении документа (например, Списание безналичных денежных средств) система выдает ошибку записи в регистр сведений Отражение документов в международном учете. Проблема часто кроется в изменении даты документа или его перепроведении, когда старые записи в регистре еще не очищены или заблокированы другой транзакцией.

Выясним основные причины:

  1. Конкуренция фоновых заданий: В ERP механизмы отражения в регламентированном и международном учетах работают в многопоточном режиме. Если один поток уже начал обрабатывать документ, а второй пытается сделать то же самое из-за дубля в очереди, возникает конфликт уникальности ключа.
  2. Некорректная очистка набора записей: При программном изменении даты документа система должна сначала удалить записи по старой дате, а затем создать новые. Если в коде используется метод Записать(Ложь), 1С пытается добавить записи к существующим, что и приводит к ошибке, если набор по данному регистратору не был предварительно очищен.
  3. Лавинообразное накопление очереди: Ситуации, когда в очередь на отражение попадает сразу несколько тысяч документов, провоцируют конфликты блокировок, которые платформа иногда интерпретирует как ошибку уникальности записей.

Разберем по шагам, как исправить ситуацию в коде:

Проанализируем общий модуль МеждународныйУчетПроведениеСервер. Одной из рекомендаций является принудительная очистка записей перед их записью. Вместо добавления новых строк в существующий набор, следует использовать полное замещение:


// Вместо:
НаборЗаписей.Записать(Ложь);

// Рекомендуется использовать:
НаборЗаписей.Записать(Истина); 
// Параметр Истина указывает на необходимость замещения всех существующих записей по данному фильтру

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

Устранение ошибки в регистре «Замеры времени»

Вторая частая точка возникновения ошибки — регистр Замеры времени, входящий в состав БСП (библиотеки стандартных подсистем) для оценки производительности. Ошибка выглядит следующим образом: Запись с такими ключевыми полями существует! : ЗамерыВремени: [НаименованиеОперации], [Время], [Пользователь].

Проанализируем причины конфликта:

  1. Ограничение точности времени: Ключевым полем в этом регистре является время начала операции в миллисекундах. Если два действия в рамках одного сеанса происходят быстрее, чем за 1 мс, или системные часы вернули то же значение, возникает дубль ключа.
  2. Баги старых платформ: В платформе 8.3.13 и 8.3.14 была замечена особенность работы функции ТекущаяУниверсальнаяДатаВМиллисекундах, которая на высокопроизводительных серверах могла выдавать идентичные значения для идущих подряд операций.
  3. Синхронизация NTP: Если служба времени на сервере резко корректирует время «назад», даже на сотые доли секунды, записи в регистре Замеры времени неизбежно вступают в конфликт с уже существующими.

Рассмотрим алгоритм решения:

Общие рекомендации по диагностике и лечению

Если проблема возникает в «немного дописанной» ERP, велика вероятность, что внесенные изменения нарушили целостность транзакций. Проанализируем ситуацию с точки зрения инфраструктуры.

Рассмотрим комплексные меры:

  1. Тестирование и исправление (ТиИ): Выполните регламентную процедуру «Тестирование и исправление информационной базы». Обратите особое внимание на пункты «Проверка логической целостности» и «Реиндексация таблиц». Иногда индексы таблиц в SQL-базе могут быть повреждены, что приводит к ложным сообщениям о существовании записей.
  2. Проверка режима блокировок: Убедитесь, что для всех регистров сведений установлен режим Управляемый. Смешанный режим (Автоматический + Управляемый) в одной базе часто приводит к непредсказуемым конфликтам блокировок на уровне СУБД.
  3. Анализ кода «дописок»: Если при проведении одного документа в очередь попадает 4000 других, необходимо проверить все подписки на события ПриЗаписи и ОбработкаПроведения. Вероятно, запись одного объекта вызывает циклическую перезапись множества связанных документов.

Пример кода для программной очистки проблемного набора записей:

Если конкретный документ «завис» и не дает себя провести из-за ошибки в международном учете, можно воспользоваться следующим методом для принудительной очистки перед повторной попыткой:


Процедура ОчиститьЗаписиРегистра(ДокументСсылка)
    Набор = РегистрыСведений.ОтражениеДокументовВМеждународномУчете.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(ДокументСсылка);
    Набор.Прочитать();
    Если Набор.Количество() > 0 Тогда
        Набор.Очистить();
        Набор.Записать(Истина);
        Сообщить("Старые записи успешно удалены для: " + ДокументСсылка);
    КонецЕсли;
КонецПроцедуры

Подводя итог, отметим: ошибка «Запись с такими ключевыми полями существует» в ERP — это чаще всего признак архитектурного конфликта, вызванного либо слишком высокой скоростью выполнения операций (для замеров времени), либо нарушением логики транзакций при многопоточной обработке данных. Тщательный аудит кода отражения и обновление платформы являются наиболее эффективными способами решения данной проблемы.

← На главную