При настройке обмена данными между конфигурациями (например, из ЗУП 2.5 в БП 3.0) с использованием Конвертации данных 2.1 разработчики часто сталкиваются с неочевидной ошибкой: Значение не является значением объектного типа (Отбор). Ситуация осложняется тем, что ошибка может возникать даже в тех случаях, когда программный код в обработчиках кажется абсолютно корректным или вовсе закомментирован. В этой статье мы подробно разберем причины возникновения этой проблемы и рассмотрим эффективные способы ее решения.
Первое, на что нам следует обратить внимание — это область видимости переменных внутри обработки УниверсальныйОбменДаннымиXML. Когда мы пишем код в обработчиках событий (например, «После загрузки»), этот код выполняется внутри большой процедуры модуля обработки обмена. Рассмотрим типичный фрагмент кода, который вызывает ошибку:
НаборЗаписи = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
Отбор = НаборЗаписи.Отбор; // Здесь кроется опасность!
Отбор.ГоловнаяОрганизация.Установить(Организация);
Проанализируем ситуацию: переменная с именем Отбор может быть уже зарезервирована самой обработкой обмена для своих внутренних нужд. Переопределяя ее, мы ломаем внутреннюю логику движка КД. Для решения этой проблемы всегда используйте уникальные имена переменных. Давайте перепишем этот фрагмент правильно:
Набор_МойОтбор = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
ТекОтбор = Набор_МойОтбор.Отбор;
ТекОтбор.ГоловнаяОрганизация.Установить(Организация);
ТекОтбор.ФизическоеЛицо.Установить(ФизЛицо);
Иногда ошибка возникает даже при полностью закомментированном коде обработчика. Это означает, что проблема кроется в стандартном механизме записи объекта. Если в ПКО (Правила Конвертации Объектов) для регистра сведений неверно настроены поля поиска или не передаются обязательные измерения, обработка пытается создать набор записей для замещения, но не может корректно инициализировать объект Отбор.
Выясним причину такого поведения. В коде обработки УниверсальныйОбменДаннымиXML есть циклы, которые перебирают метаданные регистра для установки отборов перед записью. Если соответствие полей поиска настроено некорректно, переменная НаборЗаписей может не получить ссылку на реальный объект метаданных, и обращение к свойству Отбор вызовет исключение.
Для исправления этой ситуации выполним следующие действия:
В независимых регистрах сведений (таких как ОсновныеСотрудникиФизическихЛиц в БП 3.0) часто используют МенеджерЗаписи. Однако при работе в контексте обмена данными использование НабораЗаписей является более надежным и производительным методом. Рассмотрим, как правильно реализовать удаление старых и добавление новых записей без возникновения ошибок объектного типа.
Рассмотрим пример правильной работы с набором:
// Сначала очистим старые записи по определенному отбору
МойНабор = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
МойНабор.Отбор.ГоловнаяОрганизация.Установить(Организация);
МойНабор.Отбор.ФизическоеЛицо.Установить(ФизЛицо);
// Записываем пустой набор с флагом замещения (Истина), чтобы удалить старые записи
МойНабор.Записать(Истина);
// Теперь добавим новую запись
НоваяЗапись = МойНабор.Добавить();
НоваяЗапись.ГоловнаяОрганизация = Организация;
НоваяЗапись.ФизическоеЛицо = ФизЛицо;
НоваяЗапись.Сотрудник = ПереданныеПараметры.Сотрудник;
НоваяЗапись.ДатаНачала = ПереданныеПараметры.ДатаНачала;
// Фиксируем изменения
МойНабор.Записать(Ложь); // Ложь, так как мы уже очистили записи ранее
Проанализируем этот код: использование метода Записать(Истина) при установленном отборе гарантирует, что система не выдаст ошибку, если в регистре не индексированы измерения ДатаНачала или ДатаОкончания. Главное — чтобы отбор устанавливался только по тем полям, которые являются измерениями регистра.
Если ошибка сохраняется, воспользуемся проверенным алгоритмом диагностики:
Отбор часто возникает в БП 3.0 из-за особенностей работы с типами данных в различных режимах запуска.Алгоритмы. Это позволит вам использовать полноценную отладку через конфигуратор, установив точку останова в момент обращения к объекту Отбор.ИнформацияОТипе для ключевых измерений, загрузчик не сможет инициализировать объект набора записей.Таким образом, мы выяснили, что основной причиной ошибки является либо конфликт имен переменных в глобальном контексте обработки обмена, либо некорректная настройка полей поиска в ПКО, заставляющая стандартный механизм загрузки обращаться к неинициализированным объектам. Следуя приведенным рекомендациям и используя НаборЗаписей с уникальными именами переменных, вы сможете обеспечить стабильную работу обмена данными.