Переход с «1С:Управление торговлей 10.3» на версию 11 — это сложный процесс, который часто сопровождается использованием типовых или доработанных правил обмена, созданных в конфигурации «Конвертация данных 2.0». Одной из часто встречающихся проблем при загрузке данных является критическая ошибка в обработчиках событий, которая полностью останавливает процесс импорта. В этой статье мы подробно разберем ситуацию, когда при загрузке номенклатуры возникает ошибка: «Значение не является значением объектного типа (Получить)» в обработчике ПослеЗагрузкиОбъекта.
Проанализируем техническую суть проблемы. Ошибка указывает на то, что в коде обработчика происходит обращение к переменной (в данном случае ПараметрыОбъекта) так, будто это объект (Структура или Соответствие), имеющий метод Получить(). Однако на момент выполнения кода эта переменная имеет значение Неопределено.
В контексте переноса данных из УТ 10 в УТ 11 это обычно происходит в правилах конвертации объектов (ПКО), отвечающих за номенклатуру с разным качеством (Брак, Подпорчен и т.д.). Рассмотрим строку кода, на которой «спотыкается» система:
НоваяСтрока.КачественнаяНоменклатура = ПараметрыОбъекта.Получить("СсылкаНаКачественнуюНоменклатуру");
Выясним причину: почему ПараметрыОбъекта оказывается пустым? Это происходит потому, что на стороне базы-источника (УТ 10.3) при выгрузке конкретного объекта не была заполнена коллекция ПередаваемыеПараметры. Либо у объекта в источнике не заполнено поле качества, либо само ПКО вызывается в контексте, где передача параметров не предусмотрена.
Самый быстрый и надежный способ устранить ошибку — сделать код в приемнике (УТ 11) «безопасным». Мы не должны обращаться к методам объекта, не убедившись, что объект существует. Рассмотрим, как изменить код в правилах обмена (КД 2.0) или непосредственно в XML-файле правил.
Вместо прямого обращения заменим код на следующий алгоритм:
// Проверяем, что параметры объекта вообще переданы
Если ПараметрыОбъекта <> Неопределено Тогда
// Используем метод Свойство, чтобы избежать ошибки, если ключа нет в структуре
СсылкаНаКачественную = Неопределено;
Если ПараметрыОбъекта.Свойство("СсылкаНаКачественнуюНоменклатуру", СсылкаНаКачественную) Тогда
ТаблицаСоответствия = Параметры.ТаблицаСоответствияКачественнойИНекачественнойНоменклатуры;
НоваяСтрока = ТаблицаСоответствия.Добавить();
НоваяСтрока.КачественнаяНоменклатура = СсылкаНаКачественную;
Если Объект.ЭтоНовый() Тогда
Объект.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор()));
НоваяСтрока.НекачественнаяНоменклатура = Объект.ПолучитьСсылкуНового();
Иначе
НоваяСтрока.НекачественнаяНоменклатура = Ссылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Объект.КодДляПоиска = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Объект.Код, Истина);
Использование метода Свойство() вместо Получить() позволяет системе мягко пропустить заполнение таблицы соответствия, если данных о качестве нет, и продолжить загрузку остальных реквизитов справочника Номенклатура.
Если вы не хотите глубоко разбираться в логике передачи параметров, но вам нужно, чтобы выгрузка «прошла до конца», можно обернуть проблемный участок в блок обработки исключений. Рассмотрим этот пример:
Попытка
НоваяСтрока.КачественнаяНоменклатура = ПараметрыОбъекта.Получить("СсылкаНаКачественнуюНоменклатуру");
Исключение
// Если параметров нет, просто игнорируем заполнение этой строки
КонецПопытки;
Важный нюанс: этот метод может замедлить загрузку, если ошибок будет слишком много, так как генерация исключений в 1С — ресурсозатратная операция. Однако для разового переноса остатков это рабочее решение.
Посмотрим на ситуацию со стороны базы-источника. Ошибка часто возникает на конкретных позициях номенклатуры (например, как в логе автора — «Шлифмашина угловая BOSCH»). Проанализируем карточку этого товара в УТ 10.3:
Номенклатура в исходной базе.ПередаваемыеПараметры.Разберем, как избежать повторения подобных ситуаций при переносе больших объемов данных:
Во-первых, всегда тестируйте выгрузку на малых выборках. Не стоит сразу пытаться загрузить все остатки. Выгрузите 10–20 позиций номенклатуры, включая те, что имеют статус брака.
Во-вторых, используйте отладчик. Чтобы понять, почему ПараметрыОбъекта превращаются в Неопределено, можно вставить в код обработчика команду ОстановитьВыполнение() (если загрузка идет через обработку УниверсальныйОбменДаннымиXML) или записать сообщение в журнал регистрации:
Если ПараметрыОбъекта = Неопределено Тогда
ЗаписьЖурналаРегистрации("ОшибкаПереноса", УровеньЖурналаРегистрации.Предупреждение, , , "Объект: " + Объект);
КонецЕсли;
В-третьих, обратите внимание на специфику УТ 11. В этой конфигурации нет прямого аналога реквизита «Качество» из 10.3. Вместо этого используется либо отдельная карточка номенклатуры, либо учет по сериям (в зависимости от настроек). Таблица ТаблицаСоответствияКачественнойИНекачественнойНоменклатуры, которую пытается заполнить обработчик, является временным хранилищем «Помощника перехода». Если вы не планируете разделять качественный и некачественный товар таким образом, код в обработчике можно просто закомментировать (поставив символ // перед строками), что позволит загрузить данные без ошибок.
Таким образом, мы выяснили, что ошибка вызвана отсутствием данных в параметрах объекта. Применяя безопасное обращение к свойствам структуры или исправляя данные в источнике, вы сможете успешно завершить перенос остатков в новую информационную систему.