Как восстановить возможность повторной печати кодов маркировки после их ввода в оборот в 1С:УТ 11.5?

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

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

В этой статье мы подробно разберем, почему это происходит, как устроена архитектура хранения кодов маркировки в 1С и какими программными методами можно вернуть возможность печати затертых или поврежденных марок.

Разберем причину: почему коды исчезают из базы?

Для начала проанализируем логику работы подсистемы ИС МП (Информационная система маркировки продукции). В 1С коды хранятся в нескольких регистрах. Основным для печати является регистр сведений ПулКодовМаркировкиСУЗ. Именно в нем содержится полная строка кода маркировки, включающая так называемый «криптохвост» (код проверки). Без этого хвоста сформировать корректный DataMatrix невозможно. В ситуациях, когда стандартные механизмы дают сбой, пользователям часто помогает специальный отчет для печати кодов маркировки с криптохвостом непосредственно из заказов на эмиссию. С этой задачей справится отчет для печати кодов маркировки с криптохвостом.

Разработчики 1С реализовали механизм «автоматической гигиены» базы данных. Логика системы следующая: если код введен в оборот, значит, он уже нанесен на товар, и хранить его полный текст с криптохвостом в базе больше не нужно. Это позволяет экономить дисковое пространство, так как при больших оборотах таблица пула может разрастаться до гигантских размеров. Однако перед началом работы важно убедиться в корректности всех реквизитов, чтобы избежать ошибок при вводе в оборот.

Однако на практике в торговых залах и на складах этикетки часто повреждаются, затираются или теряются. В этом случае требуется повторная печать, но данных в ПулКодовМаркировкиСУЗ уже нет — они были удалены автоматически сразу после подтверждения обмена с ГИС МТ. Для этой задачи можно использовать обработку для повторной печати кодов маркировки.

Выясним, где именно происходит удаление данных

Проанализируем программный код. Исследование показывает, что за очистку отвечает процедура в модуле менеджера регистра сведений ПулКодовМаркировкиСУЗ. Рассмотрим процедуру ОчисткаПулаКодовМаркировкиПоОтчетуОНанесении. Она инициируется документами обмена в момент изменения их статуса на финальный.

Многие ошибочно полагают, что удаление происходит регламентным заданием, и пытаются отключить его или изменить константу Срок хранения использованных кодов маркировки в пуле. Но в новых релизах УТ 11.5 очистка жестко прописана в логике проведения документов, и настройки регламентов на этот процесс не влияют.

Решение проблемы через модификацию кода

Если нам необходимо сохранить коды в пуле для обеспечения возможности их печати в будущем, мы должны вмешаться в работу процедуры очистки. Если же вам требуется оперативно решить вопрос без глубокой модификации, может подойти обработка для печати кодов маркировки с порядковыми номерами и повторной печати. Для этого подойдёт расширение для повторной печати кодов маркировки.

Рассмотрим, как выглядит типовой код, отвечающий за удаление записей:


Процедура ОчисткаПулаКодовМаркировкиПоОтчетуОНанесении(КодыМаркировки) Экспорт
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПулКодовМаркировкиСУЗ");
    ЭлементБлокировки.ИсточникДанных = КодыМаркировки;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("КодМаркировки", "КодМаркировки");
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ХешСуммаКодаМаркировки", "ХешСуммаКодаМаркировки");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    Блокировка.Заблокировать;

    Набор = РегистрыСведений.ПулКодовМаркировкиСУЗ.СоздатьНаборЗаписей;
    Для Каждого СтрокаПулаКодовМаркировки Из КодыМаркировки Цикл
        Набор.Отбор.КодМаркировки.Установить(СтрокаПулаКодовМаркировки.КодМаркировки);
        Набор.Отбор.ХешСуммаКодаМаркировки.Установить(СтрокаПулаКодовМаркировки.ХешСуммаКодаМаркировки);
        Набор.Записать(); // Здесь происходит фактическое удаление
    КонецЦикла;
КонецПроцедуры

Самый простой, но «грубый» способ — закомментировать цикл записи пустого набора. В этом случае коды перестанут удаляться вовсе.

Рекомендуемое решение: использование расширения

Чтобы не снимать конфигурацию с поддержки и сделать решение более гибким, создадим расширение. Мы можем добавить константу или функциональную опцию, которая будет определять, нужно ли очищать пул. Это позволит администратору системы включать и выключать очистку без привлечения программиста.

Посмотрим на пример кода в расширении с использованием аннотации &Вместо:


&Вместо("ОчисткаПулаКодовМаркировкиПоОтчетуОНанесении")
Процедура _ОчисткаПулаКодовМаркировкиПоОтчетуОНанесении(КодыМаркировки) Экспорт
    // Проверяем значение нашей новой константы
    Если Константы.ОчищатьПулКодовМаркировкиПоОтчетуОНанесении.Получить() Тогда
        ПродолжитьВызов(КодыМаркировки);
    Иначе
        // Если флаг очистки не стоит, просто ничего не делаем и выходим
        Возврат;
    КонецЕсли;
КонецПроцедуры

Важный момент: если вы решите полностью отключить очистку, помните о производительности. При объемах печати в десятки тысяч марок в месяц база начнет стремительно расти. Рекомендуется периодически проводить ручную очистку старых кодов (например, старше 180 дней), которые точно не потребуют перепечатки.

Альтернативные варианты и нюансы

Рассмотрим ситуацию, когда коды уже удалены, а печатать нужно «вчера». В этом случае есть два пути:

  1. Личный кабинет Честного Знака: Вы можете зайти в СУЗ (Станцию управления заказами) в ЛК Честного Знака. Там коды доступны для выгрузки в формате PDF или CSV в течение 30 дней после эмиссии. Это штатный способ, не требующий правок в 1С.
  2. Хранение этикеток в файлах: Хорошей практикой является настройка системы так, чтобы при первой печати марок из 1С их макеты сохранялись на сетевой диск в формате PDF.

Проанализируем также регистр ШтрихкодыУпаковок. Важно понимать, что записи в нем остаются и после ввода в оборот. Но там хранится лишь идентификатор кода. Если вы попытаетесь распечатать марку, используя только данные этого регистра, принтер выдаст ошибку или напечатает некорректный QR-код без криптографической части. Для выгрузки и печати марки с полной криптографической частью подойдёт отчет для печати кодов маркировки из заказа на эмиссию.

Подводя итог, отметим: если ваша организация сама производит и сама продает товар в розницу, отключение автоматической очистки пула в 1С:УТ 11.5 через расширение — наиболее эффективный способ обеспечить стабильную работу торгового зала и возможность оперативного восстановления маркировки.

← На главную