Как восстановить ссылки на документы-основания при обмене между ERP и УПП через Конвертацию данных 2.0?

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

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

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

Анализ проблемы и постановка задачи

Разберем ситуацию на конкретном примере. В ERP создается «Заявка на расходование средств», где в табличной части «Расшифровка платежа» указан заказ (документ-основание). При выгрузке в УПП этот заказ превращается в «Поступление товаров и услуг». Поскольку само поступление не мигрирует, в УПП ссылка остается «битой», но сохраняет свой Уникальный идентификатор (GUID). Когда в УПП на основании заявки создается «Платежное поручение исходящее» и отправляется обратно в ERP, нам необходимо восстановить правильную ссылку на объект ERP, зная только этот GUID.

Решение 1: Передача УИД через параметры и перебор типов

Проанализируем подход, предложенный в обсуждении. Суть его заключается в том, чтобы при выгрузке из УПП принудительно передать строковое представление УИД документа расчетов, а на стороне ERP программно найти объект, перебирая возможные метаданные.

Шаг 1. Настройка ПКС перед выгрузкой из УПП

В правилах конвертации свойств (ПКС) для табличной части «РасшифровкаПлатежа» создадим параметр УИДДокРасчетов. В обработчике «Перед выгрузкой» для этого ПКС пропишем следующий код:


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

Шаг 2. Восстановление ссылки в ERP после загрузки

Теперь в ПКО документа «Платежное поручение» в ERP в обработчике «После загрузки» необходимо обработать переданные параметры. Нам нужно проверить все возможные типы документов в ERP, которые могли быть источником для этой ссылки.


// Определяем список возможных типов документов в ERP
СписокДокРасчетов = Новый СписокЗначений;
СписокДокРасчетов.Добавить("ПриобретениеУслугПрочихАктивов");
СписокДокРасчетов.Добавить("ПриобретениеТоваровУслуг");

// Получаем таблицу расшифровки платежа из параметров объекта
ТЗРасшифровка = ПараметрыОбъекта.Получить("РасшифровкаПлатежаТабличнаяЧасть");

Если ТЗРасшифровка <> Неопределено Тогда
    Для Каждого ТекСтр Из ТЗРасшифровка Цикл
        НайденнаяСтрока = Объект.РасшифровкаПлатежа[ТекСтр.НомерСтроки - 1];
        ДокРасчетов = Неопределено;
        
        // Преобразуем строку обратно в объект УникальныйИдентификатор
        ТекущийУИД = Новый УникальныйИдентификатор(ТекСтр.УИДДокРасчетов);
        
        // Перебираем типы метаданных
        Для Каждого ТекТип Из СписокДокРасчетов Цикл
            // Используем менеджер документа для получения ссылки по УИД
            Попытка
                ДокСсылка = Документы[ТекТип.Значение].ПолучитьСсылку(ТекущийУИД);
                
                // Проверяем, существует ли объект в базе ERP по этой ссылке
                // Самый простой (но не самый быстрый) способ - ПолучитьОбъект()
                Если ДокСсылка.ПолучитьОбъект() <> Неопределено Тогда
                    ДокРасчетов = ДокСсылка;
                    Прервать;
                КонецЕсли;
            Исключение
                Продолжить;
            КонецПопытки;
        КонецЦикла;
        
        НайденнаяСтрока.Заказ = ДокРасчетов;
    КонецЦикла;
КонецЕсли;

Решение 2: Оптимизация поиска через легкие запросы

Рассмотрим способы ускорения работы алгоритма. Метод ПолучитьОбъект() является крайне ресурсоемким, так как считывает все данные документа из базы. Если в платежном поручении много строк, загрузка может замедлиться. Выясним, как оптимизировать этот процесс.

Вместо получения объекта целиком, проанализируем возможность использования запроса. Выполним проверку существования ссылки в базе ERP более легким способом:


ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Документ.%ИмяМетаданных% ГДЕ Ссылка = &Ссылка";
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", ДокСсылка);

Для Каждого ТекТип Из СписокДокРасчетов Цикл
    Запрос.Текст = СтрЗаменить(ТекстЗапроса, "%ИмяМетаданных%", ТекТип.Значение);
    Если НЕ Запрос.Выполнить().Пустой() Тогда
        ДокРасчетов = ДокСсылка;
        Прервать;
    КонецЕсли;
КонецЦикла;

Такой подход значительно снижает нагрузку на сервер БД, так как проверяется только наличие записи в таблице ссылок.

Решение 3: Использование дополнительных свойств для точной идентификации

Посмотрим на ситуацию шире. Чтобы не «гадать» и не перебирать все возможные типы документов в ERP, мы можем сохранить информацию о типе документа еще на этапе первой выгрузки (ERP -> УПП). Хотя в УПП нет типовых реквизитов для хранения типа метаданных ERP, мы можем использовать Дополнительные сведения (характеристики).

  1. При выгрузке из ERP в УПП записываем в «Дополнительные сведения» документа «Заявка на расходование средств» или «Поступление товаров и услуг» строку с именем метаданных ERP (например, "ПриобретениеТоваровУслуг").
  2. При обратной выгрузке из УПП считываем это значение из регистра сведений ДополнительныеСведения.
  3. Передаем это имя в параметре выгрузки.
  4. В ERP в обработчике «После загрузки» сразу обращаемся к нужному менеджеру: Документы[ИмяТипаИзПараметра].ПолучитьСсылку(УИД).

Этот метод исключает перебор и является наиболее надежным с точки зрения производительности и точности данных.

Важные замечания по работе с GUID

Проанализируем техническую деталь: битая ссылка в 1С — это не просто пустая ячейка. Она содержит в себе Тип (который был определен при загрузке или создании) и УникальныйИдентификатор. Даже если в интерфейсе вы видите <Объект не найден...>, программно вы можете извлечь GUID методом Ссылка.УникальныйИдентификатор(). Именно на этом свойстве строится вся механика восстановления связей в сложных обменах, где объекты не синхронизируются полностью.

Также стоит помнить про частичную оплату. Если одна заявка оплачивается несколькими платежками, или наоборот — одна платежка закрывает несколько заявок, механизм с передачей УИД через табличную часть расшифровки платежа остается самым гибким, так как он работает на уровне каждой конкретной строки документа.

Подведем итог: для реализации корректной конвертации «одного документа в два» (или восстановления связей) в КД 2.0 лучше всего использовать связку «Параметры ПКС» + «Обработка После загрузки». Это позволяет обойти ограничения типовых механизмов поиска и гарантировать целостность данных в учетной системе.

← На главную