Почему не выгружаются табличные части документа при обмене через универсальный формат EnterpriseData

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

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

Разбор механизма EnterpriseData (КД 3.0)

Для начала проанализируем ситуацию: в отличие от старой технологии «Конвертация данных 2.0», где правила обмена загружались в виде отдельного XML-файла, в универсальном формате EnterpriseData (известном как КД 3.0) вся логика преобразования данных жестко прописана в коде конфигурации.

Выясним причину, по которой табличные части могут игнорироваться. Основная логика выгрузки сосредоточена в общем модуле с характерным названием МенеджерОбменаЧерезУниверсальныйФормат (или аналогичном, в зависимости от версии конфигурации). Именно в этом модуле описываются правила конвертации объектов (ПКО).

Влияние статуса «Проведен» на выгрузку данных

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

Рассмотрим, как это выглядит в программном коде менеджера обмена. В процедурах, отвечающих за выгрузку документа РеализацияТоваровУслуг, часто можно встретить блок, подобный этому:


Если НЕ ДанныеИБ.Проведен Тогда
    // Если документ не проведен, мы не заполняем коллекцию строк табличной части
    Возврат; 
КонецЕсли;

В этом случае, даже если вы принудительно выбираете документ для выгрузки через обработку «Регистрация изменений для обмена», программа отсечет «лишние» данные в момент формирования XML-сообщения. Проанализируем ситуацию пользователя из темы: когда документ проводится — табличная часть появляется, когда распутывается — исчезает. Это прямое подтверждение работы данного алгоритма.

Статусы документов в ERP и Комплексной автоматизации

Если же документ проведен, но табличная часть всё равно не выгружается, нам следует обратить внимание на статусы документа. В ERP документ может быть проведен, но иметь статус «К предоплате» или «В печати».

Типовые правила EnterpriseData часто проверяют не только флаг Проведен, но и соответствие статуса значению «Реализовано» или «Отгружено». Это сделано для того, чтобы в Бухгалтерию не попадали документы, которые еще могут существенно измениться в процессе складской сборки. Если ваша бизнес-логика подразумевает отключенный контроль остатков и работу с документами в промежуточных статусах, стандартный обмен может их «резать».

Как найти и изменить логику выгрузки

Посмотрим на процесс отладки этой проблемы по шагам. Если мы хотим изменить стандартное поведение системы, нам придется заглянуть «под капот» конфигурации.

  1. Откроем конфигуратор и найдем общий модуль МенеджерОбменаЧерезУниверсальныйФормат. Если в вашей версии конфигурации используется внешняя обработка для обмена, она может быть указана в реквизитах узла плана обмена.
  2. Найдем процедуру, отвечающую за ПКО нужного нам документа. Обычно она называется ПКО_Документ_РеализацияТоваровУслуг_Отправка.
  3. Проанализируем код внутри этой процедуры и подчиненных ей функций (например, там, где происходит заполнение свойств Товары).
  4. Ищем условия, содержащие проверку Проведен, Статус или ВариантОформления.

Пример кода, который может блокировать выгрузку табличной части для непроведенных документов:


Процедура ПКО_Документ_РеализацияТоваровУслуг_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена)
    
    // Проверка на наличие строк в источнике
    Если ДанныеИБ.Товары.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // Типовой фильтр: не выгружать строки, если документ не проведен
    Если НЕ ДанныеИБ.Проведен Тогда
        ДанныеXDTO.Товары.Очистить();
    КонецЕсли;

КонецПроцедуры

Решение проблемы через расширение конфигурации

Чтобы не снимать конфигурацию с поддержки, крайне рекомендуем использовать расширения. Мы можем перехватить выполнение процедуры менеджера обмена и изменить логику фильтрации.

Разберем пример создания расширения для обхода этой проверки:

  1. Создаем новое расширение.
  2. Добавляем в него общий модуль менеджера обмена.
  3. Находим процедуру заполнения табличной части и используем аннотацию &Вместо или &После.
  4. В коде расширения явно прописываем заполнение данных вне зависимости от статуса Проведен.

Важный момент: при работе с версией формата 1.5 (как в примере автора темы) следует также учитывать, что некоторые поля могут быть обязательными. Если табличная часть выгружается, но документ в приемнике не проводится, возможно, не заполнены аналитические реквизиты, такие как Склад или Номенклатура, которые для проведенного документа в ERP обязательны, а для непроведенного — нет.

Проверка настроек синхронизации

Перед тем как приступать к программированию, обязательно проверим настройки самой синхронизации в пользовательском интерфейсе:

Подводя итог, можно сказать, что «исчезновение» табличных частей — это не ошибка системы, а заложенная разработчиками 1С логика по разделению оперативного (в ERP) и бухгалтерского учета. Понимая, где именно в коде МенеджерОбменаЧерезУниверсальныйФормат происходят эти проверки, вы сможете гибко адаптировать обмен под нужды вашего бизнеса.

← На главную