При работе с обменами данными в формате XML, особенно при использовании правил, созданных в конфигурации Конвертация данных 2.1, специалисты часто сталкиваются с неожиданным поведением системы. Одной из наиболее специфических проблем является ошибка «Метод объекта не обнаружен (КодОсновногоЯзыка)». Ситуация осложняется тем, что ошибка может возникать внезапно на типовых конфигурациях, находящихся на поддержке, и не сопровождаться подробным описанием в стеке вызовов. Если XML-правила планируется использовать для постоянной синхронизации, можно настроить регулярный обмен данными между базами 1С по расписанию.
В данной статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутреннее устройство обработки УниверсальныйОбменДаннымиВФорматеXML и рассмотрим несколько способов решения проблемы, включая использование расширений и механизмов отладки.
Для начала проанализируем ситуацию: ошибка возникает в момент загрузки правил или непосредственно при выполнении обмена. Если заглянуть «под капот» обработки, мы увидим, что вызов метода происходит в модуле управляемой формы. В строке кода это выглядит примерно так:
ОбъектДляСервера.КодОсновногоЯзыка()
Проблема заключается в том, что в некоторых версиях Библиотеки стандартных подсистем (БСП), на основе которой построена обработка, разработчики добавили функцию КодОсновногоЯзыка() в модуль объекта, но забыли добавить ключевое слово Экспорт. Поскольку в управляемом приложении модуль формы (клиент) обращается к модулю объекта (сервер) через контекст серверного вызова, отсутствие признака экспорта делает метод невидимым для формы. Это классическая программная недоработка, которая часто встречается в локализованных версиях конфигураций (например, для Беларуси или Казахстана).
Ошибка проявляется именно при записи событий в Журнал регистрации. Система пытается сформировать информационное сообщение на языке пользователя, используя функцию НСтр, и вызывает метод для определения кода языка:
ЗаписьЖурналаРегистрации(НСтр("ru = 'Универсальный обмен данными в формате XML'", ОбъектДляСервера.КодОсновногоЯзыка()), ...);
Самый простой и безопасный способ, который мы рекомендуем рассмотреть в первую очередь — это использование внешней версии обработки УниверсальныйОбменДаннымиВФорматеXML.epf. Рассмотрим, почему это помогает:
Экспорт.Для этого выполним следующие действия:
Откроем конфигуратор, выберем Файл — Открыть, выберем файл обработки. Перейдем в Модуль объекта, найдем через поиск (Ctrl+F) текст Функция КодОсновногоЯзыка. Если после закрывающей скобки нет слова Экспорт, добавим его вручную:
Функция КодОсновногоЯзыка() Экспорт
// Код функции
КонецФункции
Если конфигурация стоит на поддержке и мы не хотим её снимать или вносить изменения напрямую в типовые объекты, оптимальным решением будет создание Расширения. Рассмотрим этот процесс по шагам:
УниверсальныйОбменДаннымиВФорматеXML и добавим её в расширение.Экспорт.Пример кода для расширения, который позволит обойти проблему обращения к неэкспортному методу:
&ИзменениеИКонтроль("КодОсновногоЯзыка")
Функция Расш1_КодОсновногоЯзыка() Экспорт
// Мы можем просто вернуть "ru" или вызвать оригинальный метод, если это позволяет контекст
Возврат "ru";
КонецФункции
Важный момент: если вы используете расширение, убедитесь, что у него снят флажок «Безопасный режим», иначе вызовы некоторых методов внутри универсального обмена могут быть заблокированы системой прав доступа.
Часто в процессе решения основной проблемы пользователи пытаются включить «Режим отладки обработчиков загрузки» и сталкиваются с новой ошибкой: «Каталог не обнаружен». Разберем, почему это происходит.
Для отладки обработчиков (тех самых кусочков кода, которые написаны внутри правил в КД 2.1), 1С должна выгрузить этот код во внешний текстовый файл (модуль отладки), чтобы потом динамически его подключить. Ошибка возникает по двум причинам:
C:\MyDebug\, то сервер 1С (работающий под системной учетной записью) может не иметь прав на запись в эту папку или вообще «не видеть» ваш локальный диск.Рассмотрим правильный алгоритм настройки отладки:
USR1CV8 полные права на эту папку.Проанализируем еще один нюанс: обработка УниверсальныйОбменДаннымиВФорматеXML изначально проектировалась для толстого клиента. В современных управляемых конфигурациях используется её версия, адаптированная под тонкий клиент, но она всё равно выполняет основной массив работы на сервере. Для работы в разных режимах клиента и версиях платформы можно использовать дополненную версию обработки универсального обмена данными XML.
Если вы столкнулись с ошибкой Метод объекта не обнаружен, проверьте, в каком режиме запущена информационная база. Иногда переключение в режим Толстого клиента (управляемое приложение) позволяет обойти ошибки серверных вызовов, так как контекст выполнения меняется, и форма может получить доступ к методам объекта напрямую. Однако, правильным долгосрочным решением остается добавление ключевого слова Экспорт.
Рассмотрим ситуацию: вы успешно загружали данные ранее, но на новом документе (например, ОперацияБух) система «упала». Это происходит потому, что вызов метода КодОсновногоЯзыка() зашит в блоки обработки исключений или информационных сообщений.
Если загрузка идет гладко, код обходит эти участки. Как только возникает малейшее предупреждение (например, не найдено субконто или объект не прошел валидацию), система пытается записать это в журнал, обращается к языковым настройкам и провоцирует ошибку. Таким образом, сама ошибка КодОсновногоЯзыка лишь маскирует первичную проблему в данных, которую вы могли бы увидеть в протоколе обмена, если бы не этот баг в коде.
Подведем итог: для устранения проблемы достаточно обеспечить экспортность метода в модуле объекта обработки любым доступным способом (через внешнюю обработку или расширение) и корректно настроить пути к файлам отладки, учитывая права доступа серверной службы 1С.