Почему задваиваются сотрудники в кадровых отчетах 1С:ЗУП 3.1 и как очистить регистр «Состояния сотрудников»?

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

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

Суть проблемы и механизм возникновения дублей

Проанализируем ситуацию на конкретном примере. Предположим, мы берем сотрудника и проводим на него документ отсутствия (например, отпуск или больничный), а затем по какой-то причине сразу же отменяем проведение этого документа. В результате в системе происходит сбой алгоритмов записи: в регистре сведений СостоянияСотрудников формируются две одинаковые записи по этому сотруднику с состоянием «Работа» и открытым периодом «До».

Выясним дополнительную закономерность: чаще всего массовые дубли со статусом «Работа» формируются в том случае, если кадровые документы приходятся на переходный период между годами (например, начало отсутствия в декабре одного года, а окончание — в январе следующего). Чаще всего фантомные записи зависают на дату 1 января (например, на 01.01.2021), но иногда встречаются и на другие даты.

Поскольку кадровые отчеты при построении обращаются к данным этого регистра сведений, наличие двух действующих записей о состоянии «Работа» на один и тот же период приводит к тому, что в отчете сотрудник выводится дважды.

Почему простое обновление конфигурации не решает проблему?

Разработчики фирмы 1С признали данное поведение ошибочным (зарегистрирована ошибка под кодом 000103489). Начиная с релиза 3.1.14.394, ошибка была исправлена. В частности, программисты 1С подправили процедуру ОбновитьСостоянияСотрудников() общего модуля СостоянияСотрудников.

Однако посмотрим на ситуацию после обновления: вы успешно обновили базу, все регламентные задания отработали штатно, но задвоения в отчетах никуда не исчезли! Почему так происходит? Дело в том, что установка нового релиза устраняет только причину появления новых дублей. Обновление конфигурации не производит автоматическую реструктуризацию или очистку уже испорченных исторических данных. Если в регистре уже зависли две записи за прошлые периоды, они там и останутся. Вычищать регистр необходимо самостоятельно постфактум. Рассмотрим подробнее, как именно это можно сделать.

Способ 1: Использование официальной внешней обработки от 1С

Для исправления исторических данных разработчики 1С выпустили специальную внешнюю обработку. Обычно она распространяется под названием «Обновить состояния сотрудников».

Данная обработка автоматически анализирует записи регистра сведений СостоянияСотрудников, сопоставляет их с первичными документами и регистром ДанныеСостоянийСотрудников, находит некорректные задвоенные записи и аккуратно удаляет их из базы. Это самый безопасный и рекомендуемый способ, если вы имеете доступ к партнерским материалам 1С или линии консультаций, где можно запросить этот файл.

Способ 2: Ручная очистка регистра программистом

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

  1. Откроем регистр сведений СостоянияСотрудников через функцию "Функции для технического специалиста".
  2. Настроим отбор по проблемному сотруднику, по которому наблюдаются дубли в отчетах.
  3. Проанализируем записи. Мы увидим, что на одну и ту же дату (чаще всего 1 января) присутствуют две записи с состоянием «Работа».
  4. Для уверенности посмотрим регистр сведений ДанныеСостоянийСотрудников — именно он является основанием, по которому строятся итоговые состояния.
  5. Удалим лишнюю (дублирующую) запись из регистра СостоянияСотрудников с помощью стандартных команд удаления или с использованием универсальной обработки изменения данных. Сразу после удаления фантомной записи отчеты начнут формироваться корректно.

Важно: Будьте осторожны при ручном удалении записей. Если сотр был уволен в течение прошлого года, а с 1 января ему ошибочно "воткнуло" состояние «Работа», эту запись также необходимо удалить, иначе уволенный человек будет числиться работающим.

Способ 3: Лайфхак по исправлению без программирования

Рассмотрим очень элегантный и рабочий способ массово очистить регистр от дублей без использования внешних обработок, прямого редактирования таблиц и написания кода. Этот метод использует сами механизмы 1С для пересчета регистра. Разберем по шагам:

  1. Создадим в программе новый документ «Отсутствие (болезнь, прогул, неявка)».
  2. Подберем в табличную часть этого документа сразу всех сотрудников базы (или только тех, по кому выявлена проблема задвоения).
  3. Укажем период отсутствия для всех подобранных сотрудников строго на ту дату, на которую зависли дубли (например, с 01.01.2021 по 01.01.2021).
  4. Проведем этот документ.
  5. Сразу же после проведения нажмем кнопку «Отменить проведение» (или пометим документ на удаление).

Что при этом происходит "под капотом"? В момент проведения документа типовые алгоритмы 1С принудительно пересчитывают записи в проблемном регистре СостоянияСотрудников на указанную дату для всех выбранных людей. При отмене проведения алгоритм снова пересчитывает данные, но уже по исправленным правилам обновленного релиза. В результате этого действия лишние строки состояния «Работа» исчезают автоматически, структура данных восстанавливается, а кадровые отчеты приходят в норму.

← На главную