Перенос штрихкодов между конфигурациями 1С:Управление торговлей 11 и 1С:Розница 2.2 нередко вызывает сложности как при использовании типовой синхронизации, так и при попытке прямой загрузки из внешних таблиц Excel. При попытке заполнить регистр сведений вручную или через универсальную обработку 1С выдает ошибку о том, что не задан тип штрихкода. Разберем по шагам причины этой ошибки, варианты её программного исправления и альтернативные способы надежного переноса данных.
В конфигурации 1С:Управление торговлей 11 данные штрихкодов хранятся в регистре сведений ШтрихкодыНоменклатуры, где ключевым полем выступает Номенклатура, а понятие типа штрихкода зачастую скрыто из экранных форм или определяется форматом по умолчанию. В конфигурации 1С:Розница 2.2 используется регистр сведений Штрихкоды, в котором измерение привязки товара называется Владелец (имеет составной тип данных), а измерение ТипШтрихкода является обязательным для заполнения.
Основная ошибка при программном заполнении или использовании универсальных обработок загрузки из Excel заключается в передаче типа штрихкода обычной строкой, например "EAN13". В метаданных Розницы 2.2 поле ТипШтрихкода имеет тип ссылки на план видов характеристик: ПланВидовХарактеристикСсылка.ТипыШтрихкодов. Если в это поле передается текстовое значение, платформа не может его неявно преобразовать, проверка заполнения реквизитов не проходит, и запись отклоняется.
Если для загрузки из Excel используется доработанная внешняя обработка или стандартная обработка «Загрузка данных из табличного документа», выясним причину сбоя и исправим присвоение реквизита. Вместо текстового наименования необходимо получить ссылку на соответствующий предопределенный элемент или найти его по наименованию.
Рассмотрим пример кода при записи строки регистра штрихкодов через менеджер записи:
МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Владелец = НайденнаяНоменклатура;
МенеджерЗаписи.Штрихкод = СокрЛП(СтрокаТаблицы.Штрихкод);
// Заполняем тип штрихкода предопределенным элементом плана видов характеристик
МенеджерЗаписи.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
Сообщить("Ошибка при записи штрихкода: " + ОписаниеОшибки());
КонецПопытки;
Если вы настраиваете вычисляемое выражение в стандартной обработке загрузки табличных документов, в поле выражения для колонки ТипШтрихкода следует указать:
ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13
или воспользоваться поиском по наименованию, если тип штрихкода передается динамически из файла:
ПланыВидовХарактеристик.ТипыШтрихкодов.НайтиПоНаименованию(Строка(ТекущиеДанные.ТипШтрихкода))
Обратите внимание на формат ячеек в Excel: 13-значные цифровые штрихкоды при экспорте в таблицы часто автоматически переводятся Excel в экспоненциальную запись вида 4,60123E+12 либо теряют ведущие нули. Перед загрузкой колонка со штрихкодами должна быть принудительно отформатирована как строковый Текст, иначе типовой контроль длины и контрольного символа EAN-13 в Рознице заблокирует запись.
Проанализируем ситуацию, когда базы уже связаны типовым обменом, но штрихкоды не поступают в Розницу. В формате EnterpriseData штрихкоды не мигрируют как отдельный независимый регистр. Они передаются вложенным списком в составе объекта справочника Номенклатура.
Если штрихкоды в УТ были загружены отдельно от изменения самих карточек товаров, элементы справочника Номенклатура не модифицируются, а значит, платформа не регистрирует их на узле плана обмена. В результате пакет синхронизации уходит пустым.
Разберем по шагам, как принудительно отправить штрихкоды через существующий обмен:
Номенклатура.ШтрихкодыНоменклатуры и передаст их в Розницу, где они автоматически запишутся с корректным типом.Если файлов много, синхронизация не настроена, а через Excel работать неудобно из-за искажения данных, наиболее надежным способом выступает перенос напрямую между базами через V83.COMConnector.
Посмотрим на пример обработки в Рознице, подключающейся к базе УТ 11 и считывающей записи напрямую:
Коннектор = Новый COMОбъект("V83.COMConnector");
СтрокаПодключения = "Srvr=""Server1C"";Ref=""UT11_Base"";Usr=""Admin"";Pwd=""Password"";";
Попытка
Соединение = Коннектор.Connect(СтрокаПодключения);
Исключение
ВызватьИсключение "Не удалось подключиться к базе УТ: " + ОписаниеОшибки();
КонецПопытки;
ЗапросCOM = Соединение.NewObject("Запрос");
ЗапросCOM.Текст =
"ВЫБРАТЬ
| Штрихкоды.Номенклатура.Артикул КАК Артикул,
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды";
Выборка = ЗапросCOM.Выполнить().Выбрать();
ТипEAN13 = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
Пока Выборка.Следующий() Цикл
СсылкаНаТовар = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Выборка.Артикул);
Если Не ЗначениеЗаполнено(СсылкаНаТовар) Тогда
Продолжить;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Владелец = СсылкаНаТовар;
МенеджерЗаписи.Штрихкод = СокрЛП(Выборка.Штрихкод);
МенеджерЗаписи.ТипШтрихкода = ТипEAN13;
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
// Обработка дублей или некорректных кодов
КонецПопытки;
КонецЦикла;
При переносе десятков тысяч штрихкодов построчная запись через СоздатьМенеджерЗаписи() работает медленно, так как каждая итерация инициирует отдельную транзакцию и полный стек проверок. Для ускорения процесса рекомендуется использовать СоздатьНаборЗаписей() с установкой отбора по владельцу либо выполнять запись порциями в рамках единой транзакции с помощью конструкции НачатьТранзакцию() и ЗафиксироватьТранзакцию().