При настройке обмена данными через конфигурацию «Конвертация данных 2.1» (КД 2.1) специалисты часто сталкиваются с ситуацией, когда штрихкоды номенклатуры либо не переносятся вовсе, либо создаются в базе-приемнике с пустыми значениями. Ситуация осложняется тем, что штрихкоды обычно хранятся в независимых регистрах сведений, а их владельцами могут выступать объекты разных типов: номенклатура, характеристики или информационные карты. Рассмотрим подробно, как правильно настроить правила обмена, избежать ошибок типизации и программно управлять процессом выгрузки.
В типовых конфигурациях 1С реквизит Владелец в регистре штрихкодов имеет составной тип. Если мы хотим вручную управлять тем, по какому правилу конвертации объектов (ПКО) будет выгружаться владелец, мы используем обработчик «Перед выгрузкой» в соответствующем правиле конвертации свойства (ПКС). Проанализируем типичный пример кода, который может привести к логическим ошибкам:
Если ТипЗнч(Источник.Владелец) = Тип("СправочникСсылка.ИнформационныеКарты") Тогда
ИмяПКО = "ИнформационныеКарты";
Иначе
ИмяПКО = "Номенклатура";
Если ТипЗнч(Источник.Владелец) = Тип("СправочникСсылка.СерийныеНомера") Тогда
Значение = Источник.Владелец.Владелец;
КонецЕсли;
КонецЕсли;
В данном примере мы видим попытку перенаправить выгрузку на разные ПКО в зависимости от типа. Однако стоит обратить внимание на важный нюанс: если для всех типов (Номенклатура, Информационные карты) уже созданы соответствующие ПКО в конвертации, поле ИмяПКО в ПКС лучше оставлять пустым. Система КД 2.1 автоматически определит нужное правило по типу объекта. Ручное указание ИмяПКО требуется только тогда, когда вы хотите принудительно использовать нестандартное правило или когда тип источника и приемника принципиально различаются.
Рассмотрим причину возникновения ошибки, которая часто ставит разработчиков в тупик при выгрузке штрихкодов. Текст ошибки обычно указывает на то, что обработка УниверсальныйОбменДаннымиXML пытается обратиться к свойству объекта, который на самом деле является примитивным типом (строкой).
Выясним причину: это происходит, когда в ПКС (например, для типа штрихкода) указано конкретное ПКО, но в качестве источника передается строка, а не ссылка на объект Плана видов характеристик или справочника. Проанализируем ситуацию: если в базе-источнике тип штрихкода — это строка «EAN13», а ПКО ТипыШтрихкодов ожидает объект со свойствами Наименование и Код, механизм конвертации пытается «разложить» строку на свойства и выдает ошибку Получение элемента по индексу.
Решение проблемы:
Значение ссылку, а не текст.Иногда стандартная выгрузка регистра не подходит (например, нужно отфильтровать штрихкоды только для определенных видов номенклатуры). В этом случае мы используем Правило выгрузки данных (ПВД) с типом выборки «Произвольный алгоритм». Посмотрим на пример реализации запроса:
Запрос = Новый Запрос("
|ВЫБРАТЬ
| Штрихкоды.Штрихкод КАК Штрихкод,
| Штрихкоды.ТипШтрихкода КАК ТипШтрихкода,
| Штрихкоды.Владелец КАК Владелец,
| Штрихкоды.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец ССЫЛКА Справочник.Номенклатура");
ВыборкаДанных = Запрос.Выполнить().Выбрать();
Важные моменты при использовании запроса:
ВыборкаДанных.КАК) должны строго совпадать с именами свойств в ПКС, если вы не используете программное заполнение.Когда файл выгрузки достигает внушительных размеров (например, 5 Гб), найти в нем причину отсутствия штрихкодов невозможно. Рассмотрим правильный алгоритм отладки:
ЗаписьРегистра отсутствует тег со свойством Штрихкод, значит, проблема в настройках ПКС (возможно, стоит флаг «Отключить» или неверно указан источник).ПриВыгрузке или ПослеВыгрузки нет кода, который принудительно очищает Значение или устанавливает Отказ = Истина.Часто возникает вопрос: нужно ли прописывать правила конвертации для перечислений (например, для типа штрихкода EAN13)? Как показывает практика, если значения перечислений в источнике и приемнике называются идентично, дополнительные правила (ПКО) создавать не обязательно. Система сопоставит их по имени. Если же в ПКС Строка преобразуется в Строку, достаточно оставить поле ПКО пустым — это самый надежный способ избежать ошибок обращения к индексу объекта.
Резюмируем: Для успешного переноса штрихкодов необходимо четко следить за соответствием типов данных (объект/ссылка vs строка) и правильно настраивать ключевые поля поиска в регистре сведений. При программном определении владельца через ИмяПКО всегда проверяйте, чтобы переданное значение соответствовало ожидаемому правилу.