При выполнении миграции кадровых данных из старых релизов 1С:Зарплата и управление персоналом (например, с версии 3.1.8) на новые редакции (например, 3.1.12 и выше) разработчики часто используют конфигурацию «Конвертация данных 2.1» (КД2). Это мощный инструмент, однако при автоматической генерации правил выгрузки и конвертации свойств могут возникать неочевидные ошибки. Одна из самых распространенных и вводящих в ступор проблем — ошибка Поле объекта не обнаружено (Активность) при переносе записей регистра сведений ДанныеДляПодбораСотрудников.
В этой статье мы подробно разберем, почему возникает данная ошибка, проанализируем внутренние механизмы работы обработки обмена и КД2, а также рассмотрим два принципиально разных подхода к решению проблемы: методологически правильный (отказ от переноса служебных регистров) и технический (настройка правил для обхода ограничений платформы).
Давайте разберем по шагам, что происходит в момент выгрузки данных. На первый взгляд конфигурации источника и приемника содержат регистр сведений ДанныеДляПодбораСотрудников, у которого в обоих случаях присутствует стандартное свойство Активность. Кажется, что автоматическая генерация правил (ПКО и ПВД) должна отработать идеально. Однако при выполнении выгрузки система спотыкается на первой же записи.
Причина кроется в специфике работы обработки «Универсальный обмен данными XML». Когда мы запускаем выгрузку регистра сведений «в лоб» без каких-либо фильтров, система считывает физические записи регистра. Но как только на правила выгрузки данных (ПВД) накладывается отбор (например, по периоду, конкретной организации или списку сотрудников), механизм обмена перестраивает логику:
Активность.ВыборкаИзРезультатаЗапроса (или строка таблицы значений), который передается в правило конвертации объектов (ПКО) в качестве источника (Источник).Активность, при попытке КД2 обратиться к свойству источника по имени возникает классическое исключение: Поле объекта не обнаружено (Активность).Если мы попытаемся просто отключить выгрузку свойства Активность в правилах конвертации свойств (ПКС), выгрузка продолжит спотыкаться на следующих полях, таких как ВидДоговора, Должность, МестоВСтруктуреПредприятия и так далее, поскольку динамический запрос выборки не содержит и этих реквизитов.
Давайте проанализируем назначение регистра сведений ДанныеДляПодбораСотрудников в конфигурации 1С:ЗУП 3.1. Этот регистр является исключительно служебным. Он предназначен для оптимизации работы интерфейса: система обращается к нему при подборе сотрудников в различные документы (например, в ведомости на выплату зарплаты, кадровые приказы и отчеты), чтобы быстро отфильтровать работающих на данный момент специалистов без ресурсоемких расчетных операций в реальном времени.
Данные в этот регистр записываются автоматически при проведении кадровых документов (таких как Прием на работу, Кадровый перевод, Увольнение). Таким образом, методологически правильным решением будет полное исключение этого регистра из правил выгрузки КД2. Нам гораздо важнее перенести первичные кадровые документы, а не результаты движений по служебным таблицам.
Рассмотрим, как правильно настроить перенос и восстановить работоспособность базы-приемника без переноса записей регистра напрямую:
ДанныеДляПодбораСотрудников и снимите с него флаг выгрузки (или установите галочку Отключить).ПриемНаРаботу, КадровыйПеревод, Увольнение, а также справочника Сотрудники.Иногда после переноса документов и справочников пользователи жалуются, что кадровые документы на месте, но при попытке заполнить ведомость или подобрать сотрудника список оказывается пустым. Это происходит из-за того, что служебный регистр подбора не обновился автоматически при программной записи объектов. Эту проблему можно легко решить штатными средствами 1С без написания кода.
Выполним процедуру ручного перезаполнения регистра в базе-приемнике:
Ctrl + Shift + L (или перейдите в меню функций) и вставьте адрес: e1cib/list/РегистрСведений.ДанныеДляПодбораСотрудников.Важное примечание: Помимо регистра подбора, обратите внимание на реквизит ГоловнойСотрудник в справочнике Сотрудники. При некорректном переносе данных через КД2 этот реквизит может остаться незаполненным. Для корректной работы системы он обязательно должен ссылаться на самого себя (для основных сотрудников). Также помните, что автоматическое проведение кадровых документов гарантирует заполнение и других важных регистров, таких как:
ТекущиеКадровыеДанныеСотрудниковРолиСотрудниковСостоянияСотрудниковПрямой перенос этих таблиц через КД2 также является избыточным и потенциально опасным процессом, способным привести к рассогласованию данных.
Если перед вами стоит жесткая задача перенести базу «один в один» (например, при переносе свернутых данных без документов за прошлые периоды) и вам критически важно выгрузить именно записи регистра сведений ДанныеДляПодбораСотрудников, то стандартный механизм выгрузки придется доработать вручную.
Рассмотрим два способа обхода ошибки непосредственно в правилах конвертации.
Этот способ позволяет полностью контролировать структуру данных, передаваемых в ПКО. Мы откажемся от стандартного формирования выборки платформой и напишем собственный запрос, который гарантированно выберет все нужные поля, включая Активность.
Выполним следующие действия в «Конвертации данных»:
// Создаем запрос для явного выбора всех реквизитов регистра
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДляПодбораСотрудников.Период КАК Период,
| ДанныеДляПодбораСотрудников.Активность КАК Активность,
| ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник,
| ДанныеДляПодбораСотрудников.Организация КАК Организация,
| ДанныеДляПодбораСотрудников.Должность КАК Должность,
| ДанныеДляПодбораСотрудников.ВидДоговора КАК ВидДоговора,
| ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение
|ИЗ
| РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников";
// Результат запроса выгружаем в таблицу значений
ТаблицаДанных = Запрос.Выполнить().Выгрузить();
// Передаем подготовленную таблицу в специальную переменную КД2
ВыборкаДанных = ТаблицаДанных;
При использовании этого подхода КД2 получит четко структурированную таблицу значений, в которой колонка Активность будет гарантированно присутствовать. Ошибка обращения к несуществующему полю будет полностью устранена.
Иногда при выгрузке сложных каскадов данных в обработчик ПВД могут попадать объекты смежных типов. Чтобы исключить выгрузку «мусорных» объектов, не соответствующих типу записи нашего регистра, мы можем установить строгий фильтр по типам в обработчике ПВД.
Откройте ПВД регистра и в обработчике «Перед выгрузкой» добавьте проверку:
// Проверяем, что выгружаемый объект действительно является записью нужного регистра
Если Не ТипЗнч(Объект) = Тип("РегистрСведенийЗапись.ДанныеДляПодбораСотрудников") Тогда
// Если тип не совпадает, отменяем выгрузку этого конкретного объекта
Отказ = Истина;
КонецЕсли;
Этот простой фильтр позволит избежать передачи в ПКО результатов запросов или табличных частей документов, которые по ошибке пытаются конвертироваться через правила для регистра сведений.
Мы подробно разобрали проблему возникновения ошибки Поле объекта не обнаружено (Активность). Подводя итог, можно сделать однозначный вывод: для большинства практических задач лучшим решением будет отключение выгрузки служебного регистра в КД2 и его последующее автоматическое или ручное перезаполнение в базе-приемнике. Это экономит время разработки правил, уменьшает объем файла выгрузки XML и гарантирует целостность кадровых данных за счет использования штатных механизмов проведения документов самой платформы 1С.