Почему в документе "Включение в кадровый резерв" отображается некорректная дата приема 31.12.1899 и как это исправить?

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

В конфигурации 1С:Зарплата и Управление Персоналом КОРП (редакция 3.1) пользователи могут столкнуться с неприятной ситуацией при работе с кадровым резервом. При заполнении документа Включение в кадровый резерв, в разделе сведений "Работа в компании", дата приема сотрудника может отображаться как 31.12.1899.

Чаще всего эта ошибка проявляется у сотрудников, данные по которым были перенесены из предыдущих исторических систем (например, из 1С:УПП или ЗУП 2.5) с помощью документа "Начальная штатная расстановка", а не полноценными кадровыми приказами.

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

Диагностика проблемы

Прежде чем приступать к исправлению, давайте разберемся, откуда берется эта дата. При просмотре карточки сотрудника в справочнике ФизическиеЛица на вкладке "История работы" данные могут отображаться корректно. Однако документ резерва "тянет" информацию из других источников.

Основным источником проблемы является механизм хранения исторических данных. Глобальный поиск по конфигурации показывает наличие функции ДатаОтсчетаПериодическихСведений, которая возвращает значение '18991231000000'. Это техническая "нулевая" дата для многих механизмов платформы.

В документе "Начальная штатная расстановка" существует алгоритм, который при формировании записей в регистр сведений ДанныеСостоянийСотрудников может заполнять дату начала именно этим значением, если не удается однозначно определить дату приема для конкретного состояния.


// Пример логики заполнения (упрощенно)
НаборЗаписей = РегистрыСведений.ДанныеСостоянийСотрудников.СоздатьНаборЗаписей;
...
Для Каждого Запись Из НаборЗаписей Цикл
    Запись.Начало = ДатаОтсчетаПериодическихСведений; // Здесь присваивается 31.12.1899
КонецЦикла;

Именно эти записи впоследствии анализируются при сборе данных для документа ВключениеВКадровыйРезерв.

Решение проблемы: создание расширения

Поскольку проблема носит комплексный характер (некорректные данные в выборке и некорректные записи в интервальном регистре), мы применим комбинированный подход. Исправление потребует вмешательства в код через механизм расширений.

Разделим решение на два этапа: программная фильтрация некорректных дат при подборе и корректировка данных в регистре.

Этап 1. Фильтрация "мусорных" дат в коде документа

Нам необходимо вмешаться в процесс получения кадровой истории. В документе ВключениеВКадровыйРезерв за формирование данных отвечает функция, связанная с получением кадровой истории (обычно это КадроваяИсторияДанныеСотрудников или аналогичная процедура заполнения, в зависимости от точного релиза конфигурации).

Мы добавим в расширение этот метод и внедрим проверку, которая будет игнорировать записи с датой 31.12.1899. Это позволит убрать из табличной части "Работа в компании" технические записи, не несущие смысла.

Рассмотрим пример кода, который необходимо добавить в цикл обхода выборки детальных записей:


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

Этот код позволяет исключить попадание строк с датой 1899 года в коллекцию РабочиеМестаСотрудников, которая затем отображается на форме.

Этап 2. Исправление данных в регистре сведений

Даже после применения фильтра, само поле "Дата приема" в документе может оставаться некорректным, если оно подтягивается не из вычисленной выборки, а напрямую из регистра сведений. В ЗУП 3.1 за быстрое получение данных часто отвечает служебный регистр КадроваяИсторияСотрудниковИнтервальный.

Важный момент: данный регистр является вспомогательным и обычно закрыт для интерактивного редактирования пользователем. Однако именно в нем могут "застрять" некорректные даты периодов действия.

Чтобы исправить дату приема окончательно, нам необходимо отредактировать запись в этом регистре. Сделаем это также через расширение:

  1. В созданное ранее расширение добавьте регистр сведений КадроваяИсторияСотрудниковИнтервальный.
  2. Для этого регистра в расширении создайте управляемую форму записи и форму списка (автоматически, через конструктор).
  3. После применения расширения вы сможете открыть этот регистр через меню "Функции для технического специалиста" (или "Все функции").
  4. Найдите записи по проблемному сотруднику, где в поле Период или ДатаПриема стоит 31.12.1899.
  5. Вручную скорректируйте дату на реальную дату приема сотрудника.
  6. Запишите изменения.

После выполнения этих действий, при перезаполнении или открытии документа ВключениеВКадровыйРезерв, программа считает из регистра КадроваяИсторияСотрудниковИнтервальный уже корректную актуальную дату приема.

Альтернативные способы (без расширений)

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

Резюме

Проблема с датой 31.12.1899 в документе "Включение в резерв" возникает из-за особенностей миграции данных и работы служебных алгоритмов ЗУП 3.1. Для полного решения рекомендуется комплексный подход: программное исключение технических записей из выборки рабочих мест (через код расширения) и прямая корректировка интервального регистра сведений для исправления основной даты приема.

← На главную