Почему в 1С:ЗУП 3.1 двоятся сотрудники при выборе, если в справочнике дублей нет?

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

В практической работе с программой «1С:Зарплата и управление персоналом» редакции 3.1 пользователи и администраторы часто сталкиваются со странным поведением системы. При поиске сотрудника через автоподбор (например, при вводе фамилии в кадровых документах или при использовании сочетания клавиш Ctrl+F в регистрах) программа выдает две одинаковые строки с разными табельными номерами. Однако, если мы попытаемся открыть любого из этих сотрудников, мы попадаем в одну и ту же корректную карточку. Более того, стандартный поиск дублей и непосредственный просмотр справочника Сотрудники показывают, что элемент в базе всего один.

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

Причина возникновения проблемы: особенности архитектуры ЗУП 3.1

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

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

Ситуация с «фантомными» сотрудниками возникает по следующему сценарию:

  1. Ранее в информационной базе действительно существовали два одинаковых сотрудника (дубли).
  2. Пользователь или администратор решил объединить их с помощью стандартной обработки «Поиск и удаление дублей».
  3. Обработка успешно заменила ссылки во всех проведенных документах на «правильного» сотрудника, а дублирующий элемент справочника пометила на удаление (или физически удалила).
  4. Главная проблема: стандартные механизмы удаления дублей платформы 1С не всегда корректно очищают записи в независимых регистрах сведений, у которых нет жесткой связи с ведущим объектом. В результате в этих регистрах остались «зависшие» записи, ссылающиеся на старый табельный номер или старый идентификатор удаленного сотрудника.

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

Где искать зависшие записи? Список проблемных регистров

Проанализируем основные регистры сведений, в которых чаще всего «застревают» фантомные дубли сотрудников:

  1. Данные для подбора сотрудников (РегистрСведений.ДанныеДляПодбораСотрудников) — основной виновник проблемы. Именно из него строится выпадающий список быстрого выбора.
  2. Текущие кадровые данные сотрудников (РегистрСведений.ТекущиеКадровыеДанныеСотрудников) — хранит информацию о текущих рабочих местах, должностях и табельных номерах.
  3. Данные об оплате труда для подбора сотрудников (РегистрСведений.ДанныеОбОплатеТрудаДляПодбораСотрудников) — используется для автозаполнения стоимостных показателей.
  4. Состояния сотрудников (РегистрСведений.СостоянияСотрудников) — содержит сведения о том, находится ли сотрудник в работе, в отпуске или на больничном.

Давайте рассмотрим три практических способа устранения этой проблемы — от самого простого ручного до программного.

Способ 1. Ручное удаление фантомных записей из регистра

Если проблема носит единичный характер (задваиваются один или два сотрудника), мы можем удалить лишние записи вручную через встроенный механизм перехода по ссылкам.

  1. В правом верхнем углу программы нажмите на кнопку меню «Сервис и настройки» (значок с шестеренкой или тремя точками) и выберите пункт «Перейти по ссылке» (или воспользуйтесь горячими клавишами Shift + F11).
  2. В открывшемся окне введите адрес регистра подбора: e1cib/list/РегистрСведений.ДанныеДляПодбораСотрудников и нажмите кнопку «Перейти».
  3. Перед вами откроется плоский список всех записей регистра. Нажмите Ctrl + F и найдите проблемного сотрудника по фамилии.
  4. Вы увидите две записи. Обратите внимание на колонку Сотрудник или Табельный номер. Одна из записей будет содержать неверный (старый) табельный номер или пустую ссылку.
  5. Чтобы удалить некорректную запись, нажмите на ней правой кнопкой мыши и выберите команду «Удалить» (в некоторых интерфейсах может потребоваться предварительно нажать Еще — Разблокировать форму/объекты).
  6. Повторите аналогичную операцию для регистра РегистрСведений.ТекущиеКадровыеДанныеСотрудников (ссылка для перехода: e1cib/list/РегистрСведений.ТекущиеКадровыеДанныеСотрудников).

Способ 2. Перепроведение кадровых документов сотрудника

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

  1. Найдите первоначальный документ приема на работу проблемного сотрудника (или документ кадрового перевода).
  2. Временно отмените проведение этого документа (нажмите Еще — Отменить проведение).
  3. Проведите документ заново. В этот момент сработают встроенные подписки на события 1С, которые принудительно очистят старые записи в связанных регистрах и запишут актуальные корректные сведения.

Этот способ хорош тем, что он абсолютно безопасен для базы данных и не требует административных прав на прямое редактирование регистров.

Способ 3. Автоматическое исправление с помощью программного кода

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

Для программного обновления данных подбора мы можем использовать типовой экспортный метод конфигурации ЗУП 3.1. Рассмотрим пример кода, который выполняет эту задачу:


// Создадим массив, в который поместим ссылку на нашего корректного сотрудника
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);

// Вызываем штатный метод ЗУП для обновления регистра подбора
КадровыйУчет.АктуализироватьДанныеДляПодбораСотрудников(МассивСотрудников);

// Также обновим текущие кадровые данные по этому сотруднику
КадровыйУчет.АктуализироватьКадровыеДанныеСотрудников(МассивСотрудников);

Если же нам требуется полностью очистить записи по «битым» ссылкам, которые ссылаются на несуществующих (удаленных ранее) сотрудников, мы можем использовать следующий код для прямой очистки набора записей регистра ДанныеДляПодбораСотрудников:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДанныеПодбора.Сотрудник КАК Сотрудник
    |ИЗ
    |	РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеПодбора
    |ГДЕ
    |	ДанныеПодбора.Сотрудник.Ссылка ЕСТЬ NULL";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Удаляем «битую» запись из регистра
    НаборЗаписей = РегистрыСведений.ДанныеДляПодбораСотрудников.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаДетальныеЗаписи.Сотрудник);
    НаборЗаписей.Записать(); // Запись пустого набора удаляет запись из базы
КонецЦикла;

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

Рекомендации по предотвращению проблемы в будущем

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

  1. При поиске и слиянии дублирующихся элементов всегда проверяйте, не остались ли помеченные на удаление объекты в базе. Обязательно доводите процедуру удаления до конца через обработку «Удаление помеченных объектов».
  2. Если вы используете сторонние обработки для удаления или объединения элементов справочников, убедитесь, что они учитывают особенности независимых регистров сведений платформы 1С и корректно заменяют измерения в них.
  3. Регулярно (например, раз в месяц) проводите профилактическое тестирование и исправление базы данных (ТИИ) в конфигураторе, включая режим «Очищать записи» при наличии битых ссылок.
← На главную