При разработке конфигураций в 1С:Предприятие разработчики часто сталкиваются с ошибкой времени выполнения: «Метод объекта не обнаружен (<ИмяМетода>)». Чаще всего эта ситуация возникает при попытке вызвать процедуру или функцию из общего модуля в модуле объекта документа, справочника или формы.
Рассмотрим конкретный пример вызова из модуля объекта:
ПроведениеРасчетов1.РассчитатьНаДетей(Движения.ВыходыДетей, ПланыВидовРасчета.ВыходДетей.Основной, МассивСотрудников);
Если платформа генерирует исключение о том, что метод РассчитатьНаДетей не обнаружен, разберем по шагам ключевые причины возникновения этой ошибки и способы их устранения.
Проанализируем базовый механизм видимости методов в платформе 1С. По умолчанию любая процедура или функция, объявленная в модуле, является локальной и доступна только внутри этого же модуля. Для того чтобы метод можно было вызвать снаружи (через точку от имени общего модуля), его объявление обязательно должно содержать ключевое слово Экспорт.
Посмотрим на пример неправильного объявления процедуры в общем модуле ПроведениеРасчетов1:
Процедура РассчитатьНаДетей(НаборЗаписей, ВидРасчета, МассивСотрудников)
// Код процедуры
КонецПроцедуры
Исправим объявление, добавив ключевое слово Экспорт:
Процедура РассчитатьНаДетей(НаборЗаписей, ВидРасчета, МассивСотрудников) Экспорт
// Код процедуры
КонецПроцедуры
После добавления Экспорт процедура становится открытой для внешних вызовов из других модулей конфигурации.
Выясним причину, связанную с флагами компиляции общего модуля. В свойствах каждого общего модуля задаются параметры доступности в различных контекстах:
ОбработкаПроведения), то в управляемом приложении он всегда выполняется на стороне сервера. В свойствах общего модуля должен быть установлен флаг «Сервер».Если метод объявлен как экспортный, но общий модуль не скомпилирован для того контекста, из которого к нему обращаются, платформа сообщит, что метод объекта не обнаружен.
Разберем ситуацию, когда сам общий модуль доступен на клиенте и сервере, но внутри него использованы директивы условной компиляции. Например:
#Если Клиент Тогда
Процедура РассчитатьНаДетей(НаборЗаписей, ВидРасчета, МассивСотрудников) Экспорт
// Код процедуры
КонецПроцедуры
#КонецЕсли
Если такой метод попытаться вызвать из модуля объекта (который выполняется на сервере), препроцессор исключит этот блок из серверной сборки, и на сервере процедура не будет найдена. Убедимся, что инструкции #Если соответствуют месту вызова метода.
Проанализируем влияние признака глобальности. Если в свойствах общего модуля установлен флаг «Глобальный», то обращение через имя модуля вызовет ошибку:
// ОШИБКА, если модуль ПроведениеРасчетов1 имеет свойство "Глобальный":
ПроведениеРасчетов1.РассчитатьНаДетей(...);
// ПРАВИЛЬНО для глобального модуля:
РассчитатьНаДетей(...);
Если требуется вызывать метод по схеме ИмяМодуля.ИмяМетода(), флаг «Глобальный» в свойствах модуля должен быть снят.
Посмотрим на редкую, но коварную ошибку: совпадение имени переменной и общего модуля. Если в модуле объекта была объявлена или инициализирована переменная с тем же именем, что и общий модуль:
ПроведениеРасчетов1 = "Текстовое значение";
ПроведениеРасчетов1.РассчитатьНаДетей(...); // Ошибка: у строки нет такого метода
В этом случае платформа пытается вызвать метод у локальной переменной, а не у общего модуля конфигурации. Проверим, нет ли в коде повторного использования имени общего модуля в блоке Перем или при присвоении значений.
Проверим написание имен на наличие букв из другой раскладки клавиатуры. Символы кириллицы и латиницы, выглядящие одинаково (например, буквы «C», «O», «P», «A», «E», «X»), воспринимаются платформой как разные идентификаторы. Если в имени метода или модуля смешаны раскладки, платформа выдаст ошибку отсутствия метода.
Если в конфигурацию только что была добавлена новая экспортная процедура с помощью механизма динамического обновления (без перезапуска клиентских сеансов), исполняемый контекст пользователя может содержать устаревшую версию метаданных. Для устранения проблемы выполним полное обновление информационной базы с перезапуском сеанса или очистим кэш конфигурации 1С.
Для поиска описания типов, методов и свойств используем встроенный Синтаксис-помощник (сочетание клавиш Ctrl + F1), который позволяет оперативно проверить контекст доступности и синтаксис конструкций встроенного языка 1С.