Как убрать лишние лидирующие нули в идентификаторе транспортной упаковки (ИТУ) при формировании УПД в 1С?

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

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

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

1. Программное удаление лидирующих нулей непосредственно в 1С

Первый и наиболее системный подход — это программная корректировка значения идентификатора транспортной упаковки (ИТУ) в том месте, где он формируется или подготавливается к выводу. В системе 1С существует ряд инструментов и методов, которые позволяют нам это сделать.

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

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


// Пример функции для удаления лидирующих нулей
Функция УбратьЛидирующиеНулиИзСтроки(Знач ИсходнаяСтрока) Экспорт
    // Проверяем, что строка не пустая и не состоит только из нулей
    Если ИсходнаяСтрока = Неопределено Или ИсходнаяСтрока = "" Тогда
        Возврат "";
    КонецЕсли;

    Пока СтрДлина(ИсходнаяСтрока) > 1 И Лев(ИсходнаяСтрока, 1) = "0" Цикл
        ИсходнаяСтрока = Сред(ИсходнаяСтрока, 2);
    КонецЦикла;

    Возврат ИсходнаяСтрока;
КонецФункции

Где применять этот код? Мы должны найти место в логике конфигурации, где формируется или присваивается значение идентификатора транспортной упаковки для УПД. Это может быть:

  1. Модуль объекта документа, который формирует данные для УПД.
  2. Общий модуль, ответственный за формирование печатных форм или данных для выгрузки.
  3. Обработка или расширение, которые используются для генерации XML-файлов для ЭДО.

Например, если мы нашли переменную ИдентификаторТранспортнойУпаковки, мы можем применить нашу функцию следующим образом:


// Пример использования функции
ИдентификаторТранспортнойУпаковки = "001234567890";
ИдентификаторТранспортнойУпаковкиБезНулей = УбратьЛидирующиеНулиИзСтроки(ИдентификаторТранспортнойУпаковки);
// Теперь ИдентификаторТранспортнойУпаковкиБезНулей будет равен "1234567890"

Важно: Мы всегда должны помнить о том, что идентификатор транспортной упаковки (КИТУ, SSCC) является строго регламентированным значением для систем маркировки. Некорректный формат (лишние нули, скобки) может привести к отклонению УПД системой "Честный ЗНАК". Поэтому, если мы вносим изменения, обязательно протестируем их.

2. Корректировка логики в обработках интеграции с ЭДО

Если выгрузка УПД осуществляется через интеграцию с оператором ЭДО, например, Диадок, то проблема с лидирующими нулями, скорее всего, кроется в обработке или расширении, которое отвечает за формирование XML-файла для передачи. В этом случае, нам необходимо анализировать код именно этой обработки или расширения.

Давайте разберем по шагам, что нам нужно сделать:

  1. Выясним, какая обработка или расширение используется для формирования и отправки УПД в систему ЭДО. Это может быть типовая обработка интеграции с ЭДО, разработанное сторонними специалистами расширение или даже доработанный типовой функционал.
  2. Найдем участок кода, где формируется значение для элемента XML-схемы, отвечающего за идентификатор транспортной упаковки. В большинстве случаев этот элемент будет называться <ИдентТрансУпак>.
  3. Применим функцию удаления лидирующих нулей к значению, которое присваивается этому элементу. Это может быть наша собственная функция (как в примере выше) или типовая функция 1С, если она доступна.

Проанализируем ситуацию с форматом XML и "Честным ЗНАКОМ". Идентификатор транспортной упаковки (КИТУ, SSCC) должен соответствовать определенным стандартам. Если мы обнаруживаем, что система ЭДО или "Честный ЗНАК" отклоняет документы из-за неверного формата ИТУ, то это прямой сигнал к тому, что нам необходимо вмешаться в логику формирования этого значения. Изменение должно производиться до того, как данные будут записаны в XML-файл.

Пример участка кода (гипотетический), который мы можем найти в обработке ЭДО:


// ... где-то в коде формирования XML
ЗначениеИТУ = ПолучитьЗначениеИТУИзДокумента(ДокументОснование); // Предположим, что эта функция возвращает ИТУ с нулями
// Здесь мы применяем нашу функцию для очистки
ЗначениеИТУБезНулей = УбратьЛидирующиеНулиИзСтроки(ЗначениеИТУ);

// Далее это значение используется для заполнения элемента XML
// ...
XMLЗапись.ЗаписатьНачалоЭлемента("ИдентТрансУпак");
XMLЗапись.ЗаписатьСтроку(ЗначениеИТУБезНулей);
XMLЗапись.ЗаписатьКонецЭлемента();
// ...

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

3. Прямое редактирование XML-файла (временное решение)

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

Давайте выясним риски такого подхода:

  1. Высока вероятность ошибок: Ручное редактирование XML-файлов может привести к нарушению их структуры, что сделает документ невалидным для систем ЭДО и "Честного ЗНАКа". Одно неверное изменение, и весь документ будет отклонен.
  2. Не решает корневую проблему: Каждый раз, когда мы будем формировать новый УПД, нам придется повторять эту операцию. Это не устраняет источник появления лидирующих нулей в 1С.
  3. Не масштабируется: Если у нас большой объем документов, ручное редактирование становится непрактичным и трудозатратным.

Мы можем рассматривать этот метод только как экстренную меру для исправления уже сформированных файлов, когда нет времени на программную доработку. Для системного решения мы всегда будем стремиться к первым двум подходам.

Подводим итоги и делаем выводы

Мы рассмотрели различные способы борьбы с лишними лидирующими нулями в идентификаторе транспортной упаковки УПД. Наиболее эффективными и правильными являются программные методы:

  1. Внедрение функции удаления нулей непосредственно в логику формирования УПД в 1С.
  2. Корректировка кода в обработках или расширениях, отвечающих за интеграцию с ЭДО.

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

← К списку