Как загрузить штрихкоды номенклатуры в Розницу 2.2 из УТ 11

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

Перенос штрихкодов между конфигурациями 1С:Управление торговлей 11 и 1С:Розница 2.2 нередко вызывает сложности как при использовании типовой синхронизации, так и при попытке прямой загрузки из внешних таблиц Excel. При попытке заполнить регистр сведений вручную или через универсальную обработку 1С выдает ошибку о том, что не задан тип штрихкода. Разберем по шагам причины этой ошибки, варианты её программного исправления и альтернативные способы надежного переноса данных.

Анализ ошибки: почему Розница требует тип штрихкода

В конфигурации 1С:Управление торговлей 11 данные штрихкодов хранятся в регистре сведений ШтрихкодыНоменклатуры, где ключевым полем выступает Номенклатура, а понятие типа штрихкода зачастую скрыто из экранных форм или определяется форматом по умолчанию. В конфигурации 1С:Розница 2.2 используется регистр сведений Штрихкоды, в котором измерение привязки товара называется Владелец (имеет составной тип данных), а измерение ТипШтрихкода является обязательным для заполнения.

Основная ошибка при программном заполнении или использовании универсальных обработок загрузки из Excel заключается в передаче типа штрихкода обычной строкой, например "EAN13". В метаданных Розницы 2.2 поле ТипШтрихкода имеет тип ссылки на план видов характеристик: ПланВидовХарактеристикСсылка.ТипыШтрихкодов. Если в это поле передается текстовое значение, платформа не может его неявно преобразовать, проверка заполнения реквизитов не проходит, и запись отклоняется.

Способ 1. Корректировка кода в обработке загрузки данных

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

Рассмотрим пример кода при записи строки регистра штрихкодов через менеджер записи:


МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Владелец = НайденнаяНоменклатура;
МенеджерЗаписи.Штрихкод = СокрЛП(СтрокаТаблицы.Штрихкод);

// Заполняем тип штрихкода предопределенным элементом плана видов характеристик
МенеджерЗаписи.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;

Попытка
    МенеджерЗаписи.Записать(Истина);
Исключение
    Сообщить("Ошибка при записи штрихкода: " + ОписаниеОшибки());
КонецПопытки;

Если вы настраиваете вычисляемое выражение в стандартной обработке загрузки табличных документов, в поле выражения для колонки ТипШтрихкода следует указать:

ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13

или воспользоваться поиском по наименованию, если тип штрихкода передается динамически из файла:


ПланыВидовХарактеристик.ТипыШтрихкодов.НайтиПоНаименованию(Строка(ТекущиеДанные.ТипШтрихкода))

Обратите внимание на формат ячеек в Excel: 13-значные цифровые штрихкоды при экспорте в таблицы часто автоматически переводятся Excel в экспоненциальную запись вида 4,60123E+12 либо теряют ведущие нули. Перед загрузкой колонка со штрихкодами должна быть принудительно отформатирована как строковый Текст, иначе типовой контроль длины и контрольного символа EAN-13 в Рознице заблокирует запись.

Способ 2. Настройка выгрузки через типовую синхронизацию EnterpriseData

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

Если штрихкоды в УТ были загружены отдельно от изменения самих карточек товаров, элементы справочника Номенклатура не модифицируются, а значит, платформа не регистрирует их на узле плана обмена. В результате пакет синхронизации уходит пустым.

Разберем по шагам, как принудительно отправить штрихкоды через существующий обмен:

  1. Откроем в Управлении торговлей обработку Регистрация изменений для обмена данными (доступна через раздел администрирования или «Все функции»).
  2. Найдем узел синхронизации с базой Розницы.
  3. Раскроем дерево метаданных, найдем справочник Номенклатура.
  4. Зарегистрируем к обмену весь справочник либо конкретную папку товаров, штрихкоды которых требуется передать.
  5. Выполним сеанс синхронизации данных. При выгрузке номенклатуры типовой механизм соберет все связанные записи из ШтрихкодыНоменклатуры и передаст их в Розницу, где они автоматически запишутся с корректным типом.

Способ 3. Прямой перенос через COM-соединение

Если файлов много, синхронизация не настроена, а через Excel работать неудобно из-за искажения данных, наиболее надежным способом выступает перенос напрямую между базами через V83.COMConnector.

Посмотрим на пример обработки в Рознице, подключающейся к базе УТ 11 и считывающей записи напрямую:


Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1C"";Ref=""UT11_Base"";Usr=""Admin"";Pwd=""Password"";";

Попытка
    Соединение = Коннектор.Connect(СтрокаПодключения);
Исключение
    ВызватьИсключение "Не удалось подключиться к базе УТ: " + ОписаниеОшибки();
КонецПопытки;

ЗапросCOM = Соединение.NewObject("Запрос");
ЗапросCOM.Текст = 
    "ВЫБРАТЬ
    |    Штрихкоды.Номенклатура.Артикул КАК Артикул,
    |    Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |    РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды";

Выборка = ЗапросCOM.Выполнить().Выбрать();

ТипEAN13 = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;

Пока Выборка.Следующий() Цикл
    СсылкаНаТовар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Артикул);
    Если Не ЗначениеЗаполнено(СсылкаНаТовар) Тогда
        Продолжить;
    КонецЕсли;
    
    МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Владелец = СсылкаНаТовар;
    МенеджерЗаписи.Штрихкод = СокрЛП(Выборка.Штрихкод);
    МенеджерЗаписи.ТипШтрихкода = ТипEAN13;
    
    Попытка
        МенеджерЗаписи.Записать(Истина);
    Исключение
        // Обработка дублей или некорректных кодов
    КонецПопытки;
КонецЦикла;

Оптимизация производительности при записи больших объемов

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

← На главную