При организации обмена данными между разнородными конфигурациями, такими как 1С:ERP Управление предприятием и 1С:Управление производственным предприятием (УПП), разработчики часто сталкиваются с проблемой несовпадения типов метаданных. Типичная ситуация: документ в ERP может ссылаться на несколько видов документов (например, «Приобретение товаров и услуг» и «Приобретение услуг и прочих активных активов»), в то время как в УПП им соответствует один универсальный объект — «Поступление товаров и услуг».
Ситуация осложняется, если сами документы-основания не переносятся между базами. В этом случае в базе-приемнике (УПП) вместо полноценных ссылок в поле ДокументРасчетов возникают так называемые «битые» ссылки (Объект не найден). При обратном обмене (например, выгрузке платежных поручений из УПП в ERP) система не может автоматически определить, к какому именно типу в ERP относится данная ссылка. Рассмотрим, как решить эту задачу с помощью Конвертации данных 2.0.
Разберем ситуацию на конкретном примере. В ERP создается «Заявка на расходование средств», где в табличной части «Расшифровка платежа» указан заказ (документ-основание). При выгрузке в УПП этот заказ превращается в «Поступление товаров и услуг». Поскольку само поступление не мигрирует, в УПП ссылка остается «битой», но сохраняет свой Уникальный идентификатор (GUID). Когда в УПП на основании заявки создается «Платежное поручение исходящее» и отправляется обратно в ERP, нам необходимо восстановить правильную ссылку на объект ERP, зная только этот GUID.
Проанализируем подход, предложенный в обсуждении. Суть его заключается в том, чтобы при выгрузке из УПП принудительно передать строковое представление УИД документа расчетов, а на стороне ERP программно найти объект, перебирая возможные метаданные.
Шаг 1. Настройка ПКС перед выгрузкой из УПП
В правилах конвертации свойств (ПКС) для табличной части «РасшифровкаПлатежа» создадим параметр УИДДокРасчетов. В обработчике «Перед выгрузкой» для этого ПКС пропишем следующий код:
Если ТипЗнч(ОбъектКоллекции.ДокументРасчетовСКонтрагентом) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
// Получаем строковое представление GUID битой ссылки
Значение = Строка(ОбъектКоллекции.ДокументРасчетовСКонтрагентом.УникальныйИдентификатор());
Иначе
// Если тип не совпадает или ссылка пустая, можно пропустить или обработать иначе
Отказ = Истина;
КонецЕсли;
Шаг 2. Восстановление ссылки в ERP после загрузки
Теперь в ПКО документа «Платежное поручение» в ERP в обработчике «После загрузки» необходимо обработать переданные параметры. Нам нужно проверить все возможные типы документов в ERP, которые могли быть источником для этой ссылки.
// Определяем список возможных типов документов в ERP
СписокДокРасчетов = Новый СписокЗначений;
СписокДокРасчетов.Добавить("ПриобретениеУслугПрочихАктивов");
СписокДокРасчетов.Добавить("ПриобретениеТоваровУслуг");
// Получаем таблицу расшифровки платежа из параметров объекта
ТЗРасшифровка = ПараметрыОбъекта.Получить("РасшифровкаПлатежаТабличнаяЧасть");
Если ТЗРасшифровка <> Неопределено Тогда
Для Каждого ТекСтр Из ТЗРасшифровка Цикл
НайденнаяСтрока = Объект.РасшифровкаПлатежа[ТекСтр.НомерСтроки - 1];
ДокРасчетов = Неопределено;
// Преобразуем строку обратно в объект УникальныйИдентификатор
ТекущийУИД = Новый УникальныйИдентификатор(ТекСтр.УИДДокРасчетов);
// Перебираем типы метаданных
Для Каждого ТекТип Из СписокДокРасчетов Цикл
// Используем менеджер документа для получения ссылки по УИД
Попытка
ДокСсылка = Документы[ТекТип.Значение].ПолучитьСсылку(ТекущийУИД);
// Проверяем, существует ли объект в базе ERP по этой ссылке
// Самый простой (но не самый быстрый) способ - ПолучитьОбъект()
Если ДокСсылка.ПолучитьОбъект() <> Неопределено Тогда
ДокРасчетов = ДокСсылка;
Прервать;
КонецЕсли;
Исключение
Продолжить;
КонецПопытки;
КонецЦикла;
НайденнаяСтрока.Заказ = ДокРасчетов;
КонецЦикла;
КонецЕсли;
Рассмотрим способы ускорения работы алгоритма. Метод ПолучитьОбъект() является крайне ресурсоемким, так как считывает все данные документа из базы. Если в платежном поручении много строк, загрузка может замедлиться. Выясним, как оптимизировать этот процесс.
Вместо получения объекта целиком, проанализируем возможность использования запроса. Выполним проверку существования ссылки в базе ERP более легким способом:
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Документ.%ИмяМетаданных% ГДЕ Ссылка = &Ссылка";
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", ДокСсылка);
Для Каждого ТекТип Из СписокДокРасчетов Цикл
Запрос.Текст = СтрЗаменить(ТекстЗапроса, "%ИмяМетаданных%", ТекТип.Значение);
Если НЕ Запрос.Выполнить().Пустой() Тогда
ДокРасчетов = ДокСсылка;
Прервать;
КонецЕсли;
КонецЦикла;
Такой подход значительно снижает нагрузку на сервер БД, так как проверяется только наличие записи в таблице ссылок.
Посмотрим на ситуацию шире. Чтобы не «гадать» и не перебирать все возможные типы документов в ERP, мы можем сохранить информацию о типе документа еще на этапе первой выгрузки (ERP -> УПП). Хотя в УПП нет типовых реквизитов для хранения типа метаданных ERP, мы можем использовать Дополнительные сведения (характеристики).
"ПриобретениеТоваровУслуг").ДополнительныеСведения.Документы[ИмяТипаИзПараметра].ПолучитьСсылку(УИД).Этот метод исключает перебор и является наиболее надежным с точки зрения производительности и точности данных.
Проанализируем техническую деталь: битая ссылка в 1С — это не просто пустая ячейка. Она содержит в себе Тип (который был определен при загрузке или создании) и УникальныйИдентификатор. Даже если в интерфейсе вы видите <Объект не найден...>, программно вы можете извлечь GUID методом Ссылка.УникальныйИдентификатор(). Именно на этом свойстве строится вся механика восстановления связей в сложных обменах, где объекты не синхронизируются полностью.
Также стоит помнить про частичную оплату. Если одна заявка оплачивается несколькими платежками, или наоборот — одна платежка закрывает несколько заявок, механизм с передачей УИД через табличную часть расшифровки платежа остается самым гибким, так как он работает на уровне каждой конкретной строки документа.
Подведем итог: для реализации корректной конвертации «одного документа в два» (или восстановления связей) в КД 2.0 лучше всего использовать связку «Параметры ПКС» + «Обработка После загрузки». Это позволяет обойти ограничения типовых механизмов поиска и гарантировать целостность данных в учетной системе.