Как исправить ошибку Переменная не определена (Объект) и настроить фильтрацию в Конвертации данных 2.1?

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

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

Причина ошибки Переменная не определена (Объект)

Проанализируем текст ошибки из лога выгрузки. Система сообщает об ошибке в глобальном обработчике события ПередКонвертациейОбъекта. Основная причина здесь кроется в программном интерфейсе КД 2.1. В разных обработчиках для доступа к данным объекта используются разные имена переменных.

В обработчике Перед выгрузкой объекта (ПВО) действительно используется переменная Объект. Однако в обработчике Перед конвертацией объекта (ПКО) — как в локальном, так и в глобальном — переменная с таким именем отсутствует. Вместо нее следует использовать переменную Источник. Когда система пытается скомпилировать модуль обмена и встречает обращение к Объект там, где эта переменная не объявлена, возникает ошибка компиляции (код сообщения 64).

Фантомные ошибки в закомментированном коде

Выясним, почему ошибка возникает, даже если вы закомментировали код. Механизм работы ОбменДаннымиXML устроен так, что при загрузке правил обмена в информационную базу (ИБ) система динамически формирует программные модули на основе текста, хранящегося в XML-файле правил.

Если в поле обработчика в КД 2.1 остался любой текст — будь то комментарии, лишние пробелы или пустые строки — платформа может попытаться включить этот фрагмент в блок компиляции. Чтобы гарантированно избавиться от ошибки в "неиспользуемом" обработчике, выполним следующие шаги:

  1. Откроем правила в конфигурации Конвертация данных.
  2. Перейдем на вкладку Параметры конвертации и найдем нужный глобальный обработчик (например, ПередКонвертациейОбъекта).
  3. Полностью очистим содержимое текстового поля (Ctrl+A -> Delete). Убедимся, что там не осталось даже пробелов.
  4. Сохраним правила и заново выгрузим XML-файл.
  5. Критически важно: Обновим правила как в базе-источнике, так и в базе-приемнике (если это требуется архитектурой обмена), чтобы исключить использование старого кэшированного кода.

Проблема фильтрации связанных документов

Разберем ситуацию, когда документ (например, РеализацияТоваровУслуг) успешно отфильтровывается, а связанная с ним СчетФактураВыданная все равно выгружается. Рассмотрим пример кода, который часто используют в обработчике Перед выгрузкой объекта для фильтрации по подразделению:


Если Объект.Метаданные().Реквизиты.Найти("Подразделение") <> Неопределено Тогда 
    Если ЗначениеЗаполнено(Объект.Подразделение) Тогда
        Если НЕ(Объект.Подразделение.ПринадлежитЭлементу(ПодразделениеФильтр)) Тогда
            Сообщить("---Объект пропущен " + Строка(Объект));
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Установка параметра Отказ = Истина в ПВО работает только в том случае, если объект выгружается как самостоятельная единица (из выборки или по регистрации). Однако в КД 2.1 существует механизм выгрузки по ссылке. Если другой объект (например, какой-то отчет или связанный документ), который прошел фильтр, содержит ссылку на вашу Счет-фактуру, то система выгрузит её принудительно для обеспечения ссылочной целостности, игнорируя Отказ в ПВО.

Способы надежной фильтрации данных

Проанализируем три метода, которые помогут избежать нежелательной выгрузки связанных объектов:

1. Использование правил регистрации данных (ПРД)

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

2. Настройка выгрузки по ссылке в ПКС

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

3. Использование обработчика Перед выгрузкой в ПКО

Если логика фильтрации сложная и зависит от текущего момента выгрузки, используем обработчик Перед выгрузкой на уровне конкретного Правила Конвертации Объекта (ПКО). Проверим условие и установим Отказ = Истина. Чтобы предотвратить выгрузку по ссылке, в этом же ПКО можно программно проверять параметр ИмяПКО или использовать глобальные переменные для отслеживания контекста выгрузки.

Рекомендации по отладке

Чтобы точно определить, какой фрагмент кода вызывает ошибку Переменная не определена, выполним следующие действия:

  1. Используем внешнюю обработку УниверсальныйОбменДаннымиXML.
  2. На вкладке Дополнительные настройки установим флаг Режим отладки обработчиков выгрузки.
  3. При возникновении ошибки система предложит сформировать модуль отладки. Это обычный текстовый файл (или модуль обработки), в котором по номеру строки из сообщения об ошибке (например, 9886) можно увидеть сгенерированный код. Там вы сразу заметите, в каком именно месте используется слово Объект вместо Источник.

Таким образом, для стабильной работы обмена необходимо строго соблюдать соответствие имен переменных контексту обработчика и учитывать приоритет выгрузки по ссылкам над условиями Отказ в правилах выгрузки.

← На главную