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