Почему при регистрации изменений объект выгружается как УдалениеОбъекта в 1С?

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

В процессе разработки и поддержки механизмов обмена данными разработчики нередко сталкиваются с ситуацией: в программном коде выполняется принудительная регистрация существующей ссылки через ПланыОбмена.ЗарегистрироватьИзменения(), объект физически присутствует в информационной базе, однако в результирующем файле обмена вместо данных объекта формируется узел УдалениеОбъекта. Разберем внутренние механизмы платформы и типовых конфигураций, чтобы понять, почему так происходит, и как правильно настроить выгрузку.

Причины формирования «Удаления объекта» при выгрузке

Рассмотрим подробно логику работы подсистемы обмена данными:

  1. Особенности платформенной таблицы регистрации изменений: На уровне платформы 1С:Предприятие таблица регистрации изменений не хранит признак того, какое именно действие произошло (создание, изменение или удаление). В ней хранится только ссылка на объект и признак узла. Факт удаления определяется алгоритмом выгрузки: если ссылка есть в таблице изменений, но при попытке прочитать объект из информационной базы он отсутствует, платформа или обработка выгрузки считает его удаленным.
  2. Повторная проверка правил регистрации объектов (ПРО): В типовых конфигурациях при выполнении стандартной выгрузки (например, процедура ВыполнитьСтандартнуюВыгрузкуИзмененийДляУзла()) зарегистрированные объекты дополнительно проверяются по фильтрам правил регистрации объектов (ПРО). Это необходимо для сценариев, когда реквизиты объекта изменились так, что он перестал удовлетворять отборам узла (например, изменилась организация или склад). В этом случае объект «уходит» из области видимости узла-приемника, и механизм намеренно отправляет команду УдалениеОбъекта, чтобы в базе-приемнике не оставались неактуальные данные. Если ссылка была зарегистрирована программно в обход ПРО, но условиям фильтра узла она не соответствует, выгрузка автоматически сформирует удаление.
  3. Влияние ограничений прав доступа на уровне записей (RLS): Если выгрузка выполняется под пользователем с ограниченными правами или в сеансе регламентного задания действуют ограничения RLS, чтение данных объекта может вернуть пустой результат. Механизм обмена расценит невозможность прочитать объект как его физическое отсутствие и выгрузит запись удаления.
  4. Обработчики событий в правилах конвертации (ПКО): В самих правилах обмена (в обработчиках ПередВыгрузкой или ПриОбработке) может присутствовать логика с установкой флага Отказ = Истина; либо явная подмена типа выгружаемого объекта.

Способы решения проблемы

Проанализируем основные пути исправления этой ситуации в зависимости от архитектуры обмена.

Корректировка правил регистрации объектов (ПРО)

Если обмен строится на основе правил регистрации, созданных в конфигурации «Конвертация данных», необходимо проверить условия отбора для соответствующего справочника или документа:

  1. Откроем правила регистрации объектов (ПРО) в конфигурации «Конвертация данных».
  2. Найдем требуемый объект метаданных (например, СправочникСсылка.Контрагенты).
  3. Проверим режим выгрузки: если установлен режим «Выгружать по условию», проанализируем код в обработчиках ПередОбработкой и ПриОбработке. Если объект должен попадать в узел безусловно, переключим режим на «Выгружать всегда».
  4. Если объект должен выгружаться только вместе с документами, в которых он участвует, установим режим «Выгружать при необходимости» и снимем регистрацию изменений с самого справочника.

Проверка реквизитов объекта и настроек узла плана обмена

Если в узле плана обмена заданы фильтры (по организациям, подразделениям, складам или контрагентам), убедимся, что реквизиты регистрируемого объекта соответствуют этим настройкам. Посмотрим на типовой программный вызов регистрации:


// Принудительная регистрация ссылки в плане обмена
УзелОбмена = ПланыОбмена.ОбменУправлениеПредприятием.НайтиПоКоду("ЦБ");
Если ЗначениеЗаполнено(УзелОбмена) И Не Контрагент.Пустая() Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Контрагент);
КонецЕсли;

Если для узла ЦБ настроен фильтр, не пропускающий данного контрагента, при выгрузке объект превратится в УдалениеОбъекта. Необходимо либо скорректировать значения реквизитов контрагента, либо ослабить фильтрацию в настройках узла.

Выполнение выгрузки в привилегированном режиме

Для исключения влияния механизма RLS при регламентных обменах убедимся, что выгрузка выполняется с полными правами либо в привилегированном контексте. Разберем пример программного включения привилегированного режима перед чтением и выгрузкой данных:


УстановитьПривилегированныйРежим(Истина);
// Вызов стандартной процедуры выгрузки изменений для узла
ВыгрузитьДанныеДляУзла(УзелОбмена);
УстановитьПривилегированныйРежим(Ложь);

Альтернативный вариант: прямая выгрузка без ПРО

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

← На главную