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