Ошибка 1С: Процедура или функция с указанным именем не определена — Решение
- Ошибка синтаксического анализа или времени выполнения при попытке вызова процедуры/функции.
- Текст сбоя:
{Модуль(Строка)}: Процедура или функция с указанным именем не определена (ИмяМетода). - Сбой при обращении к серверным процедурам из клиентского контекста или к неэкспортным методам других модулей.
1. Причины недоступности процедуры/функции
Ошибка указывает на то, что компилятор 1С на текущей стадии разбора не может обнаружить метод с данным идентификатором в локальной области видимости, в контексте общих модулей или среди системных функций платформы. Основные причины:
- Опечатка в названии процедуры/функции в месте вызова;
- Попытка вызова процедуры из другого модуля без указания имени модуля (например,
Метод()вместоОбщийМодуль.Метод()); - В объявлении целевой процедуры пропущено ключевое слово
Экспорт; - Контекстная недоступность: вызов серверного метода из клиентского кода (или наоборот), когда модуль не скомпилирован для соответствующего окружения.
2. Пошаговые сценарии исправления
Сценарий 1: Добавление ключевого слова Экспорт
Если метод вызывается из другого модуля, формы или объекта, он обязан быть объявлен как экспортный:
// В исходном модуле (было):
Процедура РассчитатьИтоги()
// ИСПРАВЛЕНИЕ (стало):
Процедура РассчитатьИтоги() Экспорт
// Тело метода
КонецПроцедурыСценарий 2: Указание префикса общего модуля
// ОШИБКА: попытка прямого вызова из формы:
СтрокаБезПробелов = СократитьВсеПробелы(Текст); // Не определена!
// ИСПРАВЛЕНИЕ: явное указание общего модуля БСП:
СтрокаБезПробелов = СтроковыеФункцииКлиентСервер.СократитьВсеПробелы(Текст);Сценарий 3: Разрешение клиент-серверного вызова в модуле формы
Клиентский код формы (&НаКлиенте) не может напрямую вызывать процедуры модуля объекта. Требуется создать серверную процедуру-адаптер:
&НаКлиенте
Процедура КомандаОбработать(Команда)
// Вызываем промежуточный серверный метод формы
ОбработатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбработатьНаСервере()
// Получаем объект и вызываем его экспортный метод
ОбъектРеквизит = РеквизитФормыВЗначение("Объект");
ОбъектРеквизит.ВыполнитьДействие();
ЗначениеВРеквизитФормы(ОбъектРеквизит, "Объект");
КонецПроцедуры Частые вопросы (FAQ)
Почему процедура объявлена с Экспорт, но ошибка все равно возникает?
Проверьте флаги компиляции общего модуля в свойствах: если модуль имеет флаг 'Сервер', но выключен флаг 'Клиент (управляемое приложение)', клиентский код не увидит этот модуль.
Влияет ли порядок объявления процедур в модуле на их видимость?
Нет. В отличие от языков типа C/Pascal, компилятор 1С собирает карту сигнатур всех методов модуля на первом проходе, поэтому метод можно вызывать выше строки его объявления.
Почему метод формы не виден из модуля команды?
Процедуры формы инкапсулированы внутри контекста экземпляра формы. Модуль команды может вызывать только экспортные методы общих модулей или менеджеров объектов.
Как вызвать метод подсистемы, добавленный в расширении?
Убедитесь, что расширение подключено, активно, и имя метода расширения не содержит опечаток. Если метод переопределен аннотацией &ИзменениеИКонтроль, его имя остается прежним.