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

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

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

Анализируем симптомы проблемы

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

Проанализируем файл выгрузки. Если вместо узла с данными объекта мы видим следующую конструкцию:


<УдалениеОбъекта СсылкаНаОбъект="{"#",20b0e67c-8468-432c-b753-f48bebdb9606,310:a55e00e04c362caa11ee5ddc1684e416}"/>

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

Разберем механизм работы Плана обмена

Когда мы нажимаем кнопку «Выполнить обмен», платформа последовательно обрабатывает каждый объект, зарегистрированный на узле. Для запуска этой задачи в автоматическом режиме по расписанию применяется инструмент автоматизации регулярного обмена данными между базами 1С. Процесс выглядит следующим образом:

  1. Система считывает таблицу регистрации изменений для конкретного узла плана обмена.
  2. Для каждого объекта вызывается логика определения: нужно ли его отправлять?
  3. Если объект проходит фильтры, он выгружается в XML.
  4. Если объект НЕ проходит фильтры, статус отправки меняется на Удалить или Игнорировать.

В нашем случае срабатывает статус Удалить. Выясним причину, проверив основные места, где может быть заложена эта логика.

Проверка модуля менеджера плана обмена

Главное место, где программист может управлять составом выгрузки на уровне кода — это модуль менеджера соответствующего плана обмена. Нам необходимо найти предопределенные процедуры, отвечающие за отправку данных.

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


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

В данном примере, если организация в документе не совпадает с организацией, закрепленной за узлом обмена, система принудительно меняет статус отправки на Удалить. В результате документ исчезает из выгрузки и заменяется тегом удаления.

Работа с отладчиком: как поймать момент «исчезновения»

Чтобы точно выяснить, в каком месте кода происходит подмена, воспользуемся отладчиком. Нам нужно установить точки останова в ключевых точках процесса выгрузки.

Шаг 1. Поиск глобальным поиском. Выполним поиск по всей конфигурации (Ctrl+Shift+F) по строке ОтправкаЭлементаДанных.Удалить или просто .Удалить в контексте обмена. Это позволит быстро найти все места, где программно устанавливается запрет на выгрузку.

Шаг 2. Использование точек останова с условием. Если документов много, ставить обычную точку останова неудобно. Настроим условие:

  1. Откроем модуль менеджера плана обмена или обработку выгрузки.
  2. Найдем процедуру обработки отправки элемента.
  3. Поставим точку останова и в контекстном меню выберем «Условие».
  4. Пропишем условие, например: ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ИнвентаризацияТоваровНаСкладе").

Шаг 3. Анализ стека вызовов. Когда отладчик остановится на нужном документе, пройдемся по шагам (F11). Обращайте внимание на свойство ОтправкаЭлементаДанных. Оно может принимать значения:

Проверка настроек в пользовательском интерфейсе

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

Посмотрим на настройки обмена данными в режиме «1С:Предприятие»:

  1. Откроем список узлов плана обмена.
  2. Зайдем в настройки конкретного узла, с которым возникли проблемы.
  3. Проверим вкладки «Отборы» или «Параметры обмена».

Если в настройках указано «Выгружать только по выбранным складам» или «Фильтр по организациям», то документ ИнвентаризацияТоваровНаСкладе, склад которого не входит в список разрешенных, никогда не будет выгружен как объект данных, даже если вы вручную добавите его в регистрацию изменений.

Особенности правил конвертации данных (XML)

Если в модулях плана обмена все чисто, а настройки фильтров не заданы, причину следует искать в самих правилах обмена (настроенных в конфигурации «Конвертация данных»). Рассмотрим, какие обработчики событий могут влиять на процесс.

В ПКО (Правилах конвертации объектов) для документа Инвентаризация проверьте обработчик ПередВыгрузкой. Если в нем прописано:


Если Объект.Дата < '20230101000000' Тогда
    Отказ = Истина;
КонецЕсли;

Это может привести к тому, что объект будет пропущен. Однако стоит помнить, что Отказ = Истина в правилах XML обычно просто прерывает выгрузку свойств объекта, но именно программная логика ОтправкаЭлементаДанных.Удалить в платформенных механизмах порождает тег удаления.

Почему не пропадает регистрация изменений?

Автор проблемы заметил, что документ не исчезает из регистрации. Это происходит потому, что регистрация изменений считается успешно «отработанной» только в случае успешного подтверждения получения сообщения от базы-приемника. Однако, если платформа на этапе выгрузки помечает объект как Удалить из-за ошибок или противоречий в логике, транзакция очистки регистрации для этого объекта может не завершаться корректно, особенно если в процессе выгрузки возникают скрытые исключения.

Проанализируем также версию платформы. В версии 8.3.18.1289 встречались ошибки, связанные с кэшированием метаданных планов обмена. Если код исправлен, а проблема сохраняется — попробуйте выполнить очистку серверного кэша и перезапустить службу 1С. Для регулярного технического обслуживания баз и проведения профилактических тестов применяется программа для автоматического архивирования, обновления и тестирования 1С.

Итоги и рекомендации

Подведем итог нашему исследованию. Если документ упорно не хочет выгружаться и заменяется на «удаление», выполним следующие действия:

  1. Проверим XML-файл выгрузки на наличие тега УдалениеОбъекта. Если он есть — значит, срабатывает программный фильтр.
  2. Изучим модуль менеджера Плана обмена, обращая особое внимание на установку значения ОтправкаЭлементаДанных.Удалить.
  3. Проверим соответствие документа фильтрам узла (Организация, Склад, Период выгрузки).
  4. Используем отладчик для анализа свойства Выборка.Отправка в момент формирования сообщения обмена.
  5. Убедимся в корректности данных самого документа — битые ссылки или незаполненные обязательные реквизиты (например, пустая организация) могут приводить к срабатыванию защитных алгоритмов выгрузки. Для контроля результатов и поиска расхождений в проводках после обмена используется автоматическая сверка бухгалтерских и налоговых данных между базами 1С.

Помните, что механизм планов обмена в 1С — это сложная многоуровневая система, где настройки интерфейса, программный код модулей и правила конвертации работают в тесной связке. Только комплексный анализ позволит быстро устранить подобные затруднения.

← На главную