При работе в программе 1С:Зарплата и управление персоналом 3.1 пользователи и администраторы часто сталкиваются с ситуацией, когда необходимо зарегистрировать несколько кадровых событий в течение одного рабочего дня. Одной из самых проблемных комбинаций является оформление документа Кадровый перевод и документа Отсутствие (болезнь, прогул, неявка) (или Прогул, неявка) на одну и ту же дату. При попытке проведения второго документа система выдает критическую ошибку: «Запись с такими ключевыми полями существует! : ЗанятостьПозицийШтатногоРасписания».
В этой статье мы подробно разберем, почему возникает этот конфликт, как работает внутренний механизм распределения времени в ЗУП и какие шаги необходимо предпринять для успешного проведения документов.
Чтобы понять природу ошибки, проанализируем работу регистра сведений Занятость позиций штатного расписания. Этот регистр является периодическим и хранит информацию о том, какой сотрудник какую позицию штатного расписания занимает в конкретный момент времени. Ключевыми полями (уникальным набором данных) здесь являются:
Когда мы проводим Кадровый перевод, система записывает данные в этот регистр, обычно на время 00:00:00. Если в этот же день мы пытаемся провести Прогул, который также делает запись в этот регистр (например, при включенной опции освобождения ставки), система снова пытается создать запись на 00:00:00. Поскольку две разные записи с одинаковыми ключевыми полями на один и тот же момент времени существовать не могут, платформа блокирует операцию.
Разработчики 1С предусмотрели этот сценарий. В норме система должна автоматически «разносить» документы по времени внутри одной секунды или добавлять одну секунду к последующему документу. Для управления этой очередностью в ЗУП 3.1 используется скрытый служебный регистр сведений — Время регистрации документов плановых начислений.
Рассмотрим, как это работает: когда вы проводите первый документ за день, система фиксирует его время как 00:00:00 и записывает это в служебный регистр. При проведении второго документа система сверяется с этим регистром и назначает новому документу время 00:00:01 (или смещение в 61 секунду в некоторых версиях конфигурации). Это позволяет избежать конфликта в ЗанятостьПозицийШтатногоРасписания.
Однако в ситуациях с синхронизацией данных (обмен между базами) или при программном переносе документов записи в регистре Время регистрации документов плановых начислений могут не создаваться автоматически. Именно это мы видим в сообщении №6 темы форума: в базе-приемнике отсутствует техническая запись о времени, из-за чего оба документа «стучатся» в одну и ту же секунду.
Самый простой и быстрый способ решить проблему, если вам не нужно искать замену сотруднику на время его прогула — это изменить настройки самого документа отсутствия. Посмотрим на алгоритм действий:
Отсутствие (болезнь, прогул, неявка) или Прогул, неявка.Почему это помогает? Когда флаг снят, документ перестает делать записи в регистр Занятость позиций штатного расписания, так как за сотрудником сохраняется его рабочее место в штатке. Конфликт ключевых полей исчезает, так как теперь только один документ (перевод) претендует на запись в этот регистр.
Если проблема возникла в базе-приемнике после обмена данными, необходимо восстановить записи в служебном регистре. Рассмотрим программный подход или использование групповой обработки:
Выясним причину: документ Отсутствие не создал запись в регистре ВремяРегистрацииДокументовПлановыхНачислений. Чтобы исправить это, можно воспользоваться обработкой «Групповое изменение реквизитов»:
Кадровый перевод и Отсутствие за проблемную дату.ВремяРегистрацииДокументовПлановыхНачислений для одного из документов, указав смещение.
// Пример логики для понимания структуры записи (схематично)
МенеджерЗаписи = РегистрыСведений.ВремяРегистрацииДокументовПлановыхНачислений.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = СсылкаНаПрогул;
МенеджерЗаписи.ДатаРегистрации = НачалоДня(ДатаДокумента) + 1; // Добавляем 1 секунду
МенеджерЗаписи.Записать();
Если кадровые документы категорически отказываются проводиться в один день (например, из-за сложных настроек истории штатного расписания), проанализируем альтернативный вариант регистрации прогула через Табель учета рабочего времени:
Кадровый перевод проведен.Прогул, создадим документ Табель за соответствующий месяц.Этот способ позволит корректно рассчитать заработную плату (уменьшить оплату за дни прогула), не создавая движений в регистре занятости позиций. Однако помните, что в этом случае прогул не будет зафиксирован как кадровое событие для отчетов по стажу, если это критично.
Иногда помогает строгое соблюдение последовательности интерактивных действий. Попробуем выполнить следующие шаги:
Кадровый перевод. Убедимся, что он записался.Прогул и попробуем его провести.Основная сложность заключается в том, что ЗУП 3.1 жестко контролирует уникальность записей в штатном расписании. Для стабильной работы рекомендуем:
Время регистрации документов плановых начислений.Кадровый перевод логически предшествовал отсутствию, если они происходят в один день, чтобы система понимала, в каком подразделении сотрудник совершил прогул.