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

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

При работе в программе 1С:Зарплата и управление персоналом 3.1 пользователи и администраторы часто сталкиваются с ситуацией, когда необходимо зарегистрировать несколько кадровых событий в течение одного рабочего дня. Одной из самых проблемных комбинаций является оформление документа Кадровый перевод и документа Отсутствие (болезнь, прогул, неявка) (или Прогул, неявка) на одну и ту же дату. При попытке проведения второго документа система выдает критическую ошибку: «Запись с такими ключевыми полями существует! : ЗанятостьПозицийШтатногоРасписания».

В этой статье мы подробно разберем, почему возникает этот конфликт, как работает внутренний механизм распределения времени в ЗУП и какие шаги необходимо предпринять для успешного проведения документов.

Разберем причину возникновения ошибки

Чтобы понять природу ошибки, проанализируем работу регистра сведений Занятость позиций штатного расписания. Этот регистр является периодическим и хранит информацию о том, какой сотрудник какую позицию штатного расписания занимает в конкретный момент времени. Ключевыми полями (уникальным набором данных) здесь являются:

  1. Период (дата и точное время);
  2. Сотрудник;
  3. Позиция штатного расписания;
  4. Организация.

Когда мы проводим Кадровый перевод, система записывает данные в этот регистр, обычно на время 00:00:00. Если в этот же день мы пытаемся провести Прогул, который также делает запись в этот регистр (например, при включенной опции освобождения ставки), система снова пытается создать запись на 00:00:00. Поскольку две разные записи с одинаковыми ключевыми полями на один и тот же момент времени существовать не могут, платформа блокирует операцию.

Анализируем механизм «смещения на секунду»

Разработчики 1С предусмотрели этот сценарий. В норме система должна автоматически «разносить» документы по времени внутри одной секунды или добавлять одну секунду к последующему документу. Для управления этой очередностью в ЗУП 3.1 используется скрытый служебный регистр сведений — Время регистрации документов плановых начислений.

Рассмотрим, как это работает: когда вы проводите первый документ за день, система фиксирует его время как 00:00:00 и записывает это в служебный регистр. При проведении второго документа система сверяется с этим регистром и назначает новому документу время 00:00:01 (или смещение в 61 секунду в некоторых версиях конфигурации). Это позволяет избежать конфликта в ЗанятостьПозицийШтатногоРасписания.

Однако в ситуациях с синхронизацией данных (обмен между базами) или при программном переносе документов записи в регистре Время регистрации документов плановых начислений могут не создаваться автоматически. Именно это мы видим в сообщении №6 темы форума: в базе-приемнике отсутствует техническая запись о времени, из-за чего оба документа «стучатся» в одну и ту же секунду.

Решение 1: Отключение флага «Освобождать ставку»

Самый простой и быстрый способ решить проблему, если вам не нужно искать замену сотруднику на время его прогула — это изменить настройки самого документа отсутствия. Посмотрим на алгоритм действий:

  1. Откроем документ Отсутствие (болезнь, прогул, неявка) или Прогул, неявка.
  2. Перейдем на вкладку Главное.
  3. Найдем флаг Освобождать ставку на период отсутствия.
  4. Снимем этот флаг и попробуем провести документ.

Почему это помогает? Когда флаг снят, документ перестает делать записи в регистр Занятость позиций штатного расписания, так как за сотрудником сохраняется его рабочее место в штатке. Конфликт ключевых полей исчезает, так как теперь только один документ (перевод) претендует на запись в этот регистр.

Решение 2: Исправление последовательности при синхронизации (для программистов)

Если проблема возникла в базе-приемнике после обмена данными, необходимо восстановить записи в служебном регистре. Рассмотрим программный подход или использование групповой обработки:

Выясним причину: документ Отсутствие не создал запись в регистре ВремяРегистрацииДокументовПлановыхНачислений. Чтобы исправить это, можно воспользоваться обработкой «Групповое изменение реквизитов»:

  1. Выберите документы Кадровый перевод и Отсутствие за проблемную дату.
  2. Выполните фиктивное изменение (например, перезапишите комментарий) с включенной настройкой «Проводить в транзакции». Это заставит систему вызвать обработчик проведения заново, что может инициировать заполнение служебных регистров.
  3. Если это не помогает, необходимо программно создать запись в регистре сведений ВремяРегистрацииДокументовПлановыхНачислений для одного из документов, указав смещение.
    
    // Пример логики для понимания структуры записи (схематично)
    МенеджерЗаписи = РегистрыСведений.ВремяРегистрацииДокументовПлановыхНачислений.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Документ = СсылкаНаПрогул;
    МенеджерЗаписи.ДатаРегистрации = НачалоДня(ДатаДокумента) + 1; // Добавляем 1 секунду
    МенеджерЗаписи.Записать();
    

    Решение 3: Использование документа «Табель»

    Если кадровые документы категорически отказываются проводиться в один день (например, из-за сложных настроек истории штатного расписания), проанализируем альтернативный вариант регистрации прогула через Табель учета рабочего времени:

    1. Убедимся, что Кадровый перевод проведен.
    2. Вместо документа Прогул, создадим документ Табель за соответствующий месяц.
    3. Вручную укажем код ПР (прогул) или НН (неявка по невыясненным причинам) в ячейке за нужное число.

    Этот способ позволит корректно рассчитать заработную плату (уменьшить оплату за дни прогула), не создавая движений в регистре занятости позиций. Однако помните, что в этом случае прогул не будет зафиксирован как кадровое событие для отчетов по стажу, если это критично.

    Решение 4: Порядок проведения «Отмена — Проведение»

    Иногда помогает строгое соблюдение последовательности интерактивных действий. Попробуем выполнить следующие шаги:

    1. Распроведем оба документа (и перевод, и прогул).
    2. Сначала проведем Кадровый перевод. Убедимся, что он записался.
    3. Затем откроем Прогул и попробуем его провести.
    4. Если ошибка сохраняется, попробуем изменить время документов вручную через форму списка (если это разрешено правами доступа), назначив переводу 00:00:00, а прогулу 00:00:05.

    Резюме и рекомендации

    Основная сложность заключается в том, что ЗУП 3.1 жестко контролирует уникальность записей в штатном расписании. Для стабильной работы рекомендуем:

    • Всегда проверять, действительно ли нужно освобождать ставку при кратковременных прогулах. Чаще всего эта галочка не требуется.
    • При возникновении ошибок после обмена данными в первую очередь проверять наличие записей в регистре Время регистрации документов плановых начислений.
    • Следить за тем, чтобы Кадровый перевод логически предшествовал отсутствию, если они происходят в один день, чтобы система понимала, в каком подразделении сотрудник совершил прогул.
← На главную