При миграции данных между конфигурациями 1С часто возникает ситуация, когда меняется сама концепция учета. Типичный пример — переход из старых версий Управления торговлей (например, УТ 1.0) в Управление торговым предприятием (УТП), где учет по характеристикам может быть заменен на создание отдельных карточек номенклатуры для каждого сочетания "Товар + Характеристика". Одной из самых сложных задач в этом процессе является сохранение штрихкодов, так как в источнике они привязаны к связке объекта и характеристики, а в приемнике должны быть привязаны к новому элементу справочника Номенклатура.
В этой статье мы разберем, как правильно настроить правила конвертации данных (КД 2.0), чтобы штрихкоды "нашли" своих новых владельцев, проанализируем типичные ошибки программного поиска и рассмотрим наиболее эффективные стратегии трансформации.
Рассмотрим наиболее надежный архитектурный подход. Вместо того чтобы пытаться "склеивать" строки в обработчиках загрузки штрихкодов, мы можем настроить логику на уровне правил конвертации объектов (ПКО). Суть заключается в том, что в базе-приемнике Владельцем штрихкода всегда является СправочникСсылка.Номенклатура.
Для реализации этого метода выполним следующие шаги:
ХарактеристикиНоменклатуры, а Приемником — справочник Номенклатура.Наименования новой номенклатуры как "Наименование владельца (из источника) + Наименование характеристики".Штрихкоды для свойства Владелец укажем созданное нами правило.Таким образом, механизм КД 2.0 при выгрузке штрихкода увидит характеристику, обратится к соответствующему ПКО, создаст (или найдет) нужный элемент номенклатуры в приемнике и автоматически подставит ссылку на него в поле Владелец. Это исключает ошибки ручного поиска по строке.
Иногда требуется выгружать штрихкоды не как самостоятельный регистр, а в контексте выгрузки конкретной номенклатуры. Это позволяет более гибко управлять данными. Рассмотрим пример кода, который можно разместить в обработчике "После выгрузки" ПКО Номенклатура в базе-источнике.
Проанализируем ситуацию: нам нужно обойти все записи регистра Штрихкоды, относящиеся к текущей позиции, собрать их в структуру и отправить в приемник по правилу конвертации регистра.
Если НЕ Источник.ЭтоГруппа Тогда
Набор = РегистрыСведений.Штрихкоды.СоздатьНаборЗаписей;
Набор.Отбор.Владелец.Установить(Источник);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Владелец", Запись.Владелец);
СтруктураДанных.Вставить("ЕдиницаИзмерения", Запись.ЕдиницаИзмерения);
СтруктураДанных.Вставить("ТипШтрихкода", Запись.ТипШтрихкода);
СтруктураДанных.Вставить("ХарактеристикаНоменклатуры", Запись.ХарактеристикаНоменклатуры);
СтруктураДанных.Вставить("Штрихкод", Запись.Штрихкод);
// Выгружаем по правилу для регистра штрихкодов
ВыгрузитьПоПравилу(СтруктураДанных, , , , "Штрихкоды");
КонецЦикла;
КонецЕсли;
В данном примере мы используем функцию ВыгрузитьПоПравилу. Важно понимать, что в параметре МягкаяСсылка (пятый аргумент) мы передаем имя ПКО для регистра сведений. Это позволяет переносить записи регистра "на лету" вместе с объектом.
Если вы решили передавать данные через текстовые представления, вам придется реализовать поиск в обработчике "После загрузки" или "Поля поиска". Распространенная ошибка — попытка прямого обращения к свойствам объекта без проверки их типа или наличия ссылки.
Разберем, как правильно реализовать поиск Владельца, если в приемнике он должен соответствовать строке "Номенклатура + Характеристика":
// Ошибка часто возникает из-за обращения к Объект.Владелец.Наименование,
// когда Владелец еще не заполнен или является ссылкой на объект, которого нет в базе.
ИмяНоменклатуры = СокрЛП(Объект.Владелец.Наименование);
ИмяХарактеристики = "";
Если ЗначениеЗаполнено(Объект.ХарактеристикаНоменклатуры) Тогда
ИмяХарактеристики = " " + СокрЛП(Объект.ХарактеристикаНоменклатуры.Наименование);
КонецЕсли;
ПолноеНаименование = ИмяНоменклатуры + ИмяХарактеристики;
// Ищем созданный ранее элемент в справочнике приемника
НайденнаяСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ПолноеНаименование);
Если НЕ НайденнаяСсылка.Пустая() Тогда
Объект.Владелец = НайденнаяСсылка;
Иначе
// Логика на случай, если владелец не найден
Отказ = Истина;
КонецЕсли;
Важный момент: Чтобы избежать ошибки Значение не является значением объектного типа, всегда проверяйте, что Объект.Владелец — это действительно ссылка, а не пустая строка или неопределено. В КД 2.0 в обработчиках загрузки лучше использовать входящие данные (параметры), переданные из источника.
Проанализируем структуру конфигурации УТП 1.2 для Украины. В этой системе штрихкод жестко связан не только с Владельцем, но и с ЕдиницейИзмерения. Если при создании новой номенклатуры (на основе характеристики) вы не перенесете или не создадите для нее базовую единицу измерения, штрихкод может записаться "в никуда" — он будет существовать в базе, но не отобразится в карточке товара и не будет работать в подборе.
Рекомендуем при трансформации "Характеристика -> Номенклатура" выполнять следующие действия:
ЕдиницуИзмерения, принадлежащую именно новому владельцу.Для успешного переноса штрихкодов в условиях смены структуры справочников, мы рекомендуем придерживаться следующих правил:
Во-первых, старайтесь выполнять основную логику сопоставления в базе-источнике. Там у вас есть доступ ко всем связям (Номенклатура, Характеристика, Единица). Выгружайте в приемник уже "готовые" данные через временные структуры или дополнительные параметры.
Во-вторых, используйте возможности Полей поиска в ПКО. Это гораздо надежнее, чем написание запросов или методов НайтиПоНаименованию в обработчиках ПослеЗагрузки, так как КД сама управляет кэшированием объектов и очередностью их создания.
В-третьих, всегда учитывайте иерархию. Если штрихкоды переносятся для номенклатуры, которая создается из характеристик, убедитесь, что само правило создания этой номенклатуры выполняется раньше, чем загрузка записей регистра штрихкодов.