При автоматизации отправки данных в "Почту России" через выгрузку из 1С в Excel-файл можно столкнуться с неприятной проблемой. Вы формируете файл, где габариты (длина, ширина, высота) не указаны, так как расчет должен идти по весу. Однако после загрузки на сайт "Почты России" в этих полях появляется значение #Null!, которое блокирует дальнейшую обработку. Давайте разберемся, почему так происходит и как это исправить.
Проанализируем ситуацию. Ключевая деталь проблемы заключается в том, что если открыть сгенерированный Excel-файл и вручную очистить эти ячейки, нажав Backspace, а затем сохранить и загрузить снова, то всё проходит успешно. Это прямо указывает на то, что программно сформированная "пустая" ячейка из 1С и "по-настоящему" пустая ячейка в Excel — это не одно и то же. Система "Почты России" видит в ячейке некое скрытое значение или формат, который не может корректно интерпретировать, и помечает его как #Null!.
Рассмотрим несколько подходов к решению этой задачи.
Основная задача — добиться, чтобы 1С создавала "по-настоящему" пустые ячейки. Попытки записать туда пустую строку "" или пробел " " не приводят к успеху, так как это все равно запись значения в ячейку. Пробел, к тому же, требует ручного удаления на сайте, что нарушает автоматизацию.
Выясним, что можно сделать на уровне кода 1С.
Условное заполнение параметров макета
Самый простой способ — вообще не трогать ячейки, которые должны остаться пустыми. Вместо того чтобы передавать в параметр макета пустое значение, нужно просто пропустить этот шаг, если данных нет. Это гарантирует, что в ячейке останется то значение, которое было в шаблоне макета (в идеале, она там должна быть пустой).
Посмотрим на пример. Вместо такого кода:
// Неправильный подход, который может вызывать проблему
ЗначениеВысоты = 0; // или ""
Если НЕ ЗначениеЗаполнено(Источник.Высота) Тогда
ОбластьМакета.Параметры.Высота = ЗначениеВысоты;
КонецЕсли;
Используйте такой:
// Правильный подход
Если ЗначениеЗаполнено(Источник.Высота) Тогда
// Заполняем параметр, только если есть значение
ОбластьМакета.Параметры.Высота = Источник.Высота;
КонецЕсли;
// Если Источник.Высота не заполнено, мы просто не обращаемся к параметру,
// и ячейка в макете остается нетронутой.
Убедитесь, что в самом макете (шаблоне) соответствующие ячейки изначально пусты и не содержат пробелов или других невидимых символов.
Явная очистка содержимого ячейки
Если макет сложный или ячейки по какой-то причине уже содержат что-то по умолчанию, можно принудительно их очистить. Для этого у объекта ТабличныйДокумент есть специальный метод. Он удаляет не только текст и значение, но и форматирование, примечания и другие свойства.
Допустим, у вас есть область ячеек, которую нужно очистить. Это можно сделать так:
// Получаем область ячеек, например, по имени
ОбластьВысоты = ТабДокумент.Область("R1C5"); // Пример адреса ячейки
// Если высота не должна быть заполнена, очищаем ячейку
Если НЕ ЗначениеЗаполнено(Источник.Высота) Тогда
ОбластьВысоты.Очистить();
Иначе
ОбластьВысоты.Текст = Источник.Высота;
КонецЕсли;
Метод Очистить() — это мощный инструмент, который с большой вероятностью решит проблему, так как он максимально приближает состояние ячейки к "девственно чистому".
Эксперименты с типом и форматом ячейки
Иногда внешние системы чувствительны к формату ячеек. Можно попробовать программно установить для ячеек с габаритами текстовый формат. Даже если ячейка останется пустой, ее тип будет определен, что может помочь парсеру "Почты России".
ОбластьГабаритов = ТабДокумент.Область("R1C5:R1C7"); // Выделяем ячейки длины, ширины, высоты
ОбластьГабаритов.Формат = "Формат='Т'"; // Устанавливаем текстовый формат
Этот способ стоит попробовать, если предыдущие не помогли.
Если изменение кода по каким-то причинам затруднительно, есть и другие пути.
Это может показаться очевидным, но часто является самым эффективным шагом. Уточните у техподдержки, какой формат данных они ожидают в Excel-файле для незаполненных габаритов. Возможно, у них есть специальный символ или требование к формату ячейки, о котором не написано в публичной документации. Это сэкономит время на экспериментах.
Выгрузка и загрузка файлов — это не самый надежный способ интеграции. Он чувствителен к форматам, обновлениям на стороне сервиса и человеческому фактору. "Почта России" предоставляет API для автоматизации отправки данных.
Преимущества API:
Переход на API — это стратегически верное решение для любой компании, которая регулярно и в больших объемах работает с "Почтой России".
На основе обсуждения и общей логики работы сервиса, давайте закрепим, какие методы не являются решением проблемы:
Подводя итог, проблема #Null! почти наверняка кроется в способе, которым 1С формирует Excel-файл. Начните с проверки кода формирования отчета и убедитесь, что вы не записываете в ячейки пустые строки. Используйте условное заполнение или метод Очистить() для гарантированного результата. Если же объемы отправок велики, серьезно рассмотрите возможность перехода на интеграцию через API — это избавит вас от подобных проблем в будущем.