Почему объекты не выгружаются полностью при использовании плана обмена в 1С и как это исправить

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

При настройке обмена данными между конфигурациями 1С программисты часто сталкиваются с парадоксальной ситуацией: правила обмена, созданные в Конвертации данных 2.1, идеально работают через обработку Универсальный обмен данными XML, но при попытке запустить тот же самый обмен через План обмена (в составе типовых механизмов или БСП) подчиненные объекты (справочники, значения реквизитов) перестают выгружаться полностью. Вместо полноценного объекта в файл обмена попадает только ссылка — УИД и поля поиска. Рассмотрим подробно, почему это происходит и как заставить систему выгружать данные целиком. Для отладки таких правил непосредственно с учетом узлов планов обмена можно использовать модифицированную обработку универсального обмена XML.

Выясним причину: отличие Универсального обмена от Плана обмена

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

В типовых конфигурациях (УТ 11, БП 3.0, ERP) на базе БСП (Библиотеки стандартных подсистем) часто программно устанавливается запрет на выгрузку объектов по ссылкам. Система ожидает, что каждый справочник будет зарегистрирован на узле плана обмена самостоятельно, когда он изменится. Если справочник не зарегистрирован, а выгружается только «прицепом» к документу, движок обмена экономит ресурсы и передает только ссылку. Рассмотрим, какими способами можно обойти это поведение.

Решение 1. Настройка правил конвертации в КД 2.1

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

  1. Найдите нужное ПКО.
  2. Перейдите на закладку Настройки.
  3. Установите флаг «Не запоминать выгруженные объекты». Это заставит систему каждый раз анализировать объект заново.
  4. На вкладке On-line обмен (если она доступна в вашей версии) попробуйте установить галочку «Выгружать объект (полностью), только при наличии на него ссылки».

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

Решение 2. Использование обработчиков событий (Программный метод)

Если настройки в интерфейсе КД не помогают, перейдем к программному управлению поведением движка обмена. В Конвертации данных 2.1 существует предопределенный параметр ТолькоПолучитьУзелСсылки. По умолчанию при выгрузке по ссылке он часто принимает значение Истина. Наша задача — принудительно переопределить его.

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

ТолькоПолучитьУзелСсылки = Ложь;

В некоторых случаях, особенно в сложных правилах для документов, может потребоваться более жесткая связка флагов в обработчике «При выгрузке»:


ВыгрузитьТолькоСсылку = Ложь;
ВыгрузитьОбъект = Истина;

Этот метод заставляет движок игнорировать оптимизацию и описывать все реквизиты объекта в XML-файле. Однако помните о циклических ссылках. Проанализируем пример: у Контрагента есть ОсновнойБанковскийСчет, а у БанковскогоСчета есть реквизит Владелец (Контрагент). Если в обоих ПКО прописать ТолькоПолучитьУзелСсылки = Ложь, вы получите переполнение стека. Чтобы этого избежать, используйте условие ВыгрузитьОбъект = Истина только в родительском объекте или проверяйте глубину вызова.

Решение 3. Корректировка кода обмена в конфигурации (БСП)

Иногда проблема кроется глубже — в программном коде самой конфигурации, который инициирует обмен. В типовых решениях на базе БСП (например, УТ 11) в общем модуле ОбменДаннымиСервер может быть жестко прописано ограничение.

Разберем пример исправления в функции ПолучитьОбработкуОбменаДаннымиДляВыгрузки. Найдем строку, где устанавливается свойство НеВыгружатьОбъектыПоСсылкам, и добавим условие для нашего плана обмена:


// В общем модуле ОбменДаннымиСервер
Если ТипЗнч(СтруктураНастроекОбмена.УзелИнформационнойБазы) = Тип("ПланОбменаСсылка.ВашСобственныйОбмен") Тогда
    ОбработкаОбменаДанными.НеВыгружатьОбъектыПоСсылкам = Ложь;
Иначе
    ОбработкаОбменаДанными.НеВыгружатьОбъектыПоСсылкам = Истина;
КонецЕсли;

Этот параметр является ключевым для БСП. Если он установлен в Истина, движок обмена будет игнорировать любые настройки ТолькоПолучитьУзелСсылки в правилах КД, так как ограничение накладывается на уровне самой обработки обмена.

Решение 4. Настройка Правил регистрации объектов (ПРО)

Проанализируем еще один аспект — Правила регистрации. Даже если ПКО настроено идеально, объект может не уходить полностью, если механизм регистрации считает его «необязательным».

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

Важный нюанс: Регистр «Соответствия объектов информационных баз»

Рассмотрим ситуацию, когда объект выгрузился один раз нормально, а после изменения реквизитов (например, поменяли наименование Единицы измерения) изменения не приходят.

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

Решение: Если вам нужно, чтобы данные справочника обновились в приемнике, этот справочник должен быть зарегистрирован на узле плана обмена. Только регистрация изменения самого объекта заставит систему выгрузить его реквизиты повторно при обмене по плану. Для быстрого выполнения этой операции без открытия лишних меню можно использовать инструмент для регистрации или удаления объектов из плана обмена прямо с формы.

Подведем итог. Для решения проблемы неполной выгрузки мы рекомендуем начать с установки ТолькоПолучитьУзелСсылки = Ложь в правилах КД. Если это не помогает — проверьте настройки модуля ОбменДаннымиСервер в вашей конфигурации на наличие флага НеВыгружатьОбъектыПоСсылкам. Совместное использование этих методов позволяет добиться корректной передачи данных в любых типах обмена.

← На главную