При оформлении кадровых документов в программных продуктах семейства «1С:Предприятие 8» пользователи периодически сталкиваются с неприятной ошибкой СУБД: «Запись с такими ключевыми полями существует!». Особенно часто эта проблема проявляется при проведении документов Исключение из списков части (ведомственный аналог документа Увольнение) в специализированных конфигурациях, таких как «1С:Витязь» или «1С:Зарплата и кадры государственного учреждения» (ЗГУ).
В этой статье мы подробно разберем, почему возникает данная ошибка, проанализируем внутренние механизмы работы платформы 1С с регистрами сведений и рассмотрим пошаговые сценарии решения этой проблемы — от официального обновления до практических обходных путей без изменения конфигурации.
Для начала проанализируем специфику программной среды. Подсистема «Витязь» — это специализированное ведомственное решение, разработанное на базе типовой конфигурации 1С:Зарплата и кадры государственного учреждения (редакция 3.1). Она используется для автоматизации кадрового учета и расчета денежного довольствия в силовых ведомствах (в частности, в Росгвардии).
Поскольку «Витязь» функционирует на ядре ЗГУ, практически все системные изменения, обновления расчетных механизмов и, к сожалению, программные ошибки типового решения автоматически наследуются ведомственной базой. Ошибка с дублированием ключевых записей при увольнении — яркий тому пример.
Чтобы понять, почему система выдает сообщение о существовании аналогичной записи, обратимся к структуре хранения данных в 1С. Учет плановых начислений военнослужащих и сотрудников (таких как оклады по должности, званию, надбавки за секретность, выслугу лет и др.) ведется в периодических регистрах сведений:
ПлановыеНачисления — хранит историю изменения начислений.ПлановыеНачисленияИнтервальный — служебный интервальный регистр, оптимизирующий расчеты в программе.Когда мы проводим документ Исключение из списков части, программа должна автоматически закрыть все действующие плановые начисления сотрудника на дату исключения. Для этого в регистры сведений записываются новые строки, где в качестве даты окончания действия начислений устанавливается день увольнения.
В релизах ветки 3.1.12 разработчики 1С кардинально обновили механизмы формирования движений в интервальных регистрах. При определенных сценариях (например, когда сотрудник увольняется сразу после длительного отпуска) алгоритм проведения документа давал сбой. Программа пыталась дважды записать одну и ту же информацию по плановым начислениям на одну и ту же дату. Платформа 1С, обнаружив попытку создания дублирующей строки с идентичным набором ключевых полей (Сотрудник, Начисление, Дата начала интервала), блокировала транзакцию и возвращала ошибку СУБД.
---
Проблема носит исключительно программный характер и связана с несовершенством кода проведения документов в релизах линейки 3.1.12. Ошибка была официально признана разработчиками 1С и полностью устранена в последующих обновлениях.
Решение: Обновите конфигурацию «1С:Зарплата и кадры государственного учреждения» (или ведомственную подсистему «Витязь») до актуального релиза ветки 3.1.13 или выше. После обновления структуры метаданных и обновления кода проведения документов повторно откройте проблемный документ Исключение из списков части, пересчитайте его и проведите. Документ запишется без ошибок.
---
В закрытых ведомственных сетях и на секретных объектах оперативное обновление программного обеспечения часто невозможно из-за длительных процедур согласования. В таком случае мы можем воспользоваться альтернативными методиками исправления данных непосредственно в пользовательском режиме.
Выясним, какие именно записи мешают проведению кадрового документа. Для этого выполним рекогносцировку в регистрах:
Плановые начисления интервальный.В рассматриваемой ситуации военнослужащий увольняется сразу после отпуска (отпуск заканчивается 22.02.2020, а исключение из списков происходит 25.02.2020). Подобное наложение периодов часто путает автоматические механизмы вытеснения времени.
Попробуем восстановить чистую последовательность проведения документов:
Отпуск за февраль по данному сотруднику.Исключение из списков части, снимем его с проведения (если он был частично записан), очистим табличные части расчета и заполним их заново.Исключение из списков части. Без проведенного ранее отпуска расчетные регистры должны записаться корректно.Отпуск и заново проведем его. Программа автоматически скорректирует пересекающиеся периоды.Если алгоритм автоматического увольнения все равно двоит записи при попытке прекратить плановые начисления, мы можем «облегчить» ему задачу и закрыть их вручную предварительно:
Изменение плановых начислений (находится в разделе «Зарплата» или «Кадры»).Исключение из списков части от 25.02.2020 и проведем его. Поскольку начисления уже прекращены предыдущим документом, алгоритм проведения исключения не будет пытаться повторно записать строки прекращения в регистр ПлановыеНачисленияИнтервальный, и ошибка уникальности ключей не возникнет.Иногда в базе данных могут оставаться так называемые «битые» ссылки или скрытые записи в табелях учета рабочего времени и начислениях за будущие периоды, которые блокируют проведение увольнения. Выполним следующие действия:
Начисление зарплаты и взносов за текущий месяц (февраль) и за последующий (март). Если в мартовских документах начисления или табелях данный сотрудник уже присутствует, полностью удалим его из табличных частей этих документов.Исключение из списков части на удаление.Исключение из списков части с чистого листа.Используя предложенные инструкции, вы гарантированно решите проблему с проведением кадровых документов увольнения и исключения из списков части, восстановив корректный кадровый и расчетный учет в вашей организации.