При работе с инструментом «1С:Конвертация данных 2.1» (КД 2.0) разработчики часто сталкиваются с парадоксальной ситуацией. При тестировании правил через обработку «Универсальный обмен данными в формате XML» все данные выгружаются и загружаются корректно, со всеми реквизитами. Однако, как только эти же правила подключаются к реальной синхронизации в 1С:ERP или других конфигурациях на базе БСП (Библиотека стандартных подсистем), объекты начинают приходить «пустыми» — в файле обмена присутствует только внутренний идентификатор (GUID), а значения реквизитов отсутствуют.
В этой статье мы подробно разберем, почему так происходит, как механизмы БСП оптимизируют трафик и какими способами можно заставить систему выгружать объект целиком, не прибегая к ручной правке каждого правила конвертации свойства.
Первым делом нам необходимо понять принципиальную разницу в подходах к выгрузке данных. Рассмотрим два сценария:
ПКС (Правила конвертации свойств). Если реквизит является ссылкой на другой объект, обработка рекурсивно переходит к его правилам и выгружает его полностью, формируя дерево связанных данных.КонвертацияОбъектовИнформационныхБаз, заложена проверка: нужно ли выгружать объект целиком или достаточно передать только его ссылку?Проанализируем ситуацию: если объект (например, справочник «Договоры») не зарегистрирован в плане обмена как измененный, но на него есть ссылка в документе «Реализация», БСП может принять решение выгрузить только ссылку. Логика системы такова: «Раз изменений по договору не было, значит, в базе-приемнике он уже есть или придет позже, когда его действительно изменят».
Ключ к решению проблемы кроется во внутреннем коде обмена. В правилах КД 2.0 существует служебная переменная ВыгрузитьТолькоСсылку. Рассмотрим, как она обрабатывается в недрах БСП.
При выгрузке каждого объекта через ПКО (Правила конвертации объектов) система инициализирует параметры. По умолчанию, если объект выгружается «по ссылке» из другого объекта, БСП устанавливает значение ВыгрузитьТолькоСсылку = Истина. Это происходит в тех случаях, когда объект-свойство не включен в выборку данных для текущей сессии синхронизации.
Как отметил один из участников обсуждения, в модулях БСП часто встречается конструкция:
ВыгрузитьОбъект = Не ВыгрузитьТолькоСсылку;
Следовательно, если система решила, что нам нужна только ссылка, значение ВыгрузитьОбъект автоматически становится Ложь, и выгрузка всех реквизитов (свойств) этого объекта блокируется.
Если проблема касается конкретных реквизитов, можно воспользоваться «грубым», но действенным методом, который применил автор темы. В ПКС (Правила конвертации свойств) для ссылочного реквизита в обработчике «Перед выгрузкой» можно прописать:
ВыгрузитьОбъект = Истина;
Это заставит движок конвертации игнорировать оптимизацию и выгружать данные объекта-ссылки полностью. Однако у этого метода есть существенный минус: если у вас сотни реквизитов в разных объектах, прописывать это вручную в каждом ПКС крайне трудозатратно и неудобно для дальнейшей поддержки правил.
Рассмотрим более элегантный вариант. Вместо того чтобы править каждое свойство (ПКС), мы можем воздействовать на само правило конвертации объекта (ПКО).
В настройках ПКО для «проблемного» справочника найдите обработчик события «Перед выгрузкой». В нем можно управлять поведением выгрузки для всех случаев, когда используется данное правило. Чтобы гарантировать выгрузку данных, используйте следующий код:
ТолькоДанные = Ложь;
// Или в контексте некоторых версий БСП:
ВыгрузитьОбъект = Истина;
Это решение гораздо эффективнее, так как оно работает централизованно. Теперь, где бы ни встретилась ссылка на этот справочник, система будет выгружать его целиком со всеми реквизитами, игнорируя попытки БСП «сэкономить» на трафике.
Выясним причину, скрытую в визуальных настройках ПКО в самой конфигурации «Конвертация данных». Посмотрим на параметр «Режим выгрузки». В КД 2.0 для ПКО доступны несколько вариантов:
Если у вас стоит режим «Выгружать при необходимости», а в плане обмена объект не зарегистрирован, БСП может интерпретировать это как сигнал к выгрузке только ссылки. Попробуйте изменить режим выгрузки на «Выгружать всегда» для тех справочников, чьи реквизиты стабильно «теряются» при обмене.
Часто проблема кроется не в самих правилах конвертации, а в настройках синхронизации данных в интерфейсе 1С:ERP. Разберем этот момент подробнее.
Если справочник (например, «Склады») не включен в состав данных для выгрузки в настройках узла плана обмена (или для него настроены фильтры, под которые объект не попадает), то при попытке выгрузить документ с этим складом, БСП увидит, что склад «запрещен» к выгрузке или не изменен. В этом случае система запишет в XML только {Ref}GUID, чтобы в приемнике произошла попытка поиска по идентификатору.
Что нужно проверить:
Если ни один из способов не помогает, воспользуйтесь проверенным методом отладки. Поскольку при синхронизации через БСП используется фоновое задание, отладить его напрямую сложно. Рекомендуется:
ЗаписьЖурналаРегистрации("ОбменДанными.Выгрузка",,,,"Выгрузка объекта: " + Строка(Источник));
Подводя итог, можно сказать, что проблема «пустых» реквизитов — это штатное поведение механизмов оптимизации БСП. Для обхода этого поведения наиболее правильным и архитектурно верным способом является использование обработчика «Перед выгрузкой» в ПКО с установкой флага ТолькоДанные = Ложь или ВыгрузитьОбъект = Истина. Это обеспечит стабильную передачу данных вне зависимости от того, как именно объект попал в выборку для обмена.