Почему не выгружаются штрихкоды в 1С:Конвертация данных 2.1 и как это исправить?

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

При настройке обмена данными через конфигурацию «Конвертация данных 2.1» (КД 2.1) специалисты часто сталкиваются с ситуацией, когда штрихкоды номенклатуры либо не переносятся вовсе, либо создаются в базе-приемнике с пустыми значениями. Ситуация осложняется тем, что штрихкоды обычно хранятся в независимых регистрах сведений, а их владельцами могут выступать объекты разных типов: номенклатура, характеристики или информационные карты. Рассмотрим подробно, как правильно настроить правила обмена, избежать ошибок типизации и программно управлять процессом выгрузки.

Проблема 1. Программное определение ПКО для составного типа «Владелец»

В типовых конфигурациях 1С реквизит Владелец в регистре штрихкодов имеет составной тип. Если мы хотим вручную управлять тем, по какому правилу конвертации объектов (ПКО) будет выгружаться владелец, мы используем обработчик «Перед выгрузкой» в соответствующем правиле конвертации свойства (ПКС). Проанализируем типичный пример кода, который может привести к логическим ошибкам:


Если ТипЗнч(Источник.Владелец) = Тип("СправочникСсылка.ИнформационныеКарты") Тогда
    ИмяПКО = "ИнформационныеКарты";
Иначе
    ИмяПКО = "Номенклатура";
    Если ТипЗнч(Источник.Владелец) = Тип("СправочникСсылка.СерийныеНомера") Тогда
        Значение = Источник.Владелец.Владелец;
    КонецЕсли;
КонецЕсли;

В данном примере мы видим попытку перенаправить выгрузку на разные ПКО в зависимости от типа. Однако стоит обратить внимание на важный нюанс: если для всех типов (Номенклатура, Информационные карты) уже созданы соответствующие ПКО в конвертации, поле ИмяПКО в ПКС лучше оставлять пустым. Система КД 2.1 автоматически определит нужное правило по типу объекта. Ручное указание ИмяПКО требуется только тогда, когда вы хотите принудительно использовать нестандартное правило или когда тип источника и приемника принципиально различаются.

Проблема 2. Ошибка «Получение элемента по индексу для значения не определено»

Рассмотрим причину возникновения ошибки, которая часто ставит разработчиков в тупик при выгрузке штрихкодов. Текст ошибки обычно указывает на то, что обработка УниверсальныйОбменДаннымиXML пытается обратиться к свойству объекта, который на самом деле является примитивным типом (строкой).

Выясним причину: это происходит, когда в ПКС (например, для типа штрихкода) указано конкретное ПКО, но в качестве источника передается строка, а не ссылка на объект Плана видов характеристик или справочника. Проанализируем ситуацию: если в базе-источнике тип штрихкода — это строка «EAN13», а ПКО ТипыШтрихкодов ожидает объект со свойствами Наименование и Код, механизм конвертации пытается «разложить» строку на свойства и выдает ошибку Получение элемента по индексу.

Решение проблемы:

  1. Если штрихкод в приемнике — это просто строка, убедитесь, что в ПКС для этого свойства не указано никакое ПКО.
  2. Если в источнике данные представлены строкой, а в приемнике должен быть объект, используйте обработчик «Перед выгрузкой» для поиска или создания объекта по наименованию, передавая в Значение ссылку, а не текст.

Проблема 3. Выгрузка штрихкодов с помощью произвольного запроса

Иногда стандартная выгрузка регистра не подходит (например, нужно отфильтровать штрихкоды только для определенных видов номенклатуры). В этом случае мы используем Правило выгрузки данных (ПВД) с типом выборки «Произвольный алгоритм». Посмотрим на пример реализации запроса:


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

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

Важные моменты при использовании запроса:

Методика отладки при больших объемах данных

Когда файл выгрузки достигает внушительных размеров (например, 5 Гб), найти в нем причину отсутствия штрихкодов невозможно. Рассмотрим правильный алгоритм отладки:

  1. Создайте тестовый набор данных: Выберите одну позицию номенклатуры, у которой точно есть штрихкод в базе-источнике.
  2. Настройте ПВД: В правиле выгрузки установите отбор по этой конкретной ссылке.
  3. Проанализируйте XML: В полученном небольшом файле найдите узел, соответствующий вашему регистру. Если внутри узла ЗаписьРегистра отсутствует тег со свойством Штрихкод, значит, проблема в настройках ПКС (возможно, стоит флаг «Отключить» или неверно указан источник).
  4. Проверьте обработчики: Убедитесь, что в обработчиках ПриВыгрузке или ПослеВыгрузки нет кода, который принудительно очищает Значение или устанавливает Отказ = Истина.

Особенности конвертации для перечислений и типов штрихкодов

Часто возникает вопрос: нужно ли прописывать правила конвертации для перечислений (например, для типа штрихкода EAN13)? Как показывает практика, если значения перечислений в источнике и приемнике называются идентично, дополнительные правила (ПКО) создавать не обязательно. Система сопоставит их по имени. Если же в ПКС Строка преобразуется в Строку, достаточно оставить поле ПКО пустым — это самый надежный способ избежать ошибок обращения к индексу объекта.

Резюмируем: Для успешного переноса штрихкодов необходимо четко следить за соответствием типов данных (объект/ссылка vs строка) и правильно настраивать ключевые поля поиска в регистре сведений. При программном определении владельца через ИмяПКО всегда проверяйте, чтобы переданное значение соответствовало ожидаемому правилу.

← На главную