В процессе сопровождения систем на базе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда документ зарегистрирован в плане обмена, но при выполнении выгрузки он не попадает в файл обмена данными. Вместо ожидаемых данных документа в XML-файле появляется странная запись УдалениеОбъекта. При этом регистрация изменений для этого объекта не пропадает, и повторные попытки выгрузки ни к чему не приводят. Разберем детально, почему так происходит и как найти «виновника» в программном коде.
Рассмотрим ситуацию: у нас есть настроенный обмен через «Универсальный обмен данными в формате XML». Все правила конвертации (ПКО) и правила выгрузки (ПВД) настроены корректно, и большинство документов мигрируют между базами без проблем. Однако конкретный вид документа, например, ИнвентаризацияТоваровНаСкладе, упорно игнорируется системой.
Проанализируем файл выгрузки. Если вместо узла с данными объекта мы видим следующую конструкцию:
<УдалениеОбъекта СсылкаНаОбъект="{"#",20b0e67c-8468-432c-b753-f48bebdb9606,310:a55e00e04c362caa11ee5ddc1684e416}"/>
Это верный признак того, что платформа 1С или программные алгоритмы конфигурации приняли решение не передавать данные объекта, а сообщить базе-приемнику, что этот объект там быть не должен. Это механизм обеспечения ссылочной целостности и актуальности данных: если по правилам логики объект «не положен» в узле-приемнике, система шлет команду на его удаление, чтобы не плодить расхождений.
Когда мы нажимаем кнопку «Выполнить обмен», платформа последовательно обрабатывает каждый объект, зарегистрированный на узле. Для запуска этой задачи в автоматическом режиме по расписанию применяется инструмент автоматизации регулярного обмена данными между базами 1С. Процесс выглядит следующим образом:
Удалить или Игнорировать.В нашем случае срабатывает статус Удалить. Выясним причину, проверив основные места, где может быть заложена эта логика.
Главное место, где программист может управлять составом выгрузки на уровне кода — это модуль менеджера соответствующего плана обмена. Нам необходимо найти предопределенные процедуры, отвечающие за отправку данных.
Проанализируем процедуру ПриОтправкеДанныхПодчиненному (или ПриОтправкеДанныхГлавному, в зависимости от направления обмена). Именно здесь чаще всего прописываются жесткие фильтры. Рассмотрим пример кода, который может приводить к нашей проблеме:
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлементаДанных)
Если ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ИнвентаризацияТоваровНаСкладе") Тогда
// Проверяем, соответствует ли организация документа настройкам узла
Если ЭлементДанных.Организация <> СсылкаНаУзел.Организация Тогда
ОтправкаЭлементаДанных = ОтправкаЭлементаДанных.Удалить;
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В данном примере, если организация в документе не совпадает с организацией, закрепленной за узлом обмена, система принудительно меняет статус отправки на Удалить. В результате документ исчезает из выгрузки и заменяется тегом удаления.
Чтобы точно выяснить, в каком месте кода происходит подмена, воспользуемся отладчиком. Нам нужно установить точки останова в ключевых точках процесса выгрузки.
Шаг 1. Поиск глобальным поиском. Выполним поиск по всей конфигурации (Ctrl+Shift+F) по строке ОтправкаЭлементаДанных.Удалить или просто .Удалить в контексте обмена. Это позволит быстро найти все места, где программно устанавливается запрет на выгрузку.
Шаг 2. Использование точек останова с условием. Если документов много, ставить обычную точку останова неудобно. Настроим условие:
ТипЗнч(ЭлементДанных) = Тип("ДокументОбъект.ИнвентаризацияТоваровНаСкладе").Шаг 3. Анализ стека вызовов. Когда отладчик остановится на нужном документе, пройдемся по шагам (F11). Обращайте внимание на свойство ОтправкаЭлементаДанных. Оно может принимать значения:
Авто — платформа сама решит, как выгружать объект.Всегда — принудительная выгрузка.Удалить — объект заменяется командой удаления в XML.Игнорировать — объект просто пропускается, регистрация остается.Иногда причина кроется не в коде, а в данных. В типовых конфигурациях (таких как Управление торговлей или Ювелирный торговый дом) существуют встроенные фильтры в самих узлах обмена.
Посмотрим на настройки обмена данными в режиме «1С:Предприятие»:
Если в настройках указано «Выгружать только по выбранным складам» или «Фильтр по организациям», то документ ИнвентаризацияТоваровНаСкладе, склад которого не входит в список разрешенных, никогда не будет выгружен как объект данных, даже если вы вручную добавите его в регистрацию изменений.
Если в модулях плана обмена все чисто, а настройки фильтров не заданы, причину следует искать в самих правилах обмена (настроенных в конфигурации «Конвертация данных»). Рассмотрим, какие обработчики событий могут влиять на процесс.
В ПКО (Правилах конвертации объектов) для документа Инвентаризация проверьте обработчик ПередВыгрузкой. Если в нем прописано:
Если Объект.Дата < '20230101000000' Тогда
Отказ = Истина;
КонецЕсли;
Это может привести к тому, что объект будет пропущен. Однако стоит помнить, что Отказ = Истина в правилах XML обычно просто прерывает выгрузку свойств объекта, но именно программная логика ОтправкаЭлементаДанных.Удалить в платформенных механизмах порождает тег удаления.
Автор проблемы заметил, что документ не исчезает из регистрации. Это происходит потому, что регистрация изменений считается успешно «отработанной» только в случае успешного подтверждения получения сообщения от базы-приемника. Однако, если платформа на этапе выгрузки помечает объект как Удалить из-за ошибок или противоречий в логике, транзакция очистки регистрации для этого объекта может не завершаться корректно, особенно если в процессе выгрузки возникают скрытые исключения.
Проанализируем также версию платформы. В версии 8.3.18.1289 встречались ошибки, связанные с кэшированием метаданных планов обмена. Если код исправлен, а проблема сохраняется — попробуйте выполнить очистку серверного кэша и перезапустить службу 1С. Для регулярного технического обслуживания баз и проведения профилактических тестов применяется программа для автоматического архивирования, обновления и тестирования 1С.
Подведем итог нашему исследованию. Если документ упорно не хочет выгружаться и заменяется на «удаление», выполним следующие действия:
УдалениеОбъекта. Если он есть — значит, срабатывает программный фильтр.ОтправкаЭлементаДанных.Удалить.Выборка.Отправка в момент формирования сообщения обмена.Помните, что механизм планов обмена в 1С — это сложная многоуровневая система, где настройки интерфейса, программный код модулей и правила конвертации работают в тесной связке. Только комплексный анализ позволит быстро устранить подобные затруднения.