Как исправить ошибку «Поле объекта не обнаружено (Активность)» при переносе данных в ЗУП 3.1 с помощью КД2?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При выполнении миграции кадровых данных из старых релизов 1С:Зарплата и управление персоналом (например, с версии 3.1.8) на новые редакции (например, 3.1.12 и выше) разработчики часто используют конфигурацию «Конвертация данных 2.1» (КД2). Это мощный инструмент, однако при автоматической генерации правил выгрузки и конвертации свойств могут возникать неочевидные ошибки. Одна из самых распространенных и вводящих в ступор проблем — ошибка Поле объекта не обнаружено (Активность) при переносе записей регистра сведений ДанныеДляПодбораСотрудников.

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

Выясняем истинную техническую причину ошибки

Давайте разберем по шагам, что происходит в момент выгрузки данных. На первый взгляд конфигурации источника и приемника содержат регистр сведений ДанныеДляПодбораСотрудников, у которого в обоих случаях присутствует стандартное свойство Активность. Кажется, что автоматическая генерация правил (ПКО и ПВД) должна отработать идеально. Однако при выполнении выгрузки система спотыкается на первой же записи.

Причина кроется в специфике работы обработки «Универсальный обмен данными XML». Когда мы запускаем выгрузку регистра сведений «в лоб» без каких-либо фильтров, система считывает физические записи регистра. Но как только на правила выгрузки данных (ПВД) накладывается отбор (например, по периоду, конкретной организации или списку сотрудников), механизм обмена перестраивает логику:

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

Если мы попытаемся просто отключить выгрузку свойства Активность в правилах конвертации свойств (ПКС), выгрузка продолжит спотыкаться на следующих полях, таких как ВидДоговора, Должность, МестоВСтруктуреПредприятия и так далее, поскольку динамический запрос выборки не содержит и этих реквизитов.

Архитектурно правильное решение: Отказ от прямого переноса регистра

Давайте проанализируем назначение регистра сведений ДанныеДляПодбораСотрудников в конфигурации 1С:ЗУП 3.1. Этот регистр является исключительно служебным. Он предназначен для оптимизации работы интерфейса: система обращается к нему при подборе сотрудников в различные документы (например, в ведомости на выплату зарплаты, кадровые приказы и отчеты), чтобы быстро отфильтровать работающих на данный момент специалистов без ресурсоемких расчетных операций в реальном времени.

Данные в этот регистр записываются автоматически при проведении кадровых документов (таких как Прием на работу, Кадровый перевод, Увольнение). Таким образом, методологически правильным решением будет полное исключение этого регистра из правил выгрузки КД2. Нам гораздо важнее перенести первичные кадровые документы, а не результаты движений по служебным таблицам.

Рассмотрим, как правильно настроить перенос и восстановить работоспособность базы-приемника без переноса записей регистра напрямую:

  1. В конфигурации «Конвертация данных» перейдите на закладку «Правила выгрузки данных».
  2. Найдите правило для регистра сведений ДанныеДляПодбораСотрудников и снимите с него флаг выгрузки (или установите галочку Отключить).
  3. Убедитесь, что у вас настроен корректный перенос основных кадровых документов: ПриемНаРаботу, КадровыйПеревод, Увольнение, а также справочника Сотрудники.
  4. После успешного переноса документов в базу-приемник выполните их групповое проведение. При проведении документов система автоматически сформирует все необходимые записи во всех служебных регистрах.

Что делать, если сотрудники «исчезли» в базе-приемнике?

Иногда после переноса документов и справочников пользователи жалуются, что кадровые документы на месте, но при попытке заполнить ведомость или подобрать сотрудника список оказывается пустым. Это происходит из-за того, что служебный регистр подбора не обновился автоматически при программной записи объектов. Эту проблему можно легко решить штатными средствами 1С без написания кода.

Выполним процедуру ручного перезаполнения регистра в базе-приемнике:

  1. Запустите базу-приемник ЗУП 3.1 в режиме «1С:Предприятие».
  2. Перейдите по прямой ссылке к списку записей регистра. Для этого нажмите сочетание клавиш Ctrl + Shift + L (или перейдите в меню функций) и вставьте адрес: e1cib/list/РегистрСведений.ДанныеДляПодбораСотрудников.
  3. В открывшейся форме списка нажмите кнопку «Еще» в правом верхнем углу и выберите команду «Разблокировать объекты».
  4. Затем нажмите кнопку «Перезаполнить регистр» (в некоторых версиях конфигурации система предлагает выполнить обновление состояний сотрудников).
  5. Дождитесь окончания процесса. Платформа самостоятельно пересчитает кадровые данные на основе проведенных документов и полностью заполнит регистр актуальной информацией.

Важное примечание: Помимо регистра подбора, обратите внимание на реквизит ГоловнойСотрудник в справочнике Сотрудники. При некорректном переносе данных через КД2 этот реквизит может остаться незаполненным. Для корректной работы системы он обязательно должен ссылаться на самого себя (для основных сотрудников). Также помните, что автоматическое проведение кадровых документов гарантирует заполнение и других важных регистров, таких как:

Прямой перенос этих таблиц через КД2 также является избыточным и потенциально опасным процессом, способным привести к рассогласованию данных.

Техническое решение проблемы в КД2 (если регистр переносить необходимо)

Если перед вами стоит жесткая задача перенести базу «один в один» (например, при переносе свернутых данных без документов за прошлые периоды) и вам критически важно выгрузить именно записи регистра сведений ДанныеДляПодбораСотрудников, то стандартный механизм выгрузки придется доработать вручную.

Рассмотрим два способа обхода ошибки непосредственно в правилах конвертации.

Способ А: Использование произвольного алгоритма выборки данных в ПВД

Этот способ позволяет полностью контролировать структуру данных, передаваемых в ПКО. Мы откажемся от стандартного формирования выборки платформой и напишем собственный запрос, который гарантированно выберет все нужные поля, включая Активность.

Выполним следующие действия в «Конвертации данных»:

  1. Откройте настройки Правила выгрузки данных (ПВД) для нашего регистра сведений.
  2. В поле «Способ выборки данных» установите значение «Произвольный алгоритм».
  3. В обработчике события «Перед выгрузкой» напишите следующий код:

// Создаем запрос для явного выбора всех реквизитов регистра
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ДанныеДляПодбораСотрудников.Период КАК Период,
    |	ДанныеДляПодбораСотрудников.Активность КАК Активность,
    |	ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник,
    |	ДанныеДляПодбораСотрудников.Организация КАК Организация,
    |	ДанныеДляПодбораСотрудников.Должность КАК Должность,
    |	ДанныеДляПодбораСотрудников.ВидДоговора КАК ВидДоговора,
    |	ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение
    |ИЗ
    |	РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников";

// Результат запроса выгружаем в таблицу значений
ТаблицаДанных = Запрос.Выполнить().Выгрузить();

// Передаем подготовленную таблицу в специальную переменную КД2
ВыборкаДанных = ТаблицаДанных;

При использовании этого подхода КД2 получит четко структурированную таблицу значений, в которой колонка Активность будет гарантированно присутствовать. Ошибка обращения к несуществующему полю будет полностью устранена.

Способ Б: Фильтрация некорректных типов данных

Иногда при выгрузке сложных каскадов данных в обработчик ПВД могут попадать объекты смежных типов. Чтобы исключить выгрузку «мусорных» объектов, не соответствующих типу записи нашего регистра, мы можем установить строгий фильтр по типам в обработчике ПВД.

Откройте ПВД регистра и в обработчике «Перед выгрузкой» добавьте проверку:


// Проверяем, что выгружаемый объект действительно является записью нужного регистра
Если Не ТипЗнч(Объект) = Тип("РегистрСведенийЗапись.ДанныеДляПодбораСотрудников") Тогда
    // Если тип не совпадает, отменяем выгрузку этого конкретного объекта
    Отказ = Истина;
КонецЕсли;

Этот простой фильтр позволит избежать передачи в ПКО результатов запросов или табличных частей документов, которые по ошибке пытаются конвертироваться через правила для регистра сведений.

Выводы

Мы подробно разобрали проблему возникновения ошибки Поле объекта не обнаружено (Активность). Подводя итог, можно сделать однозначный вывод: для большинства практических задач лучшим решением будет отключение выгрузки служебного регистра в КД2 и его последующее автоматическое или ручное перезаполнение в базе-приемнике. Это экономит время разработки правил, уменьшает объем файла выгрузки XML и гарантирует целостность кадровых данных за счет использования штатных механизмов проведения документов самой платформы 1С.

← На главную