При работе с механизмами распределенных информационных баз (РИБ) часто возникает задача: ограничить объем передаваемой информации. Стандартная логика платформы 1С при работе с ПланамиОбмена подразумевает, что если объект (например, ДокументОбъект) зарегистрирован к обмену, то в XML-пакет выгружается вся структура объекта целиком, включая все его табличные части. Рассмотрим, какие методы существуют для решения этой задачи и как избежать ошибок при проектировании обмена.
Самым надежным и архитектурно правильным решением, которое мы можем рекомендовать в данной ситуации, является вынос данных, не подлежащих передаче, в отдельный регистр сведений. Это позволяет разделить данные на те, что должны быть общими для всех узлов, и те, что должны быть локальными для конкретного узла.
Преимущества подхода:
ПланаОбмена, вы гарантируете, что информация из него никогда не попадет в другой узел.Чтобы реализовать этот метод, создайте РегистрСведений, в котором первым измерением будет ссылка на ваш документ, а остальными реквизитами — данные из бывшей табличной части. При записи документа в основной базе просто добавьте логику записи данных в этот регистр. В целевых узлах данные будут вводиться локально или вообще отсутствовать, в зависимости от бизнес-задачи.
Если по каким-то причинам вы не можете изменить структуру метаданных, можно воздействовать на объект непосредственно в момент формирования сообщения. Платформа 1С позволяет перехватить объект до того, как он будет сериализован в XML.
Рассмотрим, как это работает на примере обработчика ПриОтправкеДанныхПодчиненному. В этом событии параметр ЭлементДанных содержит объект, который готов к отправке. Мы можем программно очистить его табличную часть:
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлементаДанных)
// Проверяем, является ли объект нашим документом
Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ВашДокумент") Тогда
// Очищаем табличную часть перед выгрузкой в файл обмена
ЭлементДанных.ВашаТабличнаяЧасть.Очистить();
КонецЕсли;
КонецПроцедуры
Важное предостережение: этот метод имеет серьезный побочный эффект. Если в приемнике (в подчиненном узле) этот документ уже существует, то при загрузке пришедшего объекта 1С попытается заместить существующий документ новым. Поскольку в новом объекте табличная часть будет пустой (мы ее очистили при отправке), данные в приемнике также будут удалены. Используйте этот метод только в том случае, если вы уверены, что документ в приемнике еще не создан или вы готовы к потере данных.
Если вам нужно управлять поведением записи в приемнике, можно использовать событие ПриПолученииДанныхОтГлавного. Здесь вы можете предотвратить автоматическую запись или выполнить корректировку объекта.
Логика работы следующая:
Однако отметим, что данный метод требует высокой квалификации разработчика, так как любая ошибка в логике записи может привести к рассогласованию данных (так называемым «битым» ссылкам или потере целостности).
Проанализировав поставленную задачу, мы можем сделать следующие выводы:
РегистрСведений — это лучший способ сделать систему поддерживаемой и прозрачной.ПлановОбмена без флага РаспределеннаяИнформационнаяБаза, если вам нужна большая гибкость. Обычные планы обмена позволяют использовать ПравилаКонвертацииДанных, где передачу каждой табличной части можно настроить декларативно, без написания сложного кода в модулях событий.Надеемся, что эти советы помогут вам оптимизировать процесс обмена данными и сделать вашу конфигурацию более надежной!