Как исправить ошибки обмена данными между УТ 10.3 и БП 3.0 после обновления конфигураций

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

После планового обновления конфигураций «Управление торговлей 10.3» и «Бухгалтерия предприятия 3.0» пользователи часто сталкиваются с критическими ошибками при попытке запустить привычную синхронизацию данных. Ошибка вида Метод объекта не обнаружен (ПКС_РеализацияТоваровУслуг_УчитыватьНДС...) или отсутствие функций в общих алгоритмах (например, НайтиСсылкуНаОбъектПоРеквизиту) полностью блокируют выгрузку документов. В рамках данной статьи мы подробно разберем, почему возникают эти проблемы и какими способами их можно эффективно решить.

Анализ причин возникновения ошибок

Давайте проанализируем ситуацию: почему вчера работавший обмен сегодня выдает техническую ошибку в коде? Основная причина кроется в специфике работы механизма «Конвертации данных 2.1». Когда мы используем внешние правила обмена (XML-файл), платформа 1С при запуске обмена динамически формирует временный программный модуль. В этот модуль компилируются все обработчики событий (ПриЗагрузке, ПередВыгрузкой, ПриВыгрузкеСвойства), написанные внутри правил.

Рассмотрим основные факторы, приводящие к сбою:

  1. Несоответствие метаданных: В новых релизах УТ 10.3 реквизит УчитыватьНДС может быть помечен «На удаление» или его логика была изменена в связи с изменениями законодательства. Правила, пытаясь обратиться к старому имени или ожидая старый тип данных, вызывают исключение.
  2. Ошибки компиляции модуля: Ошибка с префиксом ПКС_... (Правило Конвертации Свойства) означает, что при генерации динамического модуля обработчик для конкретного свойства не был создан или к нему нет доступа из-за некорректных символов в XML-файле или кэша конфигурации.
  3. Разрыв в версиях БСП: Новая «Бухгалтерия предприятия» использует актуальные версии Библиотеки Стандартных Подсистем (БСП), в то время как УТ 10.3 базируется на старых архитектурных решениях. Функции, вызываемые в правилах (например, НайтиСсылкуНаОбъектПоРеквизиту), могут отсутствовать в модулях УТ, если правила были сформированы без учета обратной совместимости.

Решение 1: Использование встроенных правил из макетов конфигурации

Часто программисты допускают ошибку, загружая в обмен файл StandardExchangeRules.xml из папки с дистрибутивом обновления. Однако более надежным источником являются макеты, уже включенные разработчиками в состав самой конфигурации. Проанализируем, как правильно их извлечь.

Посмотрим на алгоритм действий:

  1. Откроем конфигурацию «Бухгалтерия предприятия 3.0» в режиме «Конфигуратор».
  2. Найдем в дереве метаданных общие макеты или макеты в составе планов обмена, имеющие в названии УТ103_БП30.
  3. Сохраним этот макет как XML-файл на диск.
  4. В «Управлении торговлей» в настройках синхронизации данных укажем этот сохраненный файл в качестве актуальных правил обмена.

Как показывает практика, встроенные макеты проходят более тщательное тестирование внутри релиза и реже содержат опечатки, характерные для внешних файлов из папок tmplts.

Решение 2: Переключение режима совместимости БСП

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

Выясним причину: современные правила для БП 3.0 ожидают наличия определенных серверных модулей обмена. Если мы выставим режим совместимости, система будет использовать более универсальные алгоритмы. Для этого:

  1. Загрузим правила в базу «Конвертация данных».
  2. В форме настройки правил обмена найдем параметр «Режим совместимости».
  3. Установим значение «Версия БСП 2.0» (или аналогичное, обеспечивающее работу с более старыми версиями библиотек).
  4. Выгрузим правила и обновим их в узле обмена.

Решение 3: Обход ошибки через режим отладки

Заметим интересную особенность, упомянутую в обсуждении: иногда обмен успешно проходит, если включен режим отладки обработчиков. Почему так происходит? При включении отладки 1С не формирует модуль в оперативной памяти, а создает полноценную внешнюю обработку на диске, в которую записывает весь код правил. Исполнение кода из физического файла .epf зачастую обходит ограничения динамической компиляции и ошибки кэширования.

Чтобы выполнить выгрузку в этом режиме, выполним следующие шаги:

  1. В настройках обмена (вкладка «Параметры обмена данными») перейдем к настройкам отладки.
  2. Установим флаг «Включить режим отладки выгрузки».
  3. Сформируем файл модуля отладки (внешнюю обработку) с помощью встроенного помощника.
  4. Укажем путь к этому файлу в настройках и запустим обмен.

Важно: Это решение скорее является временным «костылем». Оно позволяет протолкнуть данные, но не устраняет первопричину ошибки в коде.

Решение 4: Корректировка правил в «Конвертации данных»

Если ошибка локализована в конкретном ПКС (например, под номером 63 для документа РеализацияТоваровУслуг), нам придется внести изменения в сами правила. Разберем ситуацию с реквизитом УчитыватьНДС.

В новых релизах структура метаданных изменилась. Если ПКС ссылается на метод ПКС_РеализацияТоваровУслуг_УчитыватьНДС_ПриВыгрузкеСвойства, а этот метод не обнаружен, попробуем следующий алгоритм в Конвертации Данных:

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

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


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

Исправление ошибки «НайтиСсылкуНаОбъектПоРеквизиту»

Эта ошибка в обработчике ПослеЗагрузкиОбъекта для справочника Организации означает, что в правилах прописан вызов функции, которой нет в глобальном контексте или общих алгоритмах правил. В «Конвертации данных» нужно проверить раздел «Алгоритмы».

Если метод отсутствует, его нужно либо добавить в общие алгоритмы правил, либо заменить на стандартную функцию поиска:


// Пример замены специфичного метода на стандартный поиск 1С
НайденнаяСсылка = Справочники[ИмяТипа].НайтиПоРеквизиту(ИмяРеквизита, ЗначениеРеквизита);

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

Подводя итог, наиболее действенным и быстрым способом чаще всего оказывается использование макетов правил непосредственно из текущей конфигурации БП 3.0, так как они гарантированно соответствуют текущей структуре метаданных программы-приемника.

← На главную