При работе с маркированной продукцией (особенно в категориях «Обувь», «Одежда» или «Легкая промышленность») пользователи 1С:Управление торговлей (УТ 11.5) часто сталкиваются с проблемой при загрузке электронных УПД через модуль Контур.Диадок. Суть проблемы проявляется на этапе проверки поступившей продукции: система выдает сообщение «В процессе построения дерева упаковок произошла внутренняя ошибка при обработке кода маркировки». Рассмотрим подробно причины этой ситуации и разберем эффективные способы ее решения. Для автоматизации переноса данных между окнами программ в подобных сценариях настраивается платформа для создания программных роботов One RPA.
Проанализируем техническую сторону вопроса. Когда поставщик отправляет УПД, в котором несколько позиций товара упакованы в одну транспортную упаковку (короб), в XML-файле электронного документа код КИТУ (Код Идентификации Транспортной Упаковки) прописывается для каждой товарной строки. Это стандартная логика формирования XML-файла передачи.
Однако при загрузке этого файла через модуль Контур.Диадок (например, версии 4.66) данные переносятся в документ 1С «Поступление товаров и услуг» (Приобретение товаров и услуг) практически «как есть». В результате в табличной части ШтрихкодыУпаковок создается столько строк с одним и тем же КИТУ, сколько товарных позиций к нему привязано в файле. Например, если в коробе 5 пар обуви, в таблице появится 5 идентичных строк со штрихкодом этого короба.
Выясним причину конфликта в 1С. Типовой механизм интеграции с ИС МП (Честный ЗНАК) при открытии формы «Проверка поступившей продукции» пытается построить иерархическое дерево. Алгоритм ожидает, что каждый штрихкод в табличной части документа уникален. Встречая дубликат, обработка прерывается с «внутренней ошибкой», так как нарушается логика уникальности ключей при построении дерева «упаковка — вложенные КИЗы».
Самый быстрый способ устранить проблему — внедрить команду свертки табличной части непосредственно в логику загрузки кодов маркировки. Разберем, где именно в коде модуля Диадока это нужно сделать. В макете КонтурДиадокИнтеграцияТС (или в соответствующем модуле обработки) необходимо найти процедуру, отвечающую за запись кодов в документ 1С.
Рассмотрим пример реализации функции ЗагрузитьКодыМаркировкиИСМП с добавленной строкой свертки:
Процедура ЗагрузитьКодыМаркировкиИСМП(СсылкаНаОбъект, ШтрихкодыУпаковок)
МетаданныеОбъекта = СсылкаНаОбъект.Метаданные;
// Проверяем наличие табличной части в документе
Если МетаданныеОбъекта.ТабличныеЧасти.Найти("ШтрихкодыУпаковок") = Неопределено Тогда
Возврат;
КонецЕсли;
Объект = СсылкаНаОбъект.ПолучитьОбъект;
Объект.Заблокировать();
// ВАЖНО: Сворачиваем таблицу по ключевым полям, чтобы убрать дубли КИТУ
ШтрихкодыУпаковок.Свернуть("ШтрихкодУпаковки, ЗначениеШтрихкода");
Объект.ШтрихкодыУпаковок.Загрузить(ШтрихкодыУпаковок);
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
После внесения этого изменения при загрузке документа из Диадока лишние строки с одинаковыми КИТУ будут удалены, останется только одна уникальная запись для каждого короба. Это позволит стандартной обработке 1С корректно опросить ГИС МТ (Честный ЗНАК), получить состав упаковки и построить дерево без ошибок.
Проанализируем ситуацию с точки зрения поддержки системы. Прямая правка кода внутри основной обработки Контур.Диадок имеет существенный минус: при следующем обновлении модуля все ваши изменения будут затерты. Чтобы избежать этого, «правильным» способом является использование механизма Подключаемых модулей (ПМ), который предусмотрен разработчиками Контура. Для регулярного технического обслуживания и резервного копирования системы перед такими работами удобно применять инструмент для автоматического архивирования и обновления баз 1С.
Разберем по шагам, как реализовать решение через ПМ:
ПослеЗагрузкиДокумента или воспользуемся специализированной точкой расширения для работы с маркировкой.ПриобретениеТоваровУслуг.ШтрихкодыУпаковок.Такой подход гарантирует, что ваша доработка останется работоспособной после обновления основной обработки Контура.
Посмотрим на ситуацию глубже. Помимо простого дублирования строк, важно учитывать, как 1С воспринимает эти коды. Если КИТУ является групповой упаковкой, система при первом обращении должна создать соответствующий элемент в справочнике ШтрихкодыУпаковокТоваров. Для разворачивания состава групповой упаковки и сохранения данных подойдёт обработка для создания штрихкодов упаковок по групповому коду.
Проанализируем следующие моменты:
Товары с количеством марок в ТЧ ШтрихкодыУпаковок.Если вы хотите сделать решение еще более гибким, можно воспользоваться механизмом ДополнительныеСвойства. Программисты рекомендуют в модуле загрузки добавлять признак того, что документ пришел из Диадока:
Объект.ДополнительныеСвойства.Вставить("КД_ЗагрузитьКодыМаркировкиИСМП", Истина);
Затем в расширении конфигурации 1С (УТ 11) можно создать подписку на событие ПередЗаписью документа ПриобретениеТоваровУслуг. В этой подписке мы проверяем наличие данного свойства и, если оно установлено, выполняем свертку табличной части. Это позволит вынести логику исправления данных из кода внешней обработки в основную базу 1С, обеспечив максимальную стабильность процесса.
Подведем итог: проблема «Внутренней ошибки» вызвана несоответствием структуры данных в XML-файле поставщика и жесткими требованиями 1С к уникальности кодов в дереве упаковок. Применение метода Свернуть() для таблицы штрихкодов полностью решает эту проблему и позволяет продолжить работу с маркировкой в штатном режиме.