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