Как правильно сопоставить единицы измерения при переносе данных из ТиС 7.7 в УНФ 3.0 через КД 2.0?

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

При настройке правил обмена в Конвертации данных 2.0 (КД 2.0) для миграции данных из устаревших систем, таких как «1С:Торговля и Склад 7.7» (ТиС), в современные конфигурации на платформе 8.3, например «1С:Управление нашей фирмой 3.0» (УНФ), программисты часто сталкиваются с трудностями при сопоставлении подчиненных справочников. Одной из самых коварных проблем является перенос единиц измерения номенклатуры. Рассмотрим детально, почему возникает ошибка Значение не является значением объектного типа (ИмяТипа) и как правильно настроить правила конвертации свойств (ПКС), чтобы данные переносились корректно.

Разбор технической ошибки ИмяТипа

Проанализируем ситуацию: при загрузке данных в базу-приемник обработка УниверсальныйОбменДаннымиXML внезапно прерывается с ошибкой {Обработка.УниверсальныйОбменДаннымиXML(4611)}: Значение не является значением объектного типа (ИмяТипа). Эта ошибка указывает на то, что загрузчик ожидает структуру описания типа объекта (свойства ссылки), а вместо этого получает примитивный тип, например, строку или вообще неопределенное значение.

В контексте КД 2.0 это обычно происходит в следующих случаях:

  1. В правилах конвертации свойств (ПКС) для справочника не указано конкретное ПКО (Правило конвертации объекта).
  2. Тип источника в 7.7 (например, Справочник.Единицы) не может быть однозначно сопоставлен с типом приемника из-за различий в иерархии или структуре метаданных.
  3. Алгоритм поиска объекта возвращает строку вместо ссылки на объект, что сбивает с толку механизмы платформы 8.3 при попытке обращения к свойствам метаданных этого объекта.

Архитектурные различия между ТиС 7.7 и УНФ 3.0

Выясним причину конфликта, взглянув на структуру хранения единиц измерения в обеих системах. Без понимания этой разницы настроить качественный обмен практически невозможно.

В «1С:Торговля и Склад 7.7» структура выглядит так:

В «1С:Управление нашей фирмой 3.0» логика иная:

Почему сопоставление по Наименованию не работает?

Часто программисты пытаются настроить поиск единиц измерения по наименованию (например, "шт" или "кг"). Посмотрим на риски этого подхода:

Во-первых, в 7.7 наименования могут вводиться пользователями вручную с ошибками: "шт.", "шт", "ШТ", "штук". При загрузке система создаст дубли или не найдет соответствие. Во-вторых, так как справочник подчиненный, наименование "шт" может встретиться у тысячи товаров. Если не указан владелец в полях поиска, система может попытаться подставить единицу измерения от совершенно другой номенклатуры, что приведет к ошибкам в учете.

Правильная настройка: сопоставление по Коду (ОКЕИ)

Как показывает практика, наиболее надежным способом является использование кода ОКЕИ. В классификаторе единиц измерения код является уникальным числовым идентификатором (например, 796 для штук, 166 для килограммов).

Разберем по шагам, как настроить ПКО для единиц измерения:

  1. В ПКО ЕдиницыИзмерения выберите реквизиты, по которым будет идти поиск.
  2. Установите флаг Поиск для свойства Код (имеется в виду код из классификатора ОКЕИ, переданный из 7.7).
  3. Обязательно включите в поля поиска Владельца. Без владельца (ссылки на номенклатуру) сопоставление в подчиненном справочнике будет работать некорректно.
  4. В обработчике ПоляПоиска можно прописать дополнительную логику, если стандартного механизма недостаточно.

Пример программной настройки поиска в событии ПоляПоиска (ПКО ЕдиницыИзмерения):


// Проверим, переданы ли данные для поиска по коду
Если СвойстваПоиска.Найти("Код") <> Неопределено Тогда
    // Если поиск по идентификатору не дал результатов, 
    // система будет искать по комбинации Владелец + Код
    СтрокаИменСвойствПоиска = "Владелец, Код";
КонецЕсли;

Решение проблемы с пустыми единицами измерения

Если после загрузки номенклатура переносится, но поле единицы остается пустым, проанализируем ситуацию с обязательными реквизитами. В УНФ 3.0 объект СправочникСсылка.ЕдиницыИзмерения не будет записан, если не заполнен коэффициент.

Рассмотрим, как гарантировать заполнение коэффициента в правилах ПКС:

  1. Для свойства Коэффициент в ПКС установите Значение по умолчанию равным "1".
  2. Или пропишите в обработчике ПередЗагрузкой для объекта ЕдиницыИзмерения:

Если Объект.Коэффициент = 0 Тогда
    Объект.Коэффициент = 1;
КонецЕсли;

Использование программного поиска в ПКС Номенклатуры

Иногда более эффективным методом является поиск единицы измерения непосредственно в момент конвертации свойства номенклатуры. Вместо того чтобы полагаться на автоматический поиск ПКО, мы можем использовать обработчик ПоляПоиска или ПослеЗагрузки в ПКС ЕдиницаХранения.

Рассмотрим алгоритм:

  1. Передаем из 7.7 код базовой единицы из ОКЕИ.
  2. В приемнике ищем в КлассификаторЕдиницИзмерения элемент с таким кодом.
  3. Затем ищем в подчиненном справочнике ЕдиницыИзмерения запись, где Владелец = текущая номенклатура и ПараметрКлассификатора = найденная единица классификатора.
  4. Если не нашли — создаем новую запись.

Резюме и рекомендации

Подведем итог нашему исследованию задачи сопоставления единиц измерения при переходе с 7.7 на УНФ 3.0:

Во-первых, забудьте про поиск по наименованию. Это путь к дублям и ошибкам. Используйте только Код ОКЕИ.

Во-вторых, всегда учитывайте подчиненность. Единица измерения в 8.3 — это не просто "штуки", это "штуки для конкретного товара". В правилах сопоставления обязательно должен участвовать Владелец.

В-третьих, если вы получаете ошибку ИмяТипа, проверьте, что в ПКС передается именно объектная ссылка или данные, которые ПКО может однозначно превратить в ссылку. Передача "просто текста" в поле, ожидающее ссылку, без правильно настроенного поиска по коду, всегда приводит к падению загрузчика.

Применяя эти подходы, вы обеспечите чистоту данных и стабильность процесса миграции между версиями 1С.

← На главную