При работе с инструментом Конвертация данных 3.1 (КД 3.1) и использованием формата EnterpriseData, разработчики часто сталкиваются с трудностями при переносе данных о расчетах. Типичная ситуация: необходимо перенести данные из табличной части «Зачет аванса» (например, из УТ 11 в БП 3.0), используя программное формирование данных в обработчике ПриОтправке. Основная сложность заключается в том, что формат обмена требует строгой типизации и наличия определенных структур, которые не всегда очевидны при первом знакомстве с XDTO-пакетом.
Рассмотрим подробнее, как избежать ошибок при формировании данных для расчетов и разберем причины возникновения ошибок валидации.
Разберем ситуацию, когда при выгрузке данных система выдает ошибку о незаполненном поле ОбъектРасчетов или ДокументРасчетов, хотя в коде 1С вы явно указываете ссылку на документ. Выясним причину: начиная с версии формата EnterpriseData 1.8, архитектура хранения расчетов изменилась. Теперь формат ожидает не просто ссылку на документ (UUID), а сложную структуру — так называемый Объект расчетов.
Проанализируем структуру XDTO-пакета. Поле ОбъектРасчетов часто имеет свойство minOccurs=1, что делает его обязательным. Если в процессе формирования ДанныеXDTO вы передаете простую ссылку, механизм конвертации не может сопоставить ее с вложенным типом XDTO, и узел остается пустым. Это и приводит к ошибке при выгрузке или загрузке данных в приемнике.
Когда мы формируем данные для выгрузки вручную через запрос, мы обычно помещаем результат в Таблицу Значений (ТЗ). Рассмотрим пример кода, который подготавливает данные для табличной части расчетов:
// В обработчике ПриОтправке (модуль менеджера обмена)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.ДокументРасчетов КАК ДокументРасчетов,
| ТЧ.Сумма КАК Сумма
|ИЗ
| Документ.ЗаказКлиента.ЗачетАванса КАК ТЧ
|ГДЕ
| ТЧ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДанныеИБ.Ссылка);
ТаблицаРасчетов = Запрос.Выполнить().Выгрузить();
// Добавляем колонку для хранения структуры XDTO
ТаблицаРасчетов.Колонки.Добавить("ОбъектРасчетовXDTO");
Для Каждого СтрокаТЗ Из ТаблицаРасчетов Цикл
// Здесь важно получить правильное ПКО для документа расчетов
СтрокаТЗ.ОбъектРасчетовXDTO = СформироватьОбъектРасчетов(СтрокаТЗ.ДокументРасчетов);
КонецЦикла;
В данном примере мы не просто берем ссылку, а готовим почву для преобразования документа в формат, понятный XDTO-пакету. Посмотрим, как именно нужно преобразовывать ссылку.
Для корректной передачи документа расчетов (например, ПоступлениеБезналичныхДенежныхСредств) необходимо использовать соответствующее Правило Конвертации Объектов (ПКО). В типовых правилах часто используется тип Документ.ПБДСРасчетыСКонтрагентами.
Разберем по шагам процесс инициализации структуры:
EnterpriseData.ВыгрузитьПоПравилу, чтобы получить структуру XDTO.РасчетыПоДокументам или ОбъектРасчетов.Важный нюанс: если вы используете тип РасчетыПоДокументам, в нем поле ДокументРасчетов является обязательным. Ошибка часто кроется в том, что ПКО для документа расчетов возвращает объект, но он не попадает в нужный узел XML из-за несоответствия типов имен в разных версиях формата.
Если при отладке вы видите, что поле в XDTO-пакете помечено как необязательное (Минимальное количество = 0), но система все равно требует его заполнения, это означает, что логика проверки заложена в программном коде модуля менеджера обмена. Проанализируем ситуацию: функция ЗаполнитьОбязательныеПоля в типовых конфигурациях может принудительно проверять наличие данных в ключевых аналитиках расчетов (Договор, Статья ДДС, Документ-основание).
Чтобы решить эту проблему, выполним следующие действия:
// Пример заполнения структуры объекта расчетов
СтруктураОбъекта = Новый Структура;
СтруктураОбъекта.Вставить("ТипОбъекта", "Документ");
СтруктураОбъекта.Вставить("Ссылка", СтрокаТЗ.ДокументРасчетов);
// Если формат требует детализации:
ДанныеОбъектаXDTO = КомпонентыОбмена.МенеджерВыгрузки.СформироватьДанныеXDTOПоСсылке(
СтрокаТЗ.ДокументРасчетов,
"Документ.ПБДСРасчетыСКонтрагентами"
);
Использование метода СформироватьДанныеXDTOПоСсылке позволяет системе автоматически подобрать нужное ПКО и сформировать корректный узел XDTO, который пройдет валидацию по схеме.
Для успешного завершения настройки синхронизации рекомендуем придерживаться следующего алгоритма:
EnterpriseData. Если основной документ идет по версии 1.15, а расчеты по 1.10 — возникнет ошибка схемы.ДанныеXDTO, убедитесь, что все поля, включая ссылки, заполнены и соответствуют типам данных ИБ.КомпонентыОбмена.ПравилаКонвертацииОбъектов. Найдите там ПКО для вашего документа расчетов и проверьте, какие поля в нем заполняются «из коробки».
В завершение отметим, что большинство проблем в КД 3.1 при переносе расчетов решается правильным сопоставлением типов ПКО. Если вы программно формируете таблицу значений, убедитесь, что имена колонок в ТЗ строго совпадают с именами свойств в XDTO-пакете, а содержимое колонок со ссылками предварительно обработано через правила конвертации объектов.