Как исправить ошибку «Значение не является значением объектного типа (Отбор)» при загрузке данных через КД 2.1?

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

При настройке обмена данными между конфигурациями (например, из ЗУП 2.5 в БП 3.0) с использованием Конвертации данных 2.1 разработчики часто сталкиваются с неочевидной ошибкой: Значение не является значением объектного типа (Отбор). Ситуация осложняется тем, что ошибка может возникать даже в тех случаях, когда программный код в обработчиках кажется абсолютно корректным или вовсе закомментирован. В этой статье мы подробно разберем причины возникновения этой проблемы и рассмотрим эффективные способы ее решения.

Причина 1: Конфликт имен переменных в обработчиках

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


НаборЗаписи = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
Отбор = НаборЗаписи.Отбор; // Здесь кроется опасность!
Отбор.ГоловнаяОрганизация.Установить(Организация);

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


Набор_МойОтбор = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
ТекОтбор = Набор_МойОтбор.Отбор; 
ТекОтбор.ГоловнаяОрганизация.Установить(Организация);
ТекОтбор.ФизическоеЛицо.Установить(ФизЛицо);

Причина 2: Ошибки в логике работы с регистром в самой обработке обмена

Иногда ошибка возникает даже при полностью закомментированном коде обработчика. Это означает, что проблема кроется в стандартном механизме записи объекта. Если в ПКО (Правила Конвертации Объектов) для регистра сведений неверно настроены поля поиска или не передаются обязательные измерения, обработка пытается создать набор записей для замещения, но не может корректно инициализировать объект Отбор.

Выясним причину такого поведения. В коде обработки УниверсальныйОбменДаннымиXML есть циклы, которые перебирают метаданные регистра для установки отборов перед записью. Если соответствие полей поиска настроено некорректно, переменная НаборЗаписей может не получить ссылку на реальный объект метаданных, и обращение к свойству Отбор вызовет исключение.

Для исправления этой ситуации выполним следующие действия:

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

Причина 3: Переход от МенеджераЗаписи к НаборуЗаписей

В независимых регистрах сведений (таких как ОсновныеСотрудникиФизическихЛиц в БП 3.0) часто используют МенеджерЗаписи. Однако при работе в контексте обмена данными использование НабораЗаписей является более надежным и производительным методом. Рассмотрим, как правильно реализовать удаление старых и добавление новых записей без возникновения ошибок объектного типа.

Рассмотрим пример правильной работы с набором:


// Сначала очистим старые записи по определенному отбору
МойНабор = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
МойНабор.Отбор.ГоловнаяОрганизация.Установить(Организация);
МойНабор.Отбор.ФизическоеЛицо.Установить(ФизЛицо);

// Записываем пустой набор с флагом замещения (Истина), чтобы удалить старые записи
МойНабор.Записать(Истина); 

// Теперь добавим новую запись
НоваяЗапись = МойНабор.Добавить();
НоваяЗапись.ГоловнаяОрганизация = Организация;
НоваяЗапись.ФизическоеЛицо = ФизЛицо;
НоваяЗапись.Сотрудник = ПереданныеПараметры.Сотрудник;
НоваяЗапись.ДатаНачала = ПереданныеПараметры.ДатаНачала;

// Фиксируем изменения
МойНабор.Записать(Ложь); // Ложь, так как мы уже очистили записи ранее

Проанализируем этот код: использование метода Записать(Истина) при установленном отборе гарантирует, что система не выдаст ошибку, если в регистре не индексированы измерения ДатаНачала или ДатаОкончания. Главное — чтобы отбор устанавливался только по тем полям, которые являются измерениями регистра.

Практические советы по отладке КД 2.1

Если ошибка сохраняется, воспользуемся проверенным алгоритмом диагностики:

  1. Проверка в «толстом» клиенте: Убедитесь, что вы используете обработку загрузки именно в том режиме (Обычные или Управляемые формы), под который она адаптирована. Ошибка Отбор часто возникает в БП 3.0 из-за особенностей работы с типами данных в различных режимах запуска.
  2. Использование внешних обработок: Если код в правилах сложный, вынесите его во внешнюю обработку и вызовите через Алгоритмы. Это позволит вам использовать полноценную отладку через конфигуратор, установив точку останова в момент обращения к объекту Отбор.
  3. Анализ XML-файла: Посмотрите структуру выгруженных данных. Если в файле обмена для регистра отсутствуют узлы ИнформацияОТипе для ключевых измерений, загрузчик не сможет инициализировать объект набора записей.

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

← На главную