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