Как массово создать сотрудников организации на основании физических лиц в 1С:УПП

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

При переносе данных или первичном запуске информационной базы конфигурации «1С:Управление производственным предприятием» (УПП) часто возникает ситуация, когда справочник ФизическиеЛица уже заполнен (например, содержит несколько тысяч записей), а связанный с ним справочник СотрудникиОрганизаций пуст. Создавать тысячи карточек вручную интерактивно — слишком трудоемкая задача. Разберем, как автоматизировать этот процесс, какие нюансы структуры данных УПП важно учитывать и как избежать типичных ошибок при программном заполнении.

Особенности структуры данных и кадрового учета в УПП

Прежде чем приступать к написанию программного кода, проанализируем взаимосвязь сущностей физических лиц и сотрудников в типовой конфигурации. Справочник ФизическиеЛица хранит персональные данные человека (паспорт, ИНН, СНИЛС, контактная информация), в то время как СотрудникиОрганизаций отражает конкретную кадровую роль человека в рамках конкретного юридического лица.

Для корректного функционирования кадрового и зарплатного контура просто создать элемент в справочнике СотрудникиОрганизаций недостаточно. Важно учитывать следующие ключевые правила:

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

Выборка физических лиц из группы с помощью запроса

В обсуждениях нередко предлагают использовать метод ВыбратьИерархически(), однако при работе с большими объемами информации наиболее производительным и надежным решением является объект Запрос.

Обратим внимание на условие отбора: если физические лица сгруппированы по папкам, оператор В выберет только непосредственных потомков, не заходя во вложенные подпапки. Чтобы корректно выбрать всех людей внутри группы с учетом любой глубины вложенности, используем оператор В ИЕРАРХИИ, а также исключим сами группы условием НЕ ФизЛицо.ЭтоГруппа.

Посмотрим на пример текста запроса для получения физических лиц:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ФизЛица.Ссылка КАК ФизЛицо,
    |	ФизЛица.Наименование КАК ФИО
    |ИЗ
    |	Справочник.ФизическиеЛица КАК ФизЛица
    |ГДЕ
    |	ФизЛица.Ссылка В ИЕРАРХИИ(&ГруппаФизЛиц)
    |	И НЕ ФизЛица.ЭтоГруппа";

Запрос.УстановитьПараметр("ГруппаФизЛиц", НужнаяГруппаФизЛиц);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Способ 1. Пакетное создание элементов справочника «СотрудникиОрганизаций»

Рассмотрим вариант, когда требуется только наполнить справочник СотрудникиОрганизаций (например, перед последующим заполнением документов кадровиками или загрузкой истории). Для оптимизации записи двух тысяч элементов установим свойство ОбменДанными.Загрузка = Истина — это позволит пропустить тяжелые интерактивные проверки форм и подписок на события, существенно ускорив процесс.

Также разберем разделение записи на транзакции, чтобы не перегружать журнал транзакций СУБД:


ОрганизацияПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ОсновнаяОрганизация");

Счетчик = 0;
НачатьТранзакцию();

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

	НовыйСотрудник = Справочники.СотрудникиОрганизаций.СоздатьЭлемент();
	НовыйСотрудник.ОбменДанными.Загрузка = Истина;
	
	НовыйСотрудник.Наименование = Выборка.ФИО;
	НовыйСотрудник.Физлицо = Выборка.ФизЛицо;
	НовыйСотрудник.Организация = ОрганизацияПоУмолчанию;
	НовыйСотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы;
	НовыйСотрудник.ВидДоговора = Перечисления.ВидыДоговоровСФизЛицами.ТрудовойДоговор;
	
	НовыйСотрудник.Записать();
	
	Счетчик = Счетчик + 1;
	
	// Фиксируем порциями по 200 записей
	Если Счетчик % 200 = 0 Тогда
		ЗафиксироватьТранзакцию();
		НачатьТранзакцию();
	КонецЕсли;

КонецЦикла;

Если ТранзакцияАктивна() Тогда
	ЗафиксироватьТранзакцию();
КонецЕсли;

Способ 2. Автоматическое создание документов приема на работу

Разберем ситуацию, когда сотрудников нужно сразу принять на работу в рамках одной организации, одного подразделения и базовой должности. В этом случае правильнее сразу формировать документ ПриемНаРаботуВОрганизацию с заполнением его табличной части РаботникиОрганизации.

Посмотрим на пример заполнения кадрового документа:


ДокументПриема = Документы.ПриемНаРаботуВОрганизацию.СоздатьДокумент();
ДокументПриема.Дата = ТекущаяДата();
ДокументПриема.Организация = ВыбраннаяОрганизация;

Пока Выборка.Следующий() Цикл
	
	// Создаем элемент справочника СотрудникиОрганизаций
	НовыйСотрудник = Справочники.СотрудникиОрганизаций.СоздатьЭлемент();
	НовыйСотрудник.Наименование = Выборка.ФИО;
	НовыйСотрудник.Физлицо = Выборка.ФизЛицо;
	НовыйСотрудник.Организация = ВыбраннаяОрганизация;
	НовыйСотрудник.ВидЗанятости = Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы;
	НовыйСотрудник.ВидДоговора = Перечисления.ВидыДоговоровСФизЛицами.ТрудовойДоговор;
	НовыйСотрудник.Записать();
	
	// Добавляем строку в документ приема
	СтрокаСотр = ДокументПриема.РаботникиОрганизации.Добавить();
	СтрокаСотр.Сотрудник = НовыйСотрудник.Ссылка;
	СтрокаСотр.ФизЛицо = Выборка.ФизЛицо;
	СтрокаСотр.ПодразделениеОрганизации = ВыбранноеПодразделение;
	СтрокаСотр.Должность = ВыбраннаяДолжность;
	СтрокаСотр.ДатаПриема = ДатаНачалаРаботы;
	СтрокаСотр.ЗанимаемыхСтавок = 1;
	
КонецЦикла;

ДокументПриема.Записать(РежимЗаписиДокумента.Запись);

Способ 3. Использование промежуточной таблицы сопоставления или типовой обработки

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

  1. Создание внешней обработки с табличной частью: обработка заполняет таблицу строками из физлиц, после чего пользователь может загрузить из файла Excel или проставить вручную подразделение, должность, оклад и организацию. После заполнения данных алгоритм в цикле создает как карточки сотрудников, так и списочные документы приема на работу.
  2. Использование типовой обработки «Загрузка данных из табличного документа»: если кадровые списки уже подготовлены в формате Excel (со столбцами «ФИО», «ФизЛицо», «Организация», «Подразделение», «Должность»), данная обработка позволяет загрузить информацию напрямую в справочник СотрудникиОрганизаций без написания программного кода.

Таким образом, выбор метода зависит от исходных данных: для простого наполнения справочника достаточно запроса с выборкой по иерархии и программной записи в цикле с отключением лишних проверок, а для полноценного ввода начальных остатков необходимо формирование кадровых документов ПриемНаРаботуВОрганизацию.

← На главную