Как правильно настроить выгрузку табличной части Зачет аванса через Конвертацию данных 3.1?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с инструментом Конвертация данных 3.1 (КД 3.1) и использованием формата EnterpriseData, разработчики часто сталкиваются с трудностями при переносе данных о расчетах. Типичная ситуация: необходимо перенести данные из табличной части «Зачет аванса» (например, из УТ 11 в БП 3.0), используя программное формирование данных в обработчике ПриОтправке. Основная сложность заключается в том, что формат обмена требует строгой типизации и наличия определенных структур, которые не всегда очевидны при первом знакомстве с XDTO-пакетом.

Рассмотрим подробнее, как избежать ошибок при формировании данных для расчетов и разберем причины возникновения ошибок валидации.

Анализ проблемы: почему возникает ошибка пустого поля

Разберем ситуацию, когда при выгрузке данных система выдает ошибку о незаполненном поле ОбъектРасчетов или ДокументРасчетов, хотя в коде 1С вы явно указываете ссылку на документ. Выясним причину: начиная с версии формата EnterpriseData 1.8, архитектура хранения расчетов изменилась. Теперь формат ожидает не просто ссылку на документ (UUID), а сложную структуру — так называемый Объект расчетов.

Проанализируем структуру XDTO-пакета. Поле ОбъектРасчетов часто имеет свойство minOccurs=1, что делает его обязательным. Если в процессе формирования ДанныеXDTO вы передаете простую ссылку, механизм конвертации не может сопоставить ее с вложенным типом XDTO, и узел остается пустым. Это и приводит к ошибке при выгрузке или загрузке данных в приемнике.

Шаг 1. Программное формирование ТЗ в обработчике ПриОтправке

Когда мы формируем данные для выгрузки вручную через запрос, мы обычно помещаем результат в Таблицу Значений (ТЗ). Рассмотрим пример кода, который подготавливает данные для табличной части расчетов:


// В обработчике ПриОтправке (модуль менеджера обмена)
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   ТЧ.ДокументРасчетов КАК ДокументРасчетов,
|   ТЧ.Сумма КАК Сумма
|ИЗ
|   Документ.ЗаказКлиента.ЗачетАванса КАК ТЧ
|ГДЕ
|   ТЧ.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка);
ТаблицаРасчетов = Запрос.Выполнить().Выгрузить();

// Добавляем колонку для хранения структуры XDTO
ТаблицаРасчетов.Колонки.Добавить("ОбъектРасчетовXDTO");

Для Каждого СтрокаТЗ Из ТаблицаРасчетов Цикл
    // Здесь важно получить правильное ПКО для документа расчетов
    СтрокаТЗ.ОбъектРасчетовXDTO = СформироватьОбъектРасчетов(СтрокаТЗ.ДокументРасчетов);
КонецЦикла;

В данном примере мы не просто берем ссылку, а готовим почву для преобразования документа в формат, понятный XDTO-пакету. Посмотрим, как именно нужно преобразовывать ссылку.

Шаг 2. Работа с ПКО и типами ПБДСРасчетыСКонтрагентами

Для корректной передачи документа расчетов (например, ПоступлениеБезналичныхДенежныхСредств) необходимо использовать соответствующее Правило Конвертации Объектов (ПКО). В типовых правилах часто используется тип Документ.ПБДСРасчетыСКонтрагентами.

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

  1. Выясним, какое ПКО отвечает за выгрузку данного типа документа в формат EnterpriseData.
  2. Используем функцию ВыгрузитьПоПравилу, чтобы получить структуру XDTO.
  3. Если мы работаем в КД 3.1, важно убедиться, что ПКО возвращает именно тот тип, который ожидает поле РасчетыПоДокументам или ОбъектРасчетов.

Важный нюанс: если вы используете тип РасчетыПоДокументам, в нем поле ДокументРасчетов является обязательным. Ошибка часто кроется в том, что ПКО для документа расчетов возвращает объект, но он не попадает в нужный узел XML из-за несоответствия типов имен в разных версиях формата.

Шаг 3. Устранение ошибок обязательности полей (minOccurs)

Если при отладке вы видите, что поле в XDTO-пакете помечено как необязательное (Минимальное количество = 0), но система все равно требует его заполнения, это означает, что логика проверки заложена в программном коде модуля менеджера обмена. Проанализируем ситуацию: функция ЗаполнитьОбязательныеПоля в типовых конфигурациях может принудительно проверять наличие данных в ключевых аналитиках расчетов (Договор, Статья ДДС, Документ-основание).

Чтобы решить эту проблему, выполним следующие действия:


// Пример заполнения структуры объекта расчетов
СтруктураОбъекта = Новый Структура;
СтруктураОбъекта.Вставить("ТипОбъекта", "Документ");
СтруктураОбъекта.Вставить("Ссылка", СтрокаТЗ.ДокументРасчетов);

// Если формат требует детализации:
ДанныеОбъектаXDTO = КомпонентыОбмена.МенеджерВыгрузки.СформироватьДанныеXDTOПоСсылке(
    СтрокаТЗ.ДокументРасчетов, 
    "Документ.ПБДСРасчетыСКонтрагентами"
);

Использование метода СформироватьДанныеXDTOПоСсылке позволяет системе автоматически подобрать нужное ПКО и сформировать корректный узел XDTO, который пройдет валидацию по схеме.

Советы по отладке в КД 3.1

Для успешного завершения настройки синхронизации рекомендуем придерживаться следующего алгоритма:

  1. Проверьте пространство имен: Убедитесь, что документ расчетов и основной документ выгружаются в рамках одной и той же версии формата EnterpriseData. Если основной документ идет по версии 1.15, а расчеты по 1.10 — возникнет ошибка схемы.
  2. Используйте консоль запросов: Перед передачей ТЗ в ДанныеXDTO, убедитесь, что все поля, включая ссылки, заполнены и соответствуют типам данных ИБ.
  3. Анализируйте КомпонентыОбмена: В режиме отладки внимательно изучите переменную КомпонентыОбмена.ПравилаКонвертацииОбъектов. Найдите там ПКО для вашего документа расчетов и проверьте, какие поля в нем заполняются «из коробки».

В завершение отметим, что большинство проблем в КД 3.1 при переносе расчетов решается правильным сопоставлением типов ПКО. Если вы программно формируете таблицу значений, убедитесь, что имена колонок в ТЗ строго совпадают с именами свойств в XDTO-пакете, а содержимое колонок со ссылками предварительно обработано через правила конвертации объектов.

← На главную