При настройке правил обмена в Конвертации данных 2.0 (КД 2.0) для миграции данных из устаревших систем, таких как «1С:Торговля и Склад 7.7» (ТиС), в современные конфигурации на платформе 8.3, например «1С:Управление нашей фирмой 3.0» (УНФ), программисты часто сталкиваются с трудностями при сопоставлении подчиненных справочников. Одной из самых коварных проблем является перенос единиц измерения номенклатуры. Рассмотрим детально, почему возникает ошибка Значение не является значением объектного типа (ИмяТипа) и как правильно настроить правила конвертации свойств (ПКС), чтобы данные переносились корректно.
Проанализируем ситуацию: при загрузке данных в базу-приемник обработка УниверсальныйОбменДаннымиXML внезапно прерывается с ошибкой {Обработка.УниверсальныйОбменДаннымиXML(4611)}: Значение не является значением объектного типа (ИмяТипа). Эта ошибка указывает на то, что загрузчик ожидает структуру описания типа объекта (свойства ссылки), а вместо этого получает примитивный тип, например, строку или вообще неопределенное значение.
В контексте КД 2.0 это обычно происходит в следующих случаях:
Справочник.Единицы) не может быть однозначно сопоставлен с типом приемника из-за различий в иерархии или структуре метаданных.Выясним причину конфликта, взглянув на структуру хранения единиц измерения в обеих системах. Без понимания этой разницы настроить качественный обмен практически невозможно.
В «1С:Торговля и Склад 7.7» структура выглядит так:
Номенклатура.БазоваяЕдиница и ОсновнаяЕдиница.Единицы.Единицы содержит ссылку на глобальный классификатор ОКЕИ.В «1С:Управление нашей фирмой 3.0» логика иная:
ЕдиницаХранения и ЕдиницаДляОтчетов.ЕдиницыИзмерения.КлассификаторомЕдиницИзмерения.Владелец (номенклатура) и Коэффициент (который для базовой единицы всегда равен 1).Часто программисты пытаются настроить поиск единиц измерения по наименованию (например, "шт" или "кг"). Посмотрим на риски этого подхода:
Во-первых, в 7.7 наименования могут вводиться пользователями вручную с ошибками: "шт.", "шт", "ШТ", "штук". При загрузке система создаст дубли или не найдет соответствие. Во-вторых, так как справочник подчиненный, наименование "шт" может встретиться у тысячи товаров. Если не указан владелец в полях поиска, система может попытаться подставить единицу измерения от совершенно другой номенклатуры, что приведет к ошибкам в учете.
Как показывает практика, наиболее надежным способом является использование кода ОКЕИ. В классификаторе единиц измерения код является уникальным числовым идентификатором (например, 796 для штук, 166 для килограммов).
Разберем по шагам, как настроить ПКО для единиц измерения:
ЕдиницыИзмерения выберите реквизиты, по которым будет идти поиск.Код (имеется в виду код из классификатора ОКЕИ, переданный из 7.7).Владельца. Без владельца (ссылки на номенклатуру) сопоставление в подчиненном справочнике будет работать некорректно.ПоляПоиска можно прописать дополнительную логику, если стандартного механизма недостаточно.Пример программной настройки поиска в событии ПоляПоиска (ПКО ЕдиницыИзмерения):
// Проверим, переданы ли данные для поиска по коду
Если СвойстваПоиска.Найти("Код") <> Неопределено Тогда
// Если поиск по идентификатору не дал результатов,
// система будет искать по комбинации Владелец + Код
СтрокаИменСвойствПоиска = "Владелец, Код";
КонецЕсли;
Если после загрузки номенклатура переносится, но поле единицы остается пустым, проанализируем ситуацию с обязательными реквизитами. В УНФ 3.0 объект СправочникСсылка.ЕдиницыИзмерения не будет записан, если не заполнен коэффициент.
Рассмотрим, как гарантировать заполнение коэффициента в правилах ПКС:
Коэффициент в ПКС установите Значение по умолчанию равным "1".ПередЗагрузкой для объекта ЕдиницыИзмерения:
Если Объект.Коэффициент = 0 Тогда
Объект.Коэффициент = 1;
КонецЕсли;
Иногда более эффективным методом является поиск единицы измерения непосредственно в момент конвертации свойства номенклатуры. Вместо того чтобы полагаться на автоматический поиск ПКО, мы можем использовать обработчик ПоляПоиска или ПослеЗагрузки в ПКС ЕдиницаХранения.
Рассмотрим алгоритм:
КлассификаторЕдиницИзмерения элемент с таким кодом.ЕдиницыИзмерения запись, где Владелец = текущая номенклатура и ПараметрКлассификатора = найденная единица классификатора.Подведем итог нашему исследованию задачи сопоставления единиц измерения при переходе с 7.7 на УНФ 3.0:
Во-первых, забудьте про поиск по наименованию. Это путь к дублям и ошибкам. Используйте только Код ОКЕИ.
Во-вторых, всегда учитывайте подчиненность. Единица измерения в 8.3 — это не просто "штуки", это "штуки для конкретного товара". В правилах сопоставления обязательно должен участвовать Владелец.
В-третьих, если вы получаете ошибку ИмяТипа, проверьте, что в ПКС передается именно объектная ссылка или данные, которые ПКО может однозначно превратить в ссылку. Передача "просто текста" в поле, ожидающее ссылку, без правильно настроенного поиска по коду, всегда приводит к падению загрузчика.
Применяя эти подходы, вы обеспечите чистоту данных и стабильность процесса миграции между версиями 1С.