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