В практической работе с программой «1С:Зарплата и управление персоналом» редакции 3.1 пользователи и администраторы часто сталкиваются со странным поведением системы. При поиске сотрудника через автоподбор (например, при вводе фамилии в кадровых документах или при использовании сочетания клавиш Ctrl+F в регистрах) программа выдает две одинаковые строки с разными табельными номерами. Однако, если мы попытаемся открыть любого из этих сотрудников, мы попадаем в одну и ту же корректную карточку. Более того, стандартный поиск дублей и непосредственный просмотр справочника Сотрудники показывают, что элемент в базе всего один.
В этой статье мы подробно разберем, почему возникает этот технический сбой, в каких таблицах базы данных «застревают» фантомные записи и какими способами можно полностью очистить базу от подобных дублей.
Для того чтобы понять природу этой ошибки, нам необходимо заглянуть во внутреннее устройство конфигурации. В отличие от старых версий программ «1С», в «ЗУП 3.1» справочники Сотрудники и Физические лица практически никогда не выводятся в документы напрямую из своих таблиц. Для оптимизации производительности, быстрого поиска по первым буквам и корректного отбора по работающим сотрудникам используются специальные вспомогательные регистры сведений.
Когда вы начинаете вводить фамилию сотрудника в поле выбора, система обращается не к справочнику, а к специализированному регистру сведений ДанныеДляПодбораСотрудников. Именно этот регистр хранит актуальное ФИО, представление, организацию и табельный номер.
Ситуация с «фантомными» сотрудниками возникает по следующему сценарию:
Поскольку записи в регистрах подбора не очистились, система продолжает показывать две строки в выпадающем списке, хотя физически элемент справочника остался только один.
Проанализируем основные регистры сведений, в которых чаще всего «застревают» фантомные дубли сотрудников:
РегистрСведений.ДанныеДляПодбораСотрудников) — основной виновник проблемы. Именно из него строится выпадающий список быстрого выбора.РегистрСведений.ТекущиеКадровыеДанныеСотрудников) — хранит информацию о текущих рабочих местах, должностях и табельных номерах.РегистрСведений.ДанныеОбОплатеТрудаДляПодбораСотрудников) — используется для автозаполнения стоимостных показателей.РегистрСведений.СостоянияСотрудников) — содержит сведения о том, находится ли сотрудник в работе, в отпуске или на больничном.Давайте рассмотрим три практических способа устранения этой проблемы — от самого простого ручного до программного.
Если проблема носит единичный характер (задваиваются один или два сотрудника), мы можем удалить лишние записи вручную через встроенный механизм перехода по ссылкам.
Shift + F11).e1cib/list/РегистрСведений.ДанныеДляПодбораСотрудников и нажмите кнопку «Перейти».Ctrl + F и найдите проблемного сотрудника по фамилии.Сотрудник или Табельный номер. Одна из записей будет содержать неверный (старый) табельный номер или пустую ссылку.Еще — Разблокировать форму/объекты).РегистрСведений.ТекущиеКадровыеДанныеСотрудников (ссылка для перехода: e1cib/list/РегистрСведений.ТекущиеКадровыеДанныеСотрудников).Иногда система способна автоматически восстановить порядок в регистрах, если принудительно запустить штатные механизмы конфигурации, отвечающие за обновление данных подбора. Для этого выполним следующие действия:
Еще — Отменить проведение).Этот способ хорош тем, что он абсолютно безопасен для базы данных и не требует административных прав на прямое редактирование регистров.
Если база данных большая и проблема с фантомными дублями затронула десятки или сотни сотрудников, ручная очистка нецелесообразна. В этом случае программист может написать обработку или выполнить специальный код в консоли кода, который принудительно актуализирует сведения в подсистеме подбора сотрудников.
Для программного обновления данных подбора мы можем использовать типовой экспортный метод конфигурации ЗУП 3.1. Рассмотрим пример кода, который выполняет эту задачу:
// Создадим массив, в который поместим ссылку на нашего корректного сотрудника
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);
// Вызываем штатный метод ЗУП для обновления регистра подбора
КадровыйУчет.АктуализироватьДанныеДляПодбораСотрудников(МассивСотрудников);
// Также обновим текущие кадровые данные по этому сотруднику
КадровыйУчет.АктуализироватьКадровыеДанныеСотрудников(МассивСотрудников);
Если же нам требуется полностью очистить записи по «битым» ссылкам, которые ссылаются на несуществующих (удаленных ранее) сотрудников, мы можем использовать следующий код для прямой очистки набора записей регистра ДанныеДляПодбораСотрудников:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеПодбора.Сотрудник КАК Сотрудник
|ИЗ
| РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеПодбора
|ГДЕ
| ДанныеПодбора.Сотрудник.Ссылка ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Удаляем «битую» запись из регистра
НаборЗаписей = РегистрыСведений.ДанныеДляПодбораСотрудников.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Сотрудник.Установить(ВыборкаДетальныеЗаписи.Сотрудник);
НаборЗаписей.Записать(); // Запись пустого набора удаляет запись из базы
КонецЦикла;
Применение этого кода позволит быстро и эффективно избавить базу от фантомных «хвостов», оставшихся после слияния дублирующихся карточек.
Для того чтобы избежать появления фантомных записей при дальнейшей работе с информационной базой, рекомендуем соблюдать простые правила: