В конфигурации 1С:Зарплата и Управление Персоналом КОРП (редакция 3.1) пользователи могут столкнуться с неприятной ситуацией при работе с кадровым резервом. При заполнении документа Включение в кадровый резерв, в разделе сведений "Работа в компании", дата приема сотрудника может отображаться как 31.12.1899.
Чаще всего эта ошибка проявляется у сотрудников, данные по которым были перенесены из предыдущих исторических систем (например, из 1С:УПП или ЗУП 2.5) с помощью документа "Начальная штатная расстановка", а не полноценными кадровыми приказами.
В этой статье мы подробно разберем технические причины возникновения этой даты, проанализируем алгоритмы программы и рассмотрим проверенное решение, позволяющее исправить ситуацию с помощью расширения конфигурации.
Прежде чем приступать к исправлению, давайте разберемся, откуда берется эта дата. При просмотре карточки сотрудника в справочнике ФизическиеЛица на вкладке "История работы" данные могут отображаться корректно. Однако документ резерва "тянет" информацию из других источников.
Основным источником проблемы является механизм хранения исторических данных. Глобальный поиск по конфигурации показывает наличие функции ДатаОтсчетаПериодическихСведений, которая возвращает значение '18991231000000'. Это техническая "нулевая" дата для многих механизмов платформы.
В документе "Начальная штатная расстановка" существует алгоритм, который при формировании записей в регистр сведений ДанныеСостоянийСотрудников может заполнять дату начала именно этим значением, если не удается однозначно определить дату приема для конкретного состояния.
// Пример логики заполнения (упрощенно)
НаборЗаписей = РегистрыСведений.ДанныеСостоянийСотрудников.СоздатьНаборЗаписей;
...
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Начало = ДатаОтсчетаПериодическихСведений; // Здесь присваивается 31.12.1899
КонецЦикла;
Именно эти записи впоследствии анализируются при сборе данных для документа ВключениеВКадровыйРезерв.
Поскольку проблема носит комплексный характер (некорректные данные в выборке и некорректные записи в интервальном регистре), мы применим комбинированный подход. Исправление потребует вмешательства в код через механизм расширений.
Разделим решение на два этапа: программная фильтрация некорректных дат при подборе и корректировка данных в регистре.
Нам необходимо вмешаться в процесс получения кадровой истории. В документе ВключениеВКадровыйРезерв за формирование данных отвечает функция, связанная с получением кадровой истории (обычно это КадроваяИсторияДанныеСотрудников или аналогичная процедура заполнения, в зависимости от точного релиза конфигурации).
Мы добавим в расширение этот метод и внедрим проверку, которая будет игнорировать записи с датой 31.12.1899. Это позволит убрать из табличной части "Работа в компании" технические записи, не несущие смысла.
Рассмотрим пример кода, который необходимо добавить в цикл обхода выборки детальных записей:
// В расширении, в процедуре заполнения или получения данных:
Пока ВыборкаСотрудники.Следующий() Цикл
МассивРабочихМест = Новый Массив;
ВыборкаДетальныеЗаписи = ВыборкаСотрудники.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() И МассивРабочихМест.Количество() < 3 Цикл
// Проверяем, не равна ли дата записи технической дате 31.12.1899
// Учитываем возможные варианты времени (00:00:00, 00:00:10 и т.д.)
Если ВыборкаДетальныеЗаписи.ПериодЗаписи = '18991231000000'
Или ВыборкаДетальныеЗаписи.ПериодЗаписи = '18991231000010'
Или ВыборкаДетальныеЗаписи.ПериодЗаписи = '18991231000030' Тогда
// Если дата некорректная, просто пропускаем эту итерацию
// или прерываем цикл, если логика требует выхода
Прервать;
Иначе
// Если дата корректная, добавляем данные в массив рабочих мест
МассивРабочихМест.Добавить(Новый Структура("Должность, Подразделение, ПериодЗаписи",
ВыборкаДетальныеЗаписи.Должность,
ВыборкаДетальныеЗаписи.Подразделение,
ВыборкаДетальныеЗаписи.ПериодЗаписи));
КонецЕсли;
КонецЦикла;
// Сохраняем результат обработки для сотрудника
РабочиеМестаСотрудников.Вставить(ВыборкаСотрудники.Сотрудник, МассивРабочихМест);
КонецЦикла;
Этот код позволяет исключить попадание строк с датой 1899 года в коллекцию РабочиеМестаСотрудников, которая затем отображается на форме.
Даже после применения фильтра, само поле "Дата приема" в документе может оставаться некорректным, если оно подтягивается не из вычисленной выборки, а напрямую из регистра сведений. В ЗУП 3.1 за быстрое получение данных часто отвечает служебный регистр КадроваяИсторияСотрудниковИнтервальный.
Важный момент: данный регистр является вспомогательным и обычно закрыт для интерактивного редактирования пользователем. Однако именно в нем могут "застрять" некорректные даты периодов действия.
Чтобы исправить дату приема окончательно, нам необходимо отредактировать запись в этом регистре. Сделаем это также через расширение:
КадроваяИсторияСотрудниковИнтервальный.Период или ДатаПриема стоит 31.12.1899.После выполнения этих действий, при перезаполнении или открытии документа ВключениеВКадровыйРезерв, программа считает из регистра КадроваяИсторияСотрудниковИнтервальный уже корректную актуальную дату приема.
Если у вас нет возможности использовать расширения, можно попробовать штатные инструменты, хотя они не всегда гарантируют результат в случае с "историческими" данными:
ОсновныеДанныеКонтрактаДоговораСотрудника или первичной кадровой истории, указав верную дату. После этого потребуется запустить пересчет итогов.КадроваяИсторияСотрудниковИнтервальный и изменит дату через МенеджерЗаписи.Проблема с датой 31.12.1899 в документе "Включение в резерв" возникает из-за особенностей миграции данных и работы служебных алгоритмов ЗУП 3.1. Для полного решения рекомендуется комплексный подход: программное исключение технических записей из выборки рабочих мест (через код расширения) и прямая корректировка интервального регистра сведений для исправления основной даты приема.