Почему при загрузке файла в "Почту России" в габаритах появляется #Null! и как это исправить?

Программист Торговля и дистрибуция
← На главную

При автоматизации отправки данных в "Почту России" через выгрузку из 1С в Excel-файл можно столкнуться с неприятной проблемой. Вы формируете файл, где габариты (длина, ширина, высота) не указаны, так как расчет должен идти по весу. Однако после загрузки на сайт "Почты России" в этих полях появляется значение #Null!, которое блокирует дальнейшую обработку. Давайте разберемся, почему так происходит и как это исправить.

Проанализируем ситуацию. Ключевая деталь проблемы заключается в том, что если открыть сгенерированный Excel-файл и вручную очистить эти ячейки, нажав Backspace, а затем сохранить и загрузить снова, то всё проходит успешно. Это прямо указывает на то, что программно сформированная "пустая" ячейка из 1С и "по-настоящему" пустая ячейка в Excel — это не одно и то же. Система "Почты России" видит в ячейке некое скрытое значение или формат, который не может корректно интерпретировать, и помечает его как #Null!.

Рассмотрим несколько подходов к решению этой задачи.

Решение 1: Правильное формирование пустых ячеек в 1С

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

Выясним, что можно сделать на уровне кода 1С.

  1. Условное заполнение параметров макета

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

    Посмотрим на пример. Вместо такого кода:

    
    // Неправильный подход, который может вызывать проблему
    ЗначениеВысоты = 0; // или ""
    Если НЕ ЗначениеЗаполнено(Источник.Высота) Тогда
        ОбластьМакета.Параметры.Высота = ЗначениеВысоты; 
    КонецЕсли;
    

    Используйте такой:

    
    // Правильный подход
    Если ЗначениеЗаполнено(Источник.Высота) Тогда
        // Заполняем параметр, только если есть значение
        ОбластьМакета.Параметры.Высота = Источник.Высота;
    КонецЕсли;
    
    // Если Источник.Высота не заполнено, мы просто не обращаемся к параметру,
    // и ячейка в макете остается нетронутой.
    

    Убедитесь, что в самом макете (шаблоне) соответствующие ячейки изначально пусты и не содержат пробелов или других невидимых символов.

  2. Явная очистка содержимого ячейки

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

    Допустим, у вас есть область ячеек, которую нужно очистить. Это можно сделать так:

    
    // Получаем область ячеек, например, по имени
    ОбластьВысоты = ТабДокумент.Область("R1C5"); // Пример адреса ячейки
    
    // Если высота не должна быть заполнена, очищаем ячейку
    Если НЕ ЗначениеЗаполнено(Источник.Высота) Тогда
        ОбластьВысоты.Очистить();
    Иначе
        ОбластьВысоты.Текст = Источник.Высота;
    КонецЕсли;
    

    Метод Очистить() — это мощный инструмент, который с большой вероятностью решит проблему, так как он максимально приближает состояние ячейки к "девственно чистому".

  3. Эксперименты с типом и форматом ячейки

    Иногда внешние системы чувствительны к формату ячеек. Можно попробовать программно установить для ячеек с габаритами текстовый формат. Даже если ячейка останется пустой, ее тип будет определен, что может помочь парсеру "Почты России".

    
    ОбластьГабаритов = ТабДокумент.Область("R1C5:R1C7"); // Выделяем ячейки длины, ширины, высоты
    ОбластьГабаритов.Формат = "Формат='Т'"; // Устанавливаем текстовый формат
    

    Этот способ стоит попробовать, если предыдущие не помогли.

Решение 2: Альтернативные методы

Если изменение кода по каким-то причинам затруднительно, есть и другие пути.

Обращение в техническую поддержку "Почты России"

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

Переход на интеграцию через API

Выгрузка и загрузка файлов — это не самый надежный способ интеграции. Он чувствителен к форматам, обновлениям на стороне сервиса и человеческому фактору. "Почта России" предоставляет API для автоматизации отправки данных.

Преимущества API:

Переход на API — это стратегически верное решение для любой компании, которая регулярно и в больших объемах работает с "Почтой России".

Что точно не сработает

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

Подводя итог, проблема #Null! почти наверняка кроется в способе, которым 1С формирует Excel-файл. Начните с проверки кода формирования отчета и убедитесь, что вы не записываете в ячейки пустые строки. Используйте условное заполнение или метод Очистить() для гарантированного результата. Если же объемы отправок велики, серьезно рассмотрите возможность перехода на интеграцию через API — это избавит вас от подобных проблем в будущем.

← На главную