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