При работе в 1С:ERP Управление предприятием (особенно версий линейки 2.4) пользователи и администраторы часто сталкиваются с критической ошибкой «Запись с такими ключевыми полями существует». Ситуация осложняется тем, что ошибка возникает «плавающим» образом: при ручном проведении одного документа она может не проявиться, но стабильно возникает при работе фоновых заданий или массовом отражении документов в учете. В данной статье мы подробно разберем причины этой проблемы и методы ее «лечения» для двух наиболее уязвимых областей: международного учета и подсистемы оценки производительности.
Рассмотрим ситуацию, когда при проведении документа (например, Списание безналичных денежных средств) система выдает ошибку записи в регистр сведений Отражение документов в международном учете. Проблема часто кроется в изменении даты документа или его перепроведении, когда старые записи в регистре еще не очищены или заблокированы другой транзакцией.
Выясним основные причины:
Записать(Ложь), 1С пытается добавить записи к существующим, что и приводит к ошибке, если набор по данному регистратору не был предварительно очищен.Разберем по шагам, как исправить ситуацию в коде:
Проанализируем общий модуль МеждународныйУчетПроведениеСервер. Одной из рекомендаций является принудительная очистка записей перед их записью. Вместо добавления новых строк в существующий набор, следует использовать полное замещение:
// Вместо:
НаборЗаписей.Записать(Ложь);
// Рекомендуется использовать:
НаборЗаписей.Записать(Истина);
// Параметр Истина указывает на необходимость замещения всех существующих записей по данному фильтру
Также стоит проверить регистр сведений Очередь документов к отражению в международном учете. Если там скопилось огромное количество дублирующихся ссылок на один и тот же документ, это верный признак того, что подписки на события в вашей «дописанной» конфигурации работают некорректно.
Вторая частая точка возникновения ошибки — регистр Замеры времени, входящий в состав БСП (библиотеки стандартных подсистем) для оценки производительности. Ошибка выглядит следующим образом: Запись с такими ключевыми полями существует! : ЗамерыВремени: [НаименованиеОперации], [Время], [Пользователь].
Проанализируем причины конфликта:
ТекущаяУниверсальнаяДатаВМиллисекундах, которая на высокопроизводительных серверах могла выдавать идентичные значения для идущих подряд операций.Замеры времени неизбежно вступают в конфликт с уже существующими.Рассмотрим алгоритм решения:
Если проблема возникает в «немного дописанной» ERP, велика вероятность, что внесенные изменения нарушили целостность транзакций. Проанализируем ситуацию с точки зрения инфраструктуры.
Рассмотрим комплексные меры:
ПриЗаписи и ОбработкаПроведения. Вероятно, запись одного объекта вызывает циклическую перезапись множества связанных документов.Пример кода для программной очистки проблемного набора записей:
Если конкретный документ «завис» и не дает себя провести из-за ошибки в международном учете, можно воспользоваться следующим методом для принудительной очистки перед повторной попыткой:
Процедура ОчиститьЗаписиРегистра(ДокументСсылка)
Набор = РегистрыСведений.ОтражениеДокументовВМеждународномУчете.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
Если Набор.Количество() > 0 Тогда
Набор.Очистить();
Набор.Записать(Истина);
Сообщить("Старые записи успешно удалены для: " + ДокументСсылка);
КонецЕсли;
КонецПроцедуры
Подводя итог, отметим: ошибка «Запись с такими ключевыми полями существует» в ERP — это чаще всего признак архитектурного конфликта, вызванного либо слишком высокой скоростью выполнения операций (для замеров времени), либо нарушением логики транзакций при многопоточной обработке данных. Тщательный аудит кода отражения и обновление платформы являются наиболее эффективными способами решения данной проблемы.