При выполнении переноса кадровых данных из 1С:Зарплата и кадры 7.7 или других конфигураций в 1С:Зарплата и управление персоналом 3.1 пользователи и специалисты нередко сталкиваются с ситуацией, когда справочник Сотрудники визуально пуст. При этом физически элементы в базе присутствуют, а в динамическом списке установлен отбор по признаку ЭтоОсновнойСотрудник = Истина. Разберем по шагам, почему возникает эта ошибка и как быстро восстановить корректное отображение списка сотрудников.
Проанализируем внутреннее устройство справочника Сотрудники в 1С:ЗУП 3.1. В отличие от предыдущих версий платформы, форма списка сотрудников отображает данные не напрямую из таблицы справочника, а с помощью сложного запроса динамического списка. Запрос соединяет справочник со служебными регистрами сведений:
ДанныеДляПодбораСотрудников — содержит флаг ОсновнойСотрудник, дату увольнения, состояние занятости и другие признаки для быстрых отборов.ТекущиеКадровыеДанныеСотрудников — хранит актуальную информацию о подразделении, должности, виде занятости и графике.В конфигурации 1С:ЗУП 3 реализован механизм «Подработок». Когда сотруднику оформляется подработка, создается дополнительный служебный элемент справочника Сотрудники, который не должен загромождать основные списки выбора и формы справочника. Разделение основных элементов и подработок выполняется через реквизит ГоловнойСотрудник:
ГоловнойСотрудник должен содержать ссылку на самого себя (на этот же элемент справочника).Выясним причину ошибки: при нестандартной загрузке данных или переносе через универсальные обработки данные записываются в режиме ОбменДанными.Загрузка = Истина. В этом режиме типовые обработчики событий объекта не вызываются, реквизит ГоловнойСотрудник остается пустым, а служебный регистр ДанныеДляПодбораСотрудников не заполняется. В результате динамический список отфильтровывает все записи.
Рассмотрим самый надежный способ комплексного исправления. Чтобы платформа отработала всю внутреннюю логику и корректно заполнила зависимые регистры сведений, необходимо перезаписать элементы справочника Сотрудники в обычном режиме без флага обмена данными.
Посмотрим на пример программного кода для внешней обработки или консоли кода:
Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
// Отключаем режим загрузки для срабатывания стандартных обработчиков
Объект.ОбменДанными.Загрузка = Ложь;
// Если реквизит не заполнен, прописываем ссылку на самого себя
Если Не ЗначениеЗаполнено(Объект.ГоловнойСотрудник) Тогда
Объект.ГоловнойСотрудник = Объект.Ссылка;
КонецЕсли;
Попытка
Объект.Записать();
Исключение
Сообщить("Ошибка при записи сотрудника: " + Объект.Наименование + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
При вызове метода Записать() в штатном режиме типовой модуль объекта автоматически обновит записи в регистрах сведений ДанныеДляПодбораСотрудников и ТекущиеКадровыеДанныеСотрудников.
Если нет возможности запустить программный код, разберем решение через типовую функциональность конфигурации:
Сотрудники.Головной сотрудник.Объект.ГоловнойСотрудник = Объект.Ссылка;.ДанныеДляПодбораСотрудников, установив флаг ОсновнойСотрудник = Истина, однако это лишь временная мера, так как реквизиты объекта останутся некорректными.Проанализируем, как устранить проблему заранее, чтобы не выполнять ручные корректировки после каждого повторного переноса. В конфигурации 1С:Конвертация данных для правила конвертации объекта справочника Сотрудники необходимо добавить обработчик событий.
В обработчике После загрузки (или После записи) укажем следующий код:
Если Не ЗначениеЗаполнено(Объект.ГоловнойСотрудник) Тогда
Объект.ГоловнойСотрудник = Объект.Ссылка;
КонецЕсли;
Таким образом, при импорте данных каждый сотрудник сразу получит корректную ссылку на самого себя, и все записи гарантированно появятся в списке сотрудников.