Как настроить синхронизацию в КД 2.1 при выгрузке одного документа в несколько по валютам?

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

При перегрузке данных между конфигурациями 1С через конфигурацию Конвертация данных 2.1 нередко возникает задача разделения одного документа-источника на несколько документов в базе-приемнике (например, по видам валют в табличной части). В этом случае ключевым вопросом становится правильная синхронизация создаваемых объектов при повторных обменах, чтобы система не плодила дубли и гарантированно обновляла ранее выгруженные документы.

Рассмотрим частые заблуждения, связанные с использованием свойства КлючВыгружаемыхДанных, выясним его истинное назначение и разберем правильные варианты решения этой задачи.

Назначение свойства КлючВыгружаемыхДанных

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

Свойство КлючВыгружаемыхДанных служит исключительно внутренним идентификатором кэша выгрузки в источнике. Механизм конвертации данных использует его для того, чтобы зафиксировать факт выгрузки конкретного объекта и не выполнять его повторную обработку в рамках одного сеанса выгрузки. Для поиска и сопоставления объектов в базе-приемнике этот ключ не применяется.

Вариант 1. Синхронизация по полям поиска

Самым простым и быстрым способом сопоставления разделенных документов является настройка полей поиска в ПКО приемника.

Проанализируем порядок действий для данного подхода:

  1. В ПКО создаваемого документа флаг поиска по УникальныйИдентификатор снимается или устанавливается свойство Продолжить поиск по полям поиска, если по идентификатору не найден.
  2. В составе ключевых полей для поиска отмечаются реквизиты, уникально определяющие создаваемый документ: Дата, Организация, Валюта и Номер (с использованием префиксации при необходимости).
  3. В обработчике ПоляПоиска при необходимости переопределяется стандартная логика, например, организуется поиск с помощью произвольного запроса к базе-приемнику.

Рассмотрим пример кода в обработчике ПоляПоиска для точного сопоставления документа по дате и валюте:


Если СвойстваПоиска["ВалютаДокумента"] <> Неопределено Тогда
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ Первые 1
        |	Т.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.ПоступлениеТоваровУслуг КАК Т
        |ГДЕ
        |	Т.Дата = &Дата
        |	И Т.ВалютаДокумента = &ВалютаДокумента
        |	И НЕ Т.Проведен";
    
    Запрос.УстановитьПараметр("Дата", СвойстваПоиска["Дата"]);
    Запрос.УстановитьПараметр("ВалютаДокумента", СвойстваПоиска["ВалютаДокумента"]);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        СсылкаНаНайденныйОбъект = Выборка.Ссылка;
    КонецЕсли;
КонецЕсли;

Вариант 2. Использование детерминированного GUID

Синхронизация по реквизитам (номер, дата) может давать сбои, если реквизиты документа изменились в источнике. Чтобы сохранить сопоставление по GUID, применяется вычисление воспроизводимого (детерминированного) уникального идентификатора для каждой пары «Документ + Валюта».

Рассмотрим алгоритм реализации этого метода:

  1. Выгрузка разделенных документов выполняется программно из обработчика (например, ПослеВыгрузки или ПередВыгрузкой) путем вызова функции ВыгрузитьПоПравилу().
  2. Значение параметра Источник передается как Неопределено или в виде структуры с данными табличной части, чтобы платформа не подтягивала GUID исходного документа.
  3. Данные для выгрузки передаются через параметр ВходящиеДанные.
  4. Для формирования гарантированно одинакового GUID при повторных обменах строковое представление генерируется на основе хэша или комбинации УИД исходного документа и кода/УИД валюты.

Посмотрим на пример вызова функции выгрузки из табличной части документа-источника:


Для Каждого СтрокаТЧ Из Источник.Содержимое Цикл
    ВходящиеДанные = Новый Структура;
    ВходящиеДанные.Вставить("Дата", Источник.Дата);
    ВходящиеДанные.Вставить("Организация", Источник.Организация);
    ВходящиеДанные.Вставить("ВалютаДокумента", СтрокаТЧ.Валюта);
    ВходящиеДанные.Вставить("СуммаДокумента", СтрокаТЧ.Сумма);
    
    // Передаем параметр Источник как Неопределено
    ВыгрузитьПоПравилу(Неопределено, , ВходящиеДанные, , "ПоступлениеТоваровУслуг");
КонецЦикла;

Важное примечание: При неоднократном вызове метода ВыгрузитьПоПравилу() в рамках одного правила в ПКО обязательно следует взвести флаг Не запоминать выгруженные объекты. В противном случае механизм кэширования Конвертации данных вернет объект из кэша вместо выгрузки нового элемента.

← На главную