Как исправить ошибку «Значение не является значением объектного типа (Родитель)» при переносе данных из ЗУП 2.5 в ЗУП 3.1

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

Переход с устаревшей конфигурации «Зарплата и управление персоналом», редакция 2.5, на современную редакцию 3.1 — это сложный процесс, который часто сопровождается техническими сбоями. Одной из наиболее распространенных и неприятных ошибок является сообщение: «Ошибка в обработчике события ПередОбработкойПравилаВыгрузки ПВД = ПодразделенияОрганизаций... ОписаниеОшибки = Значение не является значением объектного типа (Родитель)». Эта ошибка блокирует выгрузку данных и не позволяет завершить миграцию. В этой статье мы подробно разберем причины возникновения этой ситуации и пошагово рассмотрим методы ее решения.

Анализ причины возникновения ошибки

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

Чаще всего это происходит при попытке системы рекурсивно обойти дерево подразделений для выстраивания иерархии в новой базе. Если в цепочке подчиненности встречается элемент с нарушенной логикой, выгрузка прерывается.

Способ 1: Очистка помеченных на удаление объектов

Проанализируем самый простой, но эффективный метод. Часто в базе ЗУП 2.5 годами копятся помеченные на удаление подразделения, которые не были окончательно стерты. Правила переноса могут пытаться анализировать их, если на них остались ссылки в других регистрах.

Порядок действий:

  1. Запустим процедуру «Удаление помеченных объектов» в исходной базе ЗУП 2.5.
  2. Выберем режим полного удаления.
  3. Если система сообщает, что объект не может быть удален из-за наличия ссылок, необходимо сначала разобраться с этими ссылками (либо очистить их, либо перенаправить на актуальные подразделения).
  4. После успешного удаления всех ненужных подразделений повторим попытку выгрузки.

Способ 2: Тестирование и исправление информационной базы

Выясним, нет ли в базе проблем с физической или логической целостностью данных. Если в справочнике или регистрах сведений (например, в кадровой истории) содержатся «битые ссылки» (записи вида <Объект не найден>), типовой механизм выгрузки не сможет корректно обработать свойство Родитель у таких записей.

Рассмотрим шаги выполнения:

  1. Обязательно создадим резервную копию базы данных.
  2. Зайдем в базу в режиме «Конфигуратор».
  3. Перейдем в меню «Администрирование» — «Тестирование и исправление...».
  4. Установим следующие флаги:
    • Реиндексация таблиц информационной базы.
    • Проверка логической целостности информационной базы.
    • Проверка ссылочной целостности информационной базы.
    • Пересчет итогов.
  5. В поле «При наличии ссылок на несуществующие объекты» выберем «Очищать ссылки» или «Создавать объекты» (первый вариант предпочтительнее для чистки «мусора»).
  6. Нажмем «Выполнить» и дождемся завершения процесса.

Способ 3: Поиск «битых ссылок» в кадровых регистрах

Иногда проблема кроется не в самом справочнике подразделений, а в регистрах, где эти подразделения используются. Проанализируем ситуацию: если в регистре КадроваяИсторияСотрудниковПоЮрЛицам есть запись, где сотрудник или организация не заполнены, или ссылка ведет в «никуда», обработчик выгрузки может «споткнуться» при попытке определить иерархию подразделения этого сотрудника.

Для диагностики воспользуемся консолью запросов. Напишем простой запрос к основным кадровым регистрам:


ВЫБРАТЬ
    КадроваяИстория.Сотрудник,
    КадроваяИстория.ПодразделениеОрганизации
ИЗ
    РегистрСведений.КадроваяИсторияСотрудниковПоЮрЛицам КАК КадроваяИстория
ГДЕ
    КадроваяИстория.ПодразделениеОрганизации.Ссылка ЕСТЬ NULL
    ИЛИ КадроваяИстория.ПодразделениеОрганизации = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)

Если запрос вернет строки, в которых подразделение визуально заполнено как <Объект не найден>, такие записи необходимо вычистить или перевыбрать в них корректные данные.

Способ 4: Проверка иерархии и скрытых реквизитов

Разберем специфическую проблему: зацикливание иерархии или пустые «Головные организации». В ЗУП 2.5 существует скрытый реквизит ГоловнаяОрганизация. Если база переносилась из еще более старых версий (например, 7.7), этот реквизит может быть не заполнен, что сбивает алгоритмы выгрузки.

Также проверим, не является ли какое-то подразделение «родителем само себе». Это можно сделать программно, запустив небольшую обработку:


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

Простая перезапись объектов в цикле (метод Записать()) часто помогает системе автоматически заполнить недостающие внутренние связи.

Способ 5: Использование внешней обработки выгрузки

Часто встроенный в ЗУП 3.1 мастер перехода использует внутренние правила, которые могут быть не самыми актуальными. Посмотрим на альтернативный вариант: использование внешней обработки.

Посмотрим, где ее найти:

  1. Зайдем в каталог установки шаблонов конфигурации ЗУП 3.1 (обычно это путь вида C:\Users\ИмяПользователя\AppData\Roaming\1C\1cv8\tmplts\1c\ZUP\НомерРелиза...).
  2. Найдем в этой папке файл ВыгрузкаДанныхВЗУП3.epf.
  3. Запустим эту обработку непосредственно в базе ЗУП 2.5 через «Файл» — «Открыть».
  4. В поле «Файл правил» выберем XML-файл с правилами обмена, который обычно лежит в той же папке.
  5. Такой способ позволяет более гибко управлять процессом выгрузки, например, можно отключить выгрузку только справочника подразделений, чтобы убедиться, что проблема именно в нем, или наоборот — выгрузить только его для локализации ошибки.

Рекомендация по отладке кода правил

Если вы обладаете навыками программирования, обратите внимание на позицию модуля, указанную в ошибке (в примере это ПозицияМодуля = (56)). Если открыть файл правил обмена в конфигурации «Конвертация данных», можно найти ПВД ПодразделенияОрганизаций и посмотреть, какое именно обращение к Родитель происходит в 56-й строке кода. Обычно там встречается конструкция вида ТекОбъект.Родитель.Наименование. Чтобы избежать падения, этот код следует обернуть в проверку:


Если ЗначениеЗаполнено(ОбъектВыгрузки.Родитель) Тогда
    // Ваш код обращения к Родителю
КонецЕсли;

Хотя редактирование типовых правил — это крайняя мера, иногда это единственный способ обойти специфические ошибки «грязных» данных, которые невозможно исправить стандартными средствами тестирования.

Подведем итог: в большинстве случаев проблема решается удалением помеченных объектов и тестированием исправлением базы. Если это не помогает, следует искать некорректные записи в кадровых регистрах и проверять иерархию справочника на наличие циклов или пустых ссылок.

← На главную