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