При оформлении документа «Увольнение» в программе 1С:Зарплата и управление персоналом 3.1 пользователи нередко сталкиваются с труднообъяснимой ошибкой: «Запись с такими ключевыми полями существует! : ПлановыеНачисления: ...». Ситуация осложняется тем, что при визуальном осмотре регистра сведений Плановые начисления никаких дублей не обнаруживается. В этой статье мы подробно разберем, почему возникает этот программный конфликт, как его диагностировать с помощью отладчика и какие существуют методы решения — от радикальных до штатных.
Разберем ситуацию: при проведении документа система сообщает о дублировании записи по конкретному сотруднику и начислению (например, Северная надбавка). При этом в основном регистре Плановые начисления записей может быть всего три, а ошибка указывает на номер строки 4. Проанализируем, откуда берется эта «невидимая» запись.
Основная причина кроется в архитектурных особенностях ЗУП 3.1. Для ускорения расчетов в программе используются вспомогательные интервальные регистры. Если обычный регистр Плановые начисления хранит только сведения о том, что с определенной даты назначено начисление, то интервальный регистр (например, ПлановыеНачисленияИнтервальный) хранит четкие периоды «С» и «По».
Чаще всего такие сбои происходят в следующих случаях:
Перенос данных. Механизмы формирования интервалов могут отработать некорректно, создавая «битые» периоды.Рассмотрим, как увидеть ту самую «четвертую запись», которой нет в основном регистре. Для этого программисту необходимо зайти в процедуру проведения документа и исследовать переменную НаборыИсточникиВторичныхДанных.
Посмотрим на пример того, как данные попадают в набор записей в момент проведения:
// Фрагмент кода, где формируется набор данных для записи
Набор = НаборыИсточникиВторичныхДанных.Добавить();
Набор.ИмяРегистра = "ПлановыеНачисления";
// В этот момент в "Набор" попадают текущие данные из БД
// и новые данные, генерируемые документом Увольнение.
// Если в БД есть скрытый "кривой" интервал,
// возникнет конфликт ключей при фиксации транзакции.
В отладчике можно заметить, что в коллекции записей появляется строка, ссылающаяся на старый документ (например, Кадровый перевод), который вы уже пробовали распроводить или удалять. Это явный признак того, что данные «застряли» не в основном регистре, а во вспомогательных таблицах интервалов.
Прежде чем прибегать к ручному редактированию таблиц («отбойному молотку»), выясним, есть ли возможность решить проблему стандартными средствами. В современных версиях ЗУП 3.1 предусмотрены механизмы восстановления целостности интервальных данных.
Выполним следующие шаги:
Проанализируем ситуацию с Северной надбавкой. Поскольку это начисление часто зависит от стажа и меняется ступенчато, оно имеет свои особенности в регистре сведений о процентах северных надбавок. Проверьте, нет ли там дублирующих записей на ту же дату, что и в ошибке.
Если штатные обработки не помогают, придется обратиться к редактированию регистра Плановые начисления (интервальный). Выясним причину конфликта через запрос или консоль разработчика.
Посмотрим на алгоритм действий:
Плановые начисления интервальный.Дата начала и Дата окончания. Часто там можно обнаружить записи, которые ссылаются на уже удаленные или пустые документы.Важный момент: Ошибка часто указывает на конкретный номер строки. В интервальном регистре структура данных отличается от обычного среза последних, поэтому именно там «лишняя» запись становится очевидной.
Рассмотрим еще один важный аспект: документ Увольнение может пытаться выполнить перерасчет за прошлые периоды. Проверим наличие записей в регистре Перерасчеты. Если система видит необходимость пересчитать период, в котором данные были перенесены из ЗУП 2.5 некорректно, она столкнется с той же ошибкой записи.
Рекомендуется выполнить следующие действия:
Перенос данных с кодом ПН (Плановые начисления).Увольнение. Иногда достаточно вручную удалить строку с начислением и добавить её заново, чтобы обновить связи объектов.Ситуация, когда «записей в регистре три, а ошибка на четвертой», — это классический признак рассинхронизации основного и интервального регистров 1С:ЗУП. В процессе работы мы выяснили, что наиболее эффективным и безопасным методом является использование встроенных обработок по пересчету интервалов. Ручное удаление через редакторы регистров — это крайняя мера, которую стоит применять только после того, как подтверждено, что запись в интервальном регистре является «фантомной» и не имеет под собой реального первичного документа.
Помните, что перед любыми манипуляциями с интервальными регистрами необходимо создавать резервную копию базы данных, так как эти таблицы критически важны для корректного расчета заработной платы и формирования отчетности.