Почему в 1С возникает ошибка «Метод объекта не обнаружен» при вызове функции общего модуля на платформе 8.3?

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

При запуске конфигураций на базе обычных форм (например, «Бухгалтерия предприятия 2.0») на платформе «1С:Предприятие 8.3» разработчики нередко сталкиваются с ошибкой выполнения вида:

{(1)}: Метод объекта не обнаружен (ИспользованиеУниверсальногоПередаточногоДокумента)

При этом в режиме совместимости с платформой 8.2 данный код отрабатывает без нареканий. Разберем по шагам, почему возникает такое поведение, как устроена компиляция общих модулей в платформе 8.3 и какие действия помогут устранить неисправность.

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


ЭлектронныеДокументы.ИспользованиеУниверсальногоПередаточногоДокумента(
    ПараметрыЭД.Организация, 
    ПараметрыЭД.Контрагент, 
    ПараметрыЭД.ДоговорКонтрагента
);

Причина 1. Отключение или некорректная настройка режима совместимости

Проанализируем архитектуру конфигураций редакции 2.0. Они проектировались для работы в режиме толстого клиента обычного приложения. Типовая конфигурация жестко завязана на работу с установленным свойством Режим совместимости (обычно «Версия 8.2.13» или «Версия 8.2.16»).

Если для конфигурации установить значение свойства «Не использовать», платформа 8.3 начинает применять строгие правила изоляции контекстов. При вызове серверных процедур из клиентского кода без явного признака «Вызов сервера» или при попытке вызвать метод модуля, не скомпилированного для текущего контекста, платформа не находит требуемую экспортную функцию.

Для восстановления штатного поведения выполним следующие действия:

  1. Откроем дерево метаданных в конфигураторе и перейдем в палитру свойств корневого узла Конфигурация.
  2. Найдем свойство Режим совместимости.
  3. Установим значение, предусмотренное поставщиком типового решения (например, Версия 8.2.13 или Версия 8.2.16).
  4. Выполним обновление конфигурации базы данных.

Причина 2. Несоответствие контекста выполнения и свойств общих модулей

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

Если вызывающий код расположен в модуле формы или служебном модуле на стороне клиента, а вызываемый общий модуль ЭлектронныеДокументы не имеет нужных признаков компиляции, метод не будет виден платформе.

Проверим и скорректируем свойства модулей:

  1. Найдем в ветке Общие модули модуль ЭлектронныеДокументы и вызывающий модуль (например, ЭлектронныеДокументыСлужебный).
  2. Откроем палитру свойств каждого модуля.
  3. Убедимся, что для работы в обычном приложении включены флаги Сервер и Клиент (обычное приложение).
  4. Если функция должна исполняться строго на сервере, а вызывается с клиента, убедимся, что у модуля включен флаг Вызов сервера.
  5. В тексте модуля убедимся в наличии ключевого слова Экспорт в объявлении функции:

Функция ИспользованиеУниверсальногоПередаточногоДокумента(Организация, Контрагент, ДоговорКонтрагента) Экспорт
    // Алгоритм проверки использования УПД
    Возврат Истина;
КонецФункции

Причина 3. Инструкции препроцессора внутри текста модуля

Рассмотрим случай, когда сам модуль скомпилирован, но конкретная функция вырезается препроцессором. Если метод обрамлен директивами #Если Сервер Тогда ... #КонецЕсли, а вызов инициируется на клиенте толстого приложения, функция будет отсутствовать в контексте выполнения клиента.

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


#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ВнешнееСоединение Тогда

Функция ИспользованиеУниверсальногоПередаточногоДокумента(Организация, Контрагент, ДоговорКонтрагента) Экспорт
    // Код функции
КонецФункции

#КонецЕсли

Причина 4. Некорректный режим запуска информационной базы

Конфигурации для обычных форм требуют явного указания режима запуска. Если сеанс пользователя стартует в режиме тонкого клиента или управляемого приложения, многие модули обычных форм не инициализируются.

Разберем, как проверить режим запуска:

  1. В окне запуска списка информационных баз выделим нужную базу, нажмем Изменить и перейдем на вкладку параметров запуска.
  2. В поле дополнительных параметров командной строки добавим ключ: /RunModeOrdinaryApplication.
  3. В конфигураторе в меню Администрирование — Пользователи откроем свойства пользователя и проверим, чтобы параметр Основной режим запуска имел значение Обычное приложение.

Причина 5. Повреждение локального кэша метаданных

При переходе между версиями платформ 8.2 и 8.3 либо после динамического обновления базы данных кэш скомпилированных модулей может содержать устаревшую структуру метаданных. В результате платформа обращается к старой версии модуля, где новый метод еще не был зарегистрирован.

Для устранения сбоя выполним очистку кэша:

  1. Запустим сеанс «1С:Предприятия» с параметром /ClearCache.
  2. При необходимости вручную удалим содержимое каталогов временных файлов пользователя (папки %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8).

Диагностика с помощью синтаксического контроля

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

  1. В главном меню Конфигуратора выберем Конфигурация — Проверка конфигурации....
  2. Установим флаги Синтаксический контроль и Проверка логической целостности конфигурации.
  3. В блоке проверки синтаксиса отметим режимы: Тонкий клиент, Сервер, Толстый клиент обычное приложение и Внешнее соединение.
  4. Запустим проверку и проанализируем сформированный список ошибок контекстной видимости.
← На главную