В работе с конфигурациями на базе платформы 1С:Предприятие 8.2 и 8.3 с обычными формами (такими как «Комплексная автоматизация 1.1» или «Зарплата и управление персоналом 2.5») пользователи часто сталкиваются с парадоксальной ситуацией. Документ Увольнение или Перемещение создан и успешно проведен, в движениях по регистрам сведения отражены корректно, однако в отчетах по штатным сотрудникам или в списке справочника данные остаются старыми. Разберем подробно, почему это происходит и как исправить ситуацию, не прибегая к ручному перепроведению каждой карточки.
Проанализируем архитектуру хранения кадровых данных в старых редакциях программ 1С. Для ускорения работы динамических списков и некоторых тяжелых отчетов разработчики применили механизм «зеркалирования». Это означает, что такие важные данные, как ДатаУвольнения, АктуальноеПодразделение и Должность, хранятся одновременно в двух местах:
РаботникиОрганизаций, СостояниеРаботниковОрганизаций). Это первичные данные, которые создаются при проведении документа.СотрудникиОрганизаций. Это вторичные данные, которые должны обновляться автоматически в момент проведения кадрового документа.Проблема заключается в том, что механизм записи в справочник иногда «дает сбой». Это может произойти из-за программных ошибок в релизе конфигурации, при программном проведении документов внешними обработками (если не вызываются штатные процедуры модуля объекта) или при возникновении конфликтов блокировок. В итоге: в регистре запись есть, а в карточке сотрудника поле Дата увольнения пустое. Большинство стандартных списков и отчетов (например, отчет для СЗВ) обращаются именно к реквизиту справочника, поэтому «видят» сотрудника как работающего.
Рассмотрим ситуацию, когда данные в справочнике верны, но отчеты все равно пустуют. В системе 1С многие отчеты строятся на виртуальных таблицах СрезПоследних. Платформа оптимизирует работу с ними, сохраняя рассчитанные итоги в отдельных таблицах базы данных. Иногда (особенно при интенсивной многопользовательской работе или после некорректного завершения работы сервера) актуальные итоги «зависают».
В этом случае физическая запись в таблице регистрации существует, но виртуальная таблица её игнорирует до тех пор, пока не произойдет пересчет итогов или повторная запись, инициирующая обновление конкретной ветки индекса. Выясним причину через консоль запросов: если прямой запрос к физической таблице регистра возвращает данные, а запрос к СрезПоследних — нет, значит, проблема в итогах.
Посмотрим на пример того, как быстро выявить сотрудников, по которым данные разошлись. Мы можем воспользоваться стандартным отчетом «Штатные сотрудники» или построить небольшой запрос. В отчете необходимо установить следующие фильтры:
Состояние — Равно — УволенДата увольнения — Равно — [Пустая дата]Если в результат попали сотрудники, значит, налицо программный сбой обновления справочника. Для программной диагностики проанализируем ситуацию с помощью запроса в консоли:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Код КАК Код,
Сотрудники.ДатаУвольнения КАК ДатаВКарточке,
Состояния.Период КАК ДатаВРегистре
ИЗ
Справочник.СотрудникиОрганизаций КАК Сотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботниковОрганизаций.СрезПоследних(&Период) КАК Состояния
ПО Сотрудники.Ссылка = Состояния.Сотрудник
ГДЕ
Состояния.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаботникаОрганизации.Уволен)
И Сотрудники.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
Этот запрос выведет всех, кто фактически уволен по регистру, но в справочнике числится работающим. Аналогично можно проверить перемещения, сравнивая актуальное подразделение в справочнике и в регистре РаботникиОрганизаций.
Разберем по шагам, что нужно сделать для исправления данных и предотвращения подобных ошибок в будущем.
Шаг 1: Групповое перепроведение документов
Самый простой и эффективный метод «лечения» — заставить систему заново выполнить программный код обновления реквизитов. Для этого не нужно заходить в каждого сотрудника. Используйте инструмент Групповая обработка справочников и документов. Выберите документы Увольнение из организаций и Кадровое перемещение организаций за проблемный период и выполните действие «Установить статус: Проведен» (перепровести).
Шаг 2: Управление итогами и тестирование базы
Если перепроведение не помогло, необходимо проверить целостность базы данных. Выполните следующие действия (обязательно на копии базы!):
Операции — Управление итогами и убедитесь, что итоги установлены на актуальную дату (обычно это конец текущего месяца).Тестирование и исправление. Установите галочки:
Шаг 3: Очистка кэша полнотекстового поиска
Иногда форма списка сотрудников использует индекс полнотекстового поиска для отображения данных. Если индекс поврежден или не обновлен, данные в списке будут «стакаться». Рекомендуется зайти в Администрирование — Полнотекстовый поиск и нажать кнопку Очистить индекс, а затем Обновить индекс.
Шаг 4: Анализ хронологии (секундный интервал)
Проанализируем ситуацию с временем документов. В КА 1.1 крайне важна последовательность. Если документ Прием на работу и Увольнение записаны в одну и ту же секунду (например, 00:00:00), система может некорректно определять «последнее» состояние. При перепроведении документов вручную система часто смещает их время, что визуально исправляет проблему. Убедитесь, что документы внутри дня выстроены логично.
Если проблема повторяется регулярно, проверьте, нет ли в базе расширений или подписок на события, которые модифицируют справочник СотрудникиОрганизаций. Возможно, сторонний код блокирует выполнение стандартной процедуры ОбновитьРеквизитыСотрудника (или аналогичной в модуле кадровых документов), которая отвечает за синхронизацию данных между регистром и карточкой.
Рассмотрим пример того, как в типовом коде реализовано обновление (упрощенно):
// В модуле документа УвольнениеОрганизаций
Процедура ПриЗаписи(Отказ)
// ... логика проведения по регистрам ...
СотрудникОбъект = СсылкаНаСотрудника.ПолучитьОбъект();
СотрудникОбъект.ДатаУвольнения = ДатаДокумента;
СотрудникОбъект.Записать();
КонецПроцедуры
Если по какой-то причине объект сотрудника в этот момент заблокирован другим пользователем, запись может не произойти, хотя транзакция проведения документа завершится. Поэтому важно следить за отсутствием длительных блокировок в кадровом учете.