После планового обновления конфигураций «Управление торговлей 10.3» и «Бухгалтерия предприятия 3.0» пользователи часто сталкиваются с критическими ошибками при попытке запустить привычную синхронизацию данных. Ошибка вида Метод объекта не обнаружен (ПКС_РеализацияТоваровУслуг_УчитыватьНДС...) или отсутствие функций в общих алгоритмах (например, НайтиСсылкуНаОбъектПоРеквизиту) полностью блокируют выгрузку документов. В рамках данной статьи мы подробно разберем, почему возникают эти проблемы и какими способами их можно эффективно решить.
Давайте проанализируем ситуацию: почему вчера работавший обмен сегодня выдает техническую ошибку в коде? Основная причина кроется в специфике работы механизма «Конвертации данных 2.1». Когда мы используем внешние правила обмена (XML-файл), платформа 1С при запуске обмена динамически формирует временный программный модуль. В этот модуль компилируются все обработчики событий (ПриЗагрузке, ПередВыгрузкой, ПриВыгрузкеСвойства), написанные внутри правил.
Рассмотрим основные факторы, приводящие к сбою:
УчитыватьНДС может быть помечен «На удаление» или его логика была изменена в связи с изменениями законодательства. Правила, пытаясь обратиться к старому имени или ожидая старый тип данных, вызывают исключение.ПКС_... (Правило Конвертации Свойства) означает, что при генерации динамического модуля обработчик для конкретного свойства не был создан или к нему нет доступа из-за некорректных символов в XML-файле или кэша конфигурации.НайтиСсылкуНаОбъектПоРеквизиту), могут отсутствовать в модулях УТ, если правила были сформированы без учета обратной совместимости.Часто программисты допускают ошибку, загружая в обмен файл StandardExchangeRules.xml из папки с дистрибутивом обновления. Однако более надежным источником являются макеты, уже включенные разработчиками в состав самой конфигурации. Проанализируем, как правильно их извлечь.
Посмотрим на алгоритм действий:
УТ103_БП30.Как показывает практика, встроенные макеты проходят более тщательное тестирование внутри релиза и реже содержат опечатки, характерные для внешних файлов из папок tmplts.
Если ошибка связана с отсутствием методов в общих модулях (например, НайтиСсылкуНаОбъектПоРеквизиту в обработчике ПослеЗагрузкиОбъекта), эффективным решением будет корректировка параметров самих правил в конфигурации «Конвертация данных 2.1».
Выясним причину: современные правила для БП 3.0 ожидают наличия определенных серверных модулей обмена. Если мы выставим режим совместимости, система будет использовать более универсальные алгоритмы. Для этого:
Заметим интересную особенность, упомянутую в обсуждении: иногда обмен успешно проходит, если включен режим отладки обработчиков. Почему так происходит? При включении отладки 1С не формирует модуль в оперативной памяти, а создает полноценную внешнюю обработку на диске, в которую записывает весь код правил. Исполнение кода из физического файла .epf зачастую обходит ограничения динамической компиляции и ошибки кэширования.
Чтобы выполнить выгрузку в этом режиме, выполним следующие шаги:
Важно: Это решение скорее является временным «костылем». Оно позволяет протолкнуть данные, но не устраняет первопричину ошибки в коде.
Если ошибка локализована в конкретном ПКС (например, под номером 63 для документа РеализацияТоваровУслуг), нам придется внести изменения в сами правила. Разберем ситуацию с реквизитом УчитыватьНДС.
В новых релизах структура метаданных изменилась. Если ПКС ссылается на метод ПКС_РеализацияТоваровУслуг_УчитыватьНДС_ПриВыгрузкеСвойства, а этот метод не обнаружен, попробуем следующий алгоритм в Конвертации Данных:
РеализацияТоваровУслуг.УчитыватьНДС. Если оно вызывает ошибку, попробуем отключить выгрузку этого свойства (снять флаг «Передавать в приемник»).УчитыватьНДС критически важен, проверим, не переименован ли реквизит в УдалитьУчитыватьНДС. Если да — заменим источник в правилах.Пример кода, который можно использовать в обработчике ПередВыгрузкой свойства, чтобы избежать обращения к несуществующим методам:
// Вместо автоматической передачи значения, напишем явное условие
Если Объект.Метаданные().Реквизиты.Найти("УчитыватьНДС") <> Неопределено Тогда
Значение = Объект.УчитыватьНДС;
ИначеЕсли Объект.Метаданные().Реквизиты.Найти("ДокументБезНДС") <> Неопределено Тогда
Значение = НЕ Объект.ДокументБезНДС;
КонецЕсли;
Эта ошибка в обработчике ПослеЗагрузкиОбъекта для справочника Организации означает, что в правилах прописан вызов функции, которой нет в глобальном контексте или общих алгоритмах правил. В «Конвертации данных» нужно проверить раздел «Алгоритмы».
Если метод отсутствует, его нужно либо добавить в общие алгоритмы правил, либо заменить на стандартную функцию поиска:
// Пример замены специфичного метода на стандартный поиск 1С
НайденнаяСсылка = Справочники[ИмяТипа].НайтиПоРеквизиту(ИмяРеквизита, ЗначениеРеквизита);
Помните, что после любых изменений в конфигурации «Конвертация данных» необходимо заново загрузить измененные правила в обе базы (и в УТ, и в БП, если обмен двусторонний) и обязательно очистить кэш на стороне сервера приложений, если вы работаете в клиент-серверном варианте.
Подводя итог, наиболее действенным и быстрым способом чаще всего оказывается использование макетов правил непосредственно из текущей конфигурации БП 3.0, так как они гарантированно соответствуют текущей структуре метаданных программы-приемника.