Как исправить ошибку «Значение не является значением объектного типа (Получить)» при загрузке остатков из УТ 10.3 в УТ 11

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

Переход с «1С:Управление торговлей 10.3» на версию 11 — это сложный процесс, который часто сопровождается использованием типовых или доработанных правил обмена, созданных в конфигурации «Конвертация данных 2.0». Одной из часто встречающихся проблем при загрузке данных является критическая ошибка в обработчиках событий, которая полностью останавливает процесс импорта. В этой статье мы подробно разберем ситуацию, когда при загрузке номенклатуры возникает ошибка: «Значение не является значением объектного типа (Получить)» в обработчике ПослеЗагрузкиОбъекта.

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

Проанализируем техническую суть проблемы. Ошибка указывает на то, что в коде обработчика происходит обращение к переменной (в данном случае ПараметрыОбъекта) так, будто это объект (Структура или Соответствие), имеющий метод Получить(). Однако на момент выполнения кода эта переменная имеет значение Неопределено.

В контексте переноса данных из УТ 10 в УТ 11 это обычно происходит в правилах конвертации объектов (ПКО), отвечающих за номенклатуру с разным качеством (Брак, Подпорчен и т.д.). Рассмотрим строку кода, на которой «спотыкается» система:


НоваяСтрока.КачественнаяНоменклатура = ПараметрыОбъекта.Получить("СсылкаНаКачественнуюНоменклатуру");

Выясним причину: почему ПараметрыОбъекта оказывается пустым? Это происходит потому, что на стороне базы-источника (УТ 10.3) при выгрузке конкретного объекта не была заполнена коллекция ПередаваемыеПараметры. Либо у объекта в источнике не заполнено поле качества, либо само ПКО вызывается в контексте, где передача параметров не предусмотрена.

Решение 1: Модификация кода обработчика «После загрузки»

Самый быстрый и надежный способ устранить ошибку — сделать код в приемнике (УТ 11) «безопасным». Мы не должны обращаться к методам объекта, не убедившись, что объект существует. Рассмотрим, как изменить код в правилах обмена (КД 2.0) или непосредственно в XML-файле правил.

Вместо прямого обращения заменим код на следующий алгоритм:


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

Объект.КодДляПоиска = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Объект.Код, Истина);

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

Решение 2: Использование блока Попытка...Исключение

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


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

Важный нюанс: этот метод может замедлить загрузку, если ошибок будет слишком много, так как генерация исключений в 1С — ресурсозатратная операция. Однако для разового переноса остатков это рабочее решение.

Решение 3: Проверка данных в источнике (УТ 10.3)

Посмотрим на ситуацию со стороны базы-источника. Ошибка часто возникает на конкретных позициях номенклатуры (например, как в логе автора — «Шлифмашина угловая BOSCH»). Проанализируем карточку этого товара в УТ 10.3:

  1. Откройте справочник Номенклатура в исходной базе.
  2. Найдите проблемный объект.
  3. Проверьте его реквизит «Качество». Если там указано значение, отличное от «Новый», проверьте, заполнена ли ссылка на основную (качественную) позицию.
  4. Если в базе-источнике есть битые ссылки в этих полях, правила КД 2.0 могут некорректно формировать структуру ПередаваемыеПараметры.

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

Разберем, как избежать повторения подобных ситуаций при переносе больших объемов данных:

Во-первых, всегда тестируйте выгрузку на малых выборках. Не стоит сразу пытаться загрузить все остатки. Выгрузите 10–20 позиций номенклатуры, включая те, что имеют статус брака.

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


Если ПараметрыОбъекта = Неопределено Тогда
    ЗаписьЖурналаРегистрации("ОшибкаПереноса", УровеньЖурналаРегистрации.Предупреждение, , , "Объект: " + Объект);
КонецЕсли;

В-третьих, обратите внимание на специфику УТ 11. В этой конфигурации нет прямого аналога реквизита «Качество» из 10.3. Вместо этого используется либо отдельная карточка номенклатуры, либо учет по сериям (в зависимости от настроек). Таблица ТаблицаСоответствияКачественнойИНекачественнойНоменклатуры, которую пытается заполнить обработчик, является временным хранилищем «Помощника перехода». Если вы не планируете разделять качественный и некачественный товар таким образом, код в обработчике можно просто закомментировать (поставив символ // перед строками), что позволит загрузить данные без ошибок.

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

← На главную