Как автоматически заполнить адрес грузополучателя из партнера в УПД для ЭДО СБИС в 1С?

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

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

Проблема с отображением содержимого выгружаемого XML-файла

Первое, с чем мы можем столкнуться при отладке или проверке работы ЭДО, это некорректное отображение выгружаемого файла. Пользователи часто сообщают, что вместо структурированного документа они видят "какие-то знаки" или нечитаемый текст в окне предварительного просмотра или при попытке открыть файл. Рассмотрим, почему это происходит и как с этим бороться.

  1. Причина некорректного отображения: Выгружаемый документ для ЭДО, в подавляющем большинстве случаев, представляет собой XML-файл. Этот формат предназначен для машинной обработки и передачи структурированных данных. Операционная система вашего компьютера может по умолчанию пытаться открыть XML-файл в браузере (например, Chrome, Firefox, Edge) или другом приложении, которое не всегда имеет встроенные средства для корректного форматированного отображения необработанного XML. Браузеры иногда пытаются интерпретировать XML как веб-страницу или отобразить его в своем собственном стиле, что не всегда приводит к удобному для человека виду, а иногда вызывает появление нечитаемых символов, особенно если есть проблемы с кодировкой.
  2. Как просмотреть XML-файл корректно:

    Для того чтобы просмотреть содержимое XML-файла в читаемом виде, мы рекомендуем:

    1. Сохранить файл на диск: Вместо того чтобы пытаться открыть файл напрямую из области просмотра 1С или автоматически через связанные приложения, сохраните его на свой жесткий диск.
    2. Использовать текстовый редактор: Откройте сохраненный XML-файл с помощью простого текстового редактора. Встроенный в Windows "Блокнот" (Notepad), Notepad++, Sublime Text, Visual Studio Code или любой другой редактор кода прекрасно справятся с этой задачей. Они отобразят содержимое файла как обычный текст, позволяя нам увидеть его структуру и данные. Многие из них также поддерживают подсветку синтаксиса XML, что делает чтение еще более удобным.
    3. Проверить кодировку: В редких случаях причиной "знаков" может быть неверная кодировка файла. Убедитесь, что файл сохраняется и открывается в одной и той же кодировке (например, UTF-8). Современные текстовые редакторы обычно позволяют легко изменить кодировку при открытии файла.

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

Автоматическое изменение грузополучателя и его адреса в УПД

Основная задача, которую мы здесь рассматриваем, заключается в автоматической подстановке адреса грузополучателя из карточки «Партнера», а не «Контрагента», в выгружаемый УПД. Эта задача является нетривиальной и, как справедливо было отмечено на форуме, требует дополнительной настройки или доработки системы 1С.

Понимание структуры данных 1С: Контрагенты и Партнеры

Для начала, давайте разберемся, почему стандартные механизмы 1С не всегда подходят для этой задачи. В современных конфигурациях 1С, таких как 1С:УправлениеТорговлей, 1С:КомплекснаяАвтоматизация или 1С:ERPУправлениеПредприятием, существуют два ключевых справочника для работы с клиентами и поставщиками:

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

Проблема возникает из-за того, что в документе РеализацияТоваровУслуг (РТиУ) и в механизмах формирования регламентированных документов, таких как УПД, поле «Грузополучатель» по умолчанию имеет тип Справочник.Контрагенты. Это означает, что мы можем выбрать только юридическое лицо. Адрес же, который нам нужен, часто хранится в справочнике Партнеры, который может быть связан с этим контрагентом, но не является его непосредственным реквизитом.

Стандартный функционал 1С и его ограничения

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

  1. Не автоматический для партнера: Он не решает проблему, когда адреса доставки должны *автоматически* браться из конкретной карточки партнера, если контрагент остается тем же. Нам придется каждый раз вручную выбирать или вводить адрес.
  2. Ограничен типом контрагента: Поле грузополучателя все равно будет ссылаться на Справочник.Контрагенты, а не на Справочник.Партнеры, что затрудняет получение нужного адреса напрямую.

Решение через доработку конфигурации 1С

Как мы выяснили в ходе обсуждения, без изменения стандартного поведения обработки выгрузки для СБИС или логики заполнения данных в 1С нам не обойтись. Часто внешние обработки от операторов ЭДО по умолчанию запрограммированы на использование юридического адреса из карточки контрагента, а не фактического адреса доставки, который мы можем указать в партнере.

Шаг 1: Убеждаемся в актуальности обработки СБИС

В первую очередь, всегда следует убедиться, что мы используем последнюю версию внешней обработки для ЭДО от СБИС. Разработчики операторов ЭДО постоянно выпускают обновления, в которых могут исправляться ошибки, связанные с заполнением реквизитов, или добавляться новые возможности, которые могут косвенно упростить нашу задачу. Возможно, в новой версии уже предусмотрены дополнительные поля для адреса грузополучателя, которые мы можем заполнить.

Шаг 2: Модификация логики заполнения адреса (основное решение)

Наиболее правильным и гибким подходом является доработка конфигурации 1С. Мы должны организовать заполнение нужного реквизита в документе РеализацияТоваровУслуг таким образом, чтобы он корректно использовался при формировании XML-файла для СБИС.

  1. Использование расширений конфигурации:

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

    В рамках расширения нам потребуется:

    • Определить механизм выбора партнера: В документе РеализацияТоваровУслуг (Документы.РеализацияТоваровУслуг) нам потребуется добавить реквизит, который будет ссылаться на Справочник.Партнеры. Это позволит нам явно указать, какой именно партнер является грузополучателем для данной конкретной отгрузки. Например, мы можем добавить реквизит ГрузополучательПартнер типа СправочникСсылка.Партнеры.
    • Реализовать логику заполнения адреса: Нам понадобится обработчик события, который будет срабатывать при изменении реквизита ГрузополужательПартнер или при формировании документа для выгрузки в ЭДО. Этот обработчик будет выполнять следующие действия:
      
      // Пример концептуального кода в расширении (модуль объекта документа РеализацияТоваровУслуг или модуль команды)
      Процедура ЗаполнитьАдресГрузополучателяИзПартнера()
          Если ЗначениеЗаполнено(ЭтотОбъект.ГрузополучательПартнер) Тогда
              Партнер = ЭтотОбъект.ГрузополучательПартнер.ПолучитьОбъект();
              // Предполагаем, что адрес хранится в Партнере как строка или в структурированном виде
              Если ЗначениеЗаполнено(Партнер.АдресДоставки) Тогда
                  // Нам нужно как-то передать этот адрес в поле грузополучателя,
                  // которое по умолчанию Контрагент.
                  // Здесь может потребоваться создать "технического" Контрагента с этим адресом,
                  // или, что более вероятно, модифицировать обработку выгрузки.
                  ЭтотОбъект.Грузополучатель = Партнер.Контрагент; // Устанавливаем основного контрагента
                  ЭтотОбъект.АдресДоставкиГрузополучателя = Партнер.АдресДоставки; // Вводим новый реквизит или используем существующий, который потом попадет в XML
              Иначе
                  // Очистить или выдать предупреждение
              КонецЕсли;
          КонецЕсли;
      КонецПроцедуры
      
    • Модификация обработки выгрузки ЭДО:

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

      • Считывать адрес из нашего нового реквизита документа РеализацияТоваровУслуг (например, АдресДоставкиГрузополучателя).
      • Находить в формируемой XML-структуре теги, отвечающие за данные грузополучателя. Обычно это теги, связанные с адресом доставки (например, АдресОрганизации или АдрГрузПолуч в структуре ФНС).
      • Программно заполнять эти теги значениями из партнера.
      
      // Концептуальный фрагмент кода для модификации логики формирования XML в расширении
      // (Примерный псевдокод, точная реализация зависит от конфигурации и обработки СБИС)
      Процедура ПриФормированииПакетаЭДО(ДокументОснование, ПараметрыВыгрузки, XMLДанные) Экспорт
          // Вызываем стандартную процедуру формирования XML
          СтандартныеПодсистемы.ЭДО.ВыполнитьФормированиеПакетаЭДО(ДокументОснование, ПараметрыВыгрузки, XMLДанные);
      
          // Получаем объект документа РеализацияТоваровУслуг
          РТиУ = ДокументОснование.ПолучитьОбъект();
      
          Если ЗначениеЗаполнено(РТиУ.ГрузополучательПартнер) Тогда
              Партнер = РТиУ.ГрузополучательПартнер.ПолучитьОбъект();
              АдресДляXML = Партнер.АдресДоставки; // Получаем нужный адрес
      
              Если ЗначениеЗаполнено(АдресДляXML) Тогда
                  // Ищем в сформированном XML соответствующий раздел грузополучателя
                  // и программно изменяем его адресные данные.
                  // Например, XMLДанные - это ОбъектXMLEDO, который можно изменить
                  Попытка
                      // Пример: найти элемент "Грузополучатель" и его дочерний элемент "Адрес"
                      ЭлементГрузополучатель = XMLДанные.НайтиЭлемент("СвГрузПолуч"); // Предполагаемый тег
                      Если ЭлементГрузополучатель <> Неопределено Тогда
                          ЭлементАдрес = ЭлементГрузополучатель.НайтиЭлемент("Адрес"); // Предполагаемый тег адреса
                          Если ЭлементАдрес <> Неопределено Тогда
                              ЭлементАдрес.Текст = АдресДляXML; // Заполняем поле адреса
                          КонецЕсли;
                      КонецЕсли;
                  Исключение
                      Сообщить("Ошибка при модификации XML для грузополучателя: " + ОписаниеОшибки());
                  КонецПопытки;
              КонецЕсли;
          КонецЕсли;
      Коне Процедура
      

      Нам потребуется использовать объекты 1С для работы с XML, такие как ЧтениеXML, ЗаписьXML, ДокументXML или специализированные объекты, предоставляемые библиотекой стандартных подсистем 1С для ЭДО.

  2. Корректность данных в 1С:

    Мы должны убедиться, что все необходимые данные, включая ИНН/КПП грузополучателя (если он отличается юридически), а также полный и корректный адрес, внесены в соответствующие карточки партнера или контрагента в 1С. Если данные отсутствуют или некорректны, даже доработанная логика не сможет их правильно передать.

Известные проблемы и взаимодействие с ЭДО СБИС

Пользователи часто сталкиваются с ситуацией, когда в 1С документ выглядит абсолютно правильно, все адреса указаны как надо, но после выгрузки в онлайн-кабинет СБИС адрес грузополучателя заменяется на юридический адрес контрагента. Это подтверждает, что логика обработки на стороне СБИС или их интеграционной компоненты может переопределять или игнорировать некоторые данные, указанные в 1С, если они не соответствуют ожидаемому формату или источнику.

Техническая поддержка СБИС обычно отмечает, что для корректного отображения информации в УПД необходимо, чтобы при выгрузке из 1С были правильно заполнены все обязательные теги XML. Если стандартная конфигурация 1С или внешняя обработка СБИС не заполняет эти теги из данных партнера, потребуется именно та доработка, о которой мы говорили. Мы должны убедиться, что формируемый нами XML-файл полностью соответствует требованиям формата ФНС и спецификациям СБИС для УПД, особенно в части блока информации о грузополучателе.

Таким образом, для того чтобы реализовать автоматическое заполнение адреса грузополучателя из карточки партнера в УПД для ЭДО СБИС, потребуется привлечение специалиста по 1С для разработки расширения конфигурации. Это расширение должно будет добавлять необходимую логику для получения адреса из партнера и корректно формировать или модифицировать XML-файл перед его передачей в СБИС.

← На главную