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