При настройке бесшовной интеграции между 1С:ERP Управление предприятием и 1С:Документооборот 3.0 специалисты часто сталкиваются с ситуацией, когда стандартного сопоставления реквизитов «из реквизита объекта» недостаточно. Типичный пример: необходимо передать значение из реквизита НаправлениеДеятельности (справочник в ERP) в реквизит Проект (справочник в ДО). Несмотря на схожесть данных, системы могут не сопоставить их автоматически, либо реквизит остается пустым при переносе.
В этой статье мы подробно разберем, почему возникает эта проблема, как работает механизм передачи данных через XDTO и как правильно написать выражение на встроенном языке для заполнения сложных ссылочных полей. При возникновении других задач по обмену информацией можно подобрать готовые решения для переноса данных между ERP и 1С в профильном разделе.
Когда мы настраиваем правила интеграции, нам кажется, что в Параметры.Источник попадает обычная ссылка на объект (например, СправочникСсылка.НаправленияДеятельности). Однако архитектура бесшовной интеграции построена на использовании веб-сервисов и обмене данными в формате XDTO (XML Data Transfer Objects).
Проанализируем ситуацию: в момент выполнения программного кода в правилах заполнения, объект Параметры.Источник является не ссылкой, а структурой данных XDTO. Если мы попытаемся обратиться к нему напрямую, например, Параметры.Источник.НаправлениеДеятельности.Наименование, система выдаст ошибку или вернет неопределенное значение. Это происходит потому, что объект XDTO — это лишь «слепок» данных, и для получения реальных значений из базы 1С его нужно предварительно преобразовать.
Прежде чем писать код, необходимо выяснить, где именно в объекте-источнике (например, в документе Заявка на расходование ДС) хранятся нужные данные. Реквизит может находиться как в «шапке» документа, так и в табличной части (например, РасшифровкаПлатежа). Рассмотрим пример, когда значение берется из шапки документа.
Если мы используем выражение на встроенном языке, нам доступен параметр Параметры.Источник. Важно понимать, что обращение к нему должно учитывать структуру XDTO-пакета, которая описана в схемах интеграции.
Чтобы «оживить» данные и получить из XDTO-объекта полноценную ссылку, с которой можно работать (искать по наименованию, получать реквизиты), следует использовать функции общих модулей интеграции. В большинстве конфигураций, поддерживающих БСП и интеграцию с ДО, за это отвечает модуль ИнтеграцияС1СДокументооборотБазоваяФункциональность.
Посмотрим на пример кода, который позволяет получить ссылку на контрагента из XDTO-объекта, чтобы затем выгрузить связанного с ним партнера:
// Получаем объект XDTO из источника
Контрагент_XDTO = Параметры.Источник.correspondent;
Если НЕ ПустаяСтрока(Строка(Контрагент_XDTO)) Тогда
// Преобразуем XDTO в реальную ссылку справочника Контрагенты
КонтрагентСсылка = ИнтеграцияС1СДокументооборотБазоваяФункциональность.ЗначениеРеквизитаПоОбъектуXDTO(
Контрагент_XDTO,
Тип("СправочникСсылка.Контрагенты")
);
// Теперь, имея ссылку, мы можем обратиться к любому её реквизиту
Если ЗначениеЗаполнено(КонтрагентСсылка) Тогда
Параметры.Результат = КонтрагентСсылка.Партнер;
КонецЕсли;
КонецЕсли;
Вернемся к нашей задаче: передача Направления деятельности в Проект. Если системы не синхронизированы по внутренним идентификаторам (UUID), нам придется реализовать поиск по наименованию. Рассмотрим, как это сделать правильно, учитывая контекст выполнения кода.
Проанализируем алгоритм:
Проекты на стороне Документооборота (или наоборот, в зависимости от того, в какой системе выполняется правило).Пример кода для выражения заполнения:
// 1. Пытаемся получить ссылку из источника (ERP)
НаправлениеXDTO = Параметры.Источник.НаправлениеДеятельности;
Если НаправлениеXDTO <> Неопределено Тогда
// Используем универсальный метод получения ссылки
СсылкаНаНаправление = ИнтеграцияС1СДокументооборотБазоваяФункциональность.ЗначениеРеквизитаПоОбъектуXDTO(
НаправлениеXDTO,
Тип("СправочникСсылка.НаправленияДеятельности")
);
Если ЗначениеЗаполнено(СсылкаНаНаправление) Тогда
// 2. Ищем проект в целевой системе по наименованию
НаименованиеИскомое = Строка(СсылкаНаНаправление);
ПроектСсылка = Справочники.Проекты.НайтиПоНаименованию(НаименованиеИскомое);
Если НЕ ПроектСсылка.Пустая() Тогда
Параметры.Результат = ПроектСсылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Права доступа и создание новых объектов: Если вы решите не просто искать проект, но и создавать его в случае отсутствия, помните, что код выполняется под определенным пользователем (обычно это учетная запись, под которой работает веб-сервис интеграции). У этой учетной записи должны быть полные права на справочник Проекты.
Поиск в табличных частях: Часто реквизиты, влияющие на проектную деятельность, находятся в табличных частях. Если нужно вытащить направление деятельности из первой строки расшифровки платежа, код будет выглядеть так:
Если Параметры.Источник.РасшифровкаПлатежа.Количество() > 0 Тогда
СтрокаТЧ = Параметры.Источник.РасшифровкаПлатежа[0];
Параметры.Результат = СтрокаТЧ.НаправлениеДеятельности; // Здесь система сама попытается привести типы, если это возможно
КонецЕсли;
Выясним, почему код может не срабатывать, даже если он кажется верным. Главная сложность — невозможность стандартной отладки (через F5) в момент вызова веб-сервиса. Если сопоставление объектов осложняется тем, что они создавались в базах вручную, для миграции данных можно использовать инструмент для сопоставления ссылок по любым полям поиска без программирования.
Рассмотрим способы «прощупать» данные:
ЗаписьЖурналаРегистрации внутри кода правила. Выводите тип значения Параметры.Источник.ИмяРеквизита и его содержимое.Параметры.Источник — это объект XDTO, то обращение к его свойствам чувствительно к регистру и именам свойств в схеме XDTO (которые могут отличаться от имен реквизитов в метаданных).Используя приведенные выше методы и функции преобразования ЗначениеРеквизитаПоОбъектуXDTO, вы сможете настроить бесшовную интеграцию для любых сложных ссылочных типов, обеспечив корректную передачу данных между ERP и Документооборотом.