В процессе работы с программами 1С:ЗУП 3.1, 1С:ERP и 1С:Комплексная автоматизация пользователи часто сталкиваются с ситуацией, когда при оформлении заявки на открытие лицевого счета в банке нужный сотрудник не отображается в списке выбора. При этом в других кадровых отчетах он числится как работающий. Давайте разберем, почему это происходит и как устранить данную проблему.
Основная причина заключается в архитектурных особенностях современных типовых конфигураций 1С. Для оптимизации быстродействия системы был внедрен регистр сведений Основные сотрудники физических лиц. Этот регистр выполняет роль «индекса» для быстрого поиска актуального или последнего активного сотрудника, привязанного к конкретному физическому лицу.
В случае повторного приема сотрудника система может создать новую карточку, но из-за программного сбоя или некорректного переноса данных запись в служебном регистре Основные сотрудники физических лиц не обновляется. В результате система продолжает считать «основным» старого (уволенного) сотрудника, у которого период действия записи может ошибочно заканчиваться 31.12.3999, либо запись просто содержит пустые даты.
Для исправления ситуации необходимо синхронизировать данные регистра Основные сотрудники физических лиц с данными регистра Текущие кадровые данные сотрудников, который является первичным источником информации о текущем статусе кадров.
Рассмотрим, как можно программно перезаполнить данные в регистре. Для этого мы создадим запрос к регистру Текущие кадровые данные сотрудников и на его основе актуализируем записи в Основные сотрудники физических лиц.
Ниже представлен пример кода, который поможет вам выполнить эту задачу:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо КАК ФизическоеЛицо,
| ТекущиеКадровыеДанныеСотрудников.Сотрудник КАК Сотрудник,
| ТекущиеКадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема,
| ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения КАК ДатаУвольнения
|ИЗ
| РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
|ГДЕ
| ТекущиеКадровыеДанныеСотрудников.ОформленПоТрудовомуДоговору = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ЗаписьиДляИзменения = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
ЗаписьиДляИзменения.Отбор.ФизическоеЛицо.Установить(ВыборкаДетальныеЗаписи.ФизическоеЛицо);
ЗаписьиДляИзменения.Прочитать();
Если ЗаписьиДляИзменения.Количество() <> 0 Тогда
Для Каждого Запись Из ЗаписьиДляИзменения Цикл
Если Запись.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник Тогда
Запись.ДатаНачала = ВыборкаДетальныеЗаписи.ДатаПриема;
Если ВыборкаДетальныеЗаписи.ДатаУвольнения <> Дата("00010101000000") Тогда
Запись.ДатаОкончания = ВыборкаДетальныеЗаписи.ДатаУвольнения;
КонецЕсли;
ЗаписьиДляИзменения.Записать(Истина);
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Не найден сотрудник: " + ВыборкаДетальныеЗаписи.Сотрудник);
КонецЕсли;
КонецЦикла;
Использование предложенного метода позволяет быстро устранить рассинхронизацию данных. После того как вы выполните этот код (или воспользуетесь аналогичной обработкой), данные в форме подбора сотрудников при создании заявки на открытие лицевого счета должны отображаться корректно, учитывая всех актуально принятых работников.