При работе с механизмами обмена данными в 1С программисты часто сталкиваются с ситуацией, когда правила, созданные в конфигурации «Конвертация данных», прекрасно работают через обработку «Универсальный обмен данными в формате XML», но вызывают фатальные ошибки при попытке запустить их через штатную Синхронизацию данных. Рассмотрим подробнее, почему так происходит, и разберем по шагам причины возникновения ошибки в модуле ДлительныеОперации.
Типичная ситуация: вы изменили типовые правила обмена между «1С:Зарплата и Управление Персоналом» (ЗУП) и другой базой (например, «Охрана труда»). Вы добавили новые правила конвертации объектов (ПКО) и правила выгрузки данных (ПВД) для пары справочников. При запуске синхронизации система выдает неопределенную ошибку в общем модуле ДлительныеОперации, ссылаясь на метод ПолучитьФоновыеЗадания. Однако при глубокой отладке выясняется, что «корень зла» кроется в следующей строке кода:
Строка в конф = Метаданные.НайтиПоТипу(ТипЗнч(Менеджер)).ПолноеИмя();
Здесь система пытается получить полное имя объекта метаданных по его типу, но функция НайтиПоТипу возвращает Неопределено. Следовательно, попытка вызвать метод ПолноеИмя() у пустого значения приводит к аварийному завершению обмена. Выясним причину, почему стандартные механизмы БСП (Библиотеки стандартных подсистем) не могут распознать тип объекта.
Проанализируем ситуацию: почему в одном случае правила работают, а в другом — нет? Ответ кроется в архитектуре механизмов обмена:
ДлительныеОперации возникает потому, что обмен запускается в фоновом режиме, и когда фоновое задание «падает» из-за ошибки в коде, основное окно лишь сообщает, что не смогло получить результат этого задания.Рассмотрим подробнее факторы, которые приводят к невозможности определить тип объекта метаданных:
1. Объект отсутствует в составе Плана обмена
Если вы добавили в правила обмена (ПКО/ПВД) новый справочник, но не добавили его в состав используемого Плана обмена в конфигураторе, механизмы синхронизации БСП могут дать сбой. Система ожидает, что все объекты, участвующие в синхронизации, зарегистрированы на узле обмена. Если в коде БСП происходит перебор типов, зарегистрированных для обмена, и встречается тип, который не может быть корректно инициализирован в контексте текущего узла, возникает ошибка.
2. Несоответствие правил конвертации и правил регистрации
В современных версиях 1С (ЗУП 3.1 и др.) обмен состоит не только из правил конвертации (ПКО), но и из правил регистрации объектов (ПРО). Если вы добавили объект в ПКО, но забыли обновить правила регистрации или добавить туда условия для этого объекта, система может попытаться обработать «пустой» или некорректный менеджер объекта.
3. Использование некорректных менеджеров в правилах
Проанализируем ситуацию, когда в ПВД указан способ выборки данных, отличный от стандартного. Если в скриптах внутри «Конвертации данных» (например, в обработчике «Перед выгрузкой») происходит обращение к менеджеру объекта, которого нет в базе-приемнике (или базе-источнике в зависимости от направления), это приведет к ошибке. Функция ТипЗнч(Менеджер) может вернуть тип, не являющийся объектом метаданных.
Для решения проблемы рекомендуем выполнить следующие действия:
Поскольку синхронизация выполняется в фоновом режиме, обычная точка останова не сработает. Чтобы увидеть реальное место ошибки, выполните настройки:
ОбщийМодуль.ДлительныеОперации или в месте вызова НайтиПоТипу).Убедитесь, что все справочники и документы, которые вы добавили в свои правила, включены в состав того плана обмена, по которому идет синхронизация. Для этого:
ПланОбмена в дереве метаданных конфигуратора.Синхронизация данных часто кэширует правила обмена. После загрузки обновленных правил в режиме «1С:Предприятие» обязательно:
Чтобы исключить влияние программного кода БСП, попробуйте создать «пустые» правила, где будет всего один простой справочник. Если такой обмен проходит успешно — значит, проблема именно в составе метаданных ваших измененных правил. Посмотрите на пример:
// В обработчике "Перед выгрузкой" ПВД
// проверьте, что Менеджер определен
Если Метаданные.НайтиПоТипу(ТипЗнч(Объект)) = Неопределено Тогда
Сообщить("Ошибка: Тип объекта не найден в метаданных!");
Отказ = Истина;
КонецЕсли;
Ошибка Значение не является значением объектного типа (ПолноеИмя) — это следствие того, что механизмы БСП пытаются работать с объектом, который они не могут идентифицировать. Чаще всего это происходит из-за рассинхронизации состава метаданных в правилах обмена и в Плане обмена самой конфигурации. Всегда проверяйте, чтобы новые объекты были легитимны с точки зрения метаданных обеих баз и зарегистрированы для обмена.