Как настроить передачу только части документа через план обмена РИБ?

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

При работе с механизмами распределенных информационных баз (РИБ) часто возникает задача: ограничить объем передаваемой информации. Стандартная логика платформы 1С при работе с ПланамиОбмена подразумевает, что если объект (например, ДокументОбъект) зарегистрирован к обмену, то в XML-пакет выгружается вся структура объекта целиком, включая все его табличные части. Рассмотрим, какие методы существуют для решения этой задачи и как избежать ошибок при проектировании обмена.

Метод 1: Перенос данных в независимый регистр сведений

Самым надежным и архитектурно правильным решением, которое мы можем рекомендовать в данной ситуации, является вынос данных, не подлежащих передаче, в отдельный регистр сведений. Это позволяет разделить данные на те, что должны быть общими для всех узлов, и те, что должны быть локальными для конкретного узла.

Преимущества подхода:

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

Чтобы реализовать этот метод, создайте РегистрСведений, в котором первым измерением будет ссылка на ваш документ, а остальными реквизитами — данные из бывшей табличной части. При записи документа в основной базе просто добавьте логику записи данных в этот регистр. В целевых узлах данные будут вводиться локально или вообще отсутствовать, в зависимости от бизнес-задачи.

Метод 2: Программное вмешательство в процесс отправки (событие ПриОтправкеДанныхПодчиненному)

Если по каким-то причинам вы не можете изменить структуру метаданных, можно воздействовать на объект непосредственно в момент формирования сообщения. Платформа 1С позволяет перехватить объект до того, как он будет сериализован в XML.

Рассмотрим, как это работает на примере обработчика ПриОтправкеДанныхПодчиненному. В этом событии параметр ЭлементДанных содержит объект, который готов к отправке. Мы можем программно очистить его табличную часть:


Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлементаДанных)
    // Проверяем, является ли объект нашим документом
    Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ВашДокумент") Тогда
        // Очищаем табличную часть перед выгрузкой в файл обмена
        ЭлементДанных.ВашаТабличнаяЧасть.Очистить();
    КонецЕсли;
КонецПроцедуры

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

Метод 3: Использование обработчика ПриПолученииДанныхОтГлавного

Если вам нужно управлять поведением записи в приемнике, можно использовать событие ПриПолученииДанныхОтГлавного. Здесь вы можете предотвратить автоматическую запись или выполнить корректировку объекта.

Логика работы следующая:

  1. В приемнике вы перехватываете получение объекта.
  2. Меняете параметры записи так, чтобы система не затерла данные, которые вам нужны локально.
  3. Выполняете ручную запись объекта с учетом ваших локальных табличных частей.

Однако отметим, что данный метод требует высокой квалификации разработчика, так как любая ошибка в логике записи может привести к рассогласованию данных (так называемым «битым» ссылкам или потере целостности).

Выводы и рекомендации

Проанализировав поставленную задачу, мы можем сделать следующие выводы:

Надеемся, что эти советы помогут вам оптимизировать процесс обмена данными и сделать вашу конфигурацию более надежной!

← На главную