Как отказаться от загрузки и записи объекта при обмене в формате EnterpriseData

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

В процессе настройки синхронизации данных через универсальный формат EnterpriseData часто возникает задача выполнить перенос объектов 1С и отфильтровать их не на стороне источника, а на стороне приемника. Это актуально, когда база-приемник обладает дополнительной информацией или бизнес-логикой, которая запрещает загрузку определенных данных. Рассмотрим подробно, как технически реализовать отказ от записи объекта, используя механизмы конфигурации Конвертация данных 3.0 и Библиотеки стандартных подсистем (БСП).

Способ 1. Отказ на этапе обработки данных (ПОД)

Проанализируем самый ранний этап появления данных в базе-приемнике — выполнение Правил обработки данных (ПОД). Когда система считывает входящий XML-пакет, она ищет соответствующее правило обработки. Если мы хотим «отсечь» объект до того, как система начнет искать его в информационной базе или сопоставлять поля, нам необходимо использовать событие При обработке.

В этом событии доступна структура ИспользованиеПКО. Она содержит перечень правил конвертации объектов, которые могут быть применены к данным XDTO. Чтобы отказаться от загрузки, мы должны программно установить использование всех правил в значение Ложь. Разберем пример кода:


// В обработчике ПОД "При обработке"
// Проверяем условие, например, по значению свойства в данных XDTO
Если ДанныеXDTO.Свойство("Статус") И ДанныеXDTO.Статус = "Архивный" Тогда
    // Отключаем использование всех связанных ПКО для этого объекта
    Для Каждого КлючИЗначение Из ИспользованиеПКО Цикл
        ИспользованиеПКО.Вставить(КлючИЗначение.Ключ, Ложь);
    КонецЦикла;
КонецЕсли;

Важный нюанс: Этот метод является наиболее производительным, так как система не тратит ресурсы на поиск объекта в базе по уникальному идентификатору или полям поиска. Однако стоит учитывать, что если на этот объект ссылаются другие данные в этом же пакете, ссылка может остаться «битой».

Способ 2. Отказ перед записью объекта (ПКО)

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

В этом обработчике нам доступны параметры ПолученныеДанные (объект, подготовленный к записи) и ДанныеИБ (состояние объекта в базе до обновления). Для отмены записи нужно установить ПолученныеДанные в значение Неопределено.

Рассмотрим ситуацию на примере:


// В обработчике ПКО "Перед записью полученных данных"
// Например, запрещаем обновлять контрагентов, у которых установлен флаг "Заблокирован" в текущей базе
Если ДанныеИБ <> Неопределено И ДанныеИБ.ЗаблокированХозяйственнойОперацией Тогда
    ПолученныеДанные = Неопределено;
    // Также рекомендуется очистить ДанныеИБ, чтобы система не пыталась производить сопоставление далее
    ДанныеИБ = Неопределено;
КонецЕсли;

Выясним причину популярности этого метода: он позволяет сравнивать «то, что пришло» с «тем, что уже есть». Если объект в приемнике более актуален или защищен от изменений, мы просто прерываем процесс записи для конкретного экземпляра.

Риски и проблема «битых» ссылок

Проанализируем ситуацию, упомянутую в обсуждении: что произойдет, если мы отказались от записи объекта, но он является владельцем или реквизитом для другого загружаемого объекта? В формате EnterpriseData механизмы ссылочной целостности работают следующим образом:

  1. Если объект не был создан/обновлен, ссылка на него в других документах будет указывать на пустой узел или на объект-заглушку (если включено создание новых объектов при поиске).
  2. Чтобы избежать появления «пустышек», рекомендуется настраивать правила поиска таким образом, чтобы при отсутствии объекта система не создавала новый элемент, если это критично для бизнес-логики.
  3. Лучшей практикой считается перенос фильтрации на сторону источника через правила регистрации объектов, если это технически возможно.

Синтаксис отборов и Менеджер регистрации

Иногда возникают вопросы о том, как реализовать сложные отборы в макете ПравилаРегистрации. Как было отмечено, синтаксис XML-отборов (например, ОтборПоСвойствамПланаОбмена) генерируется автоматически в конфигурации Конвертация данных 3.0.

Вместо ручной правки сложного XML-кода, рекомендуется использовать программный способ в модуле менеджера плана обмена в процедуре ПередРегистрациейОбъекта. Это позволяет реализовать любую логику на языке 1С:


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

Рекомендации по логированию отказов

Когда мы программно подавляем загрузку объекта на стороне приемника, в мониторе обмена это может выглядеть как «успешное выполнение», хотя данные фактически не обновились. Чтобы администратор системы мог понять, почему объект не загрузился, настоятельно рекомендуем записывать событие в ЖурналРегистрации.

Используйте метод ИнформационныеБазы.ЗаписатьСобытиеЖурналаРегистрации непосредственно внутри обработчика ПКО или ПОД. Это позволит быстро диагностировать причины отсутствия данных в базе без необходимости включать отладку обмена.

← На главную