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