К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как обратиться к функции в 1С: практическое руководство

Как правильно обратиться к функции в 1С: синтаксис вызова, передача параметров, возврат значения, экспортные функции общих модулей, типичные ошибки и проверка результата.

Обращение к функции — базовая операция во встроенном языке 1С, но именно здесь начинающие разработчики чаще всего получают ошибки «Процедура или функция с указанным именем не определена» или теряют возвращаемое значение. Причина почти всегда одна: неправильно указано место объявления функции, нарушен порядок параметров или вызов идёт из контекста, где функция недоступна.

Функция в 1С — это именованный блок кода, который принимает параметры, выполняет вычисления и возвращает результат через оператор «Возврат». В отличие от процедуры, функцию можно использовать в выражениях: присваивании, условиях, арифметических операциях. Вызов всегда записывается как имя функции, за которым в круглых скобках перечисляются аргументы.

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

Синтаксис вызова функции

Простейший вызов выглядит так: имя функции, открывающая скобка, список аргументов через запятую, закрывающая скобка. Если параметров нет, скобки всё равно обязательны — их отсутствие приведёт к тому, что платформа попытается обратиться к переменной с таким именем, а не выполнить функцию.

Результат = РассчитатьСкидку(СуммаДокумента, КатегорияКлиента);

ТекущаяДата = ТекущаяДатаСеанса(); // вызов без параметров

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

bsl
СуммаСНДС = Окр(Сумма * 1.2, 2);
Если ПроверитьКонтрагента(ИНН) Тогда
    Продолжить;
КонецЕсли;

Как объявить функцию, чтобы к ней можно было обратиться

Функция объявляется ключевым словом «Функция», затем имя, список параметров в скобках, тело и обязательный «Возврат Значение;» в конце. Без оператора «Возврат» функция вернёт «Неопределено», что часто становится источником скрытых ошибок в расчётах.

Функция РассчитатьСкидку(Сумма, Категория) Экспорт

Если Категория = "VIP" Тогда

Возврат Сумма * 0.15;

Иначе

Возврат 0;

КонецЕсли;

КонецФункции

Ключевое слово «Экспорт» делает функцию доступной из других модулей. Без него функция является приватной и видна только внутри своего модуля. Порядок объявления внутри модуля значения не имеет: можно вызывать функцию, объявленную ниже по тексту.

Обращение к функции общего модуля

Наиболее частый сценарий в прикладной разработке — вызов функции из общего модуля. Синтаксис: имя общего модуля, точка, имя функции с аргументами. Функция обязательно должна быть объявлена с «Экспорт», а сам модуль — доступен в нужном контексте (клиент, сервер).

Настройки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка);

Скидка = РасчетыСервер.РассчитатьСкидку(Сумма, Категория);

Если у общего модуля установлен признак «Сервер», вызвать его функцию из клиентского контекста напрямую нельзя — потребуется серверная процедура-обёртка в модуле формы с директивой «&НаСервере». Попытка вызвать серверный модуль с клиента даст ошибку компиляции модуля ещё до запуска.

Порядок вызова функции общего модуля
  1. 1
    Откройте общий модуль и убедитесь, что функция объявлена с ключевым словом Экспорт
  2. 2
    Проверьте флажки контекста модуля: Сервер, Клиент, Вызов сервера — они должны соответствовать месту вызова
  3. 3
    В месте вызова напишите ИмяМодуля.ИмяФункции(аргументы) и присвойте результат переменной
  4. 4
    Запустите синтаксическую проверку модуля (Ctrl+F7 в конфигураторе)
  5. 5
    Выполните код в отладке и убедитесь, что функция вернула ожидаемое значение

Параметры: обязательные, по умолчанию и передача по ссылке

Параметры функции перечисляются при вызове строго в том порядке, в котором объявлены. Если параметру задано значение по умолчанию, его можно опустить — но только если все последующие параметры тоже опущены. Пропустить параметр «в середине» списка нельзя, придётся указать значение явно.

Функция СформироватьОтчет(Период, Организация = Неопределено, Валюта = "RUB") Экспорт

// ...

КонецФункции

// Корректные вызовы:

СформироватьОтчет(Период);

СформироватьОтчет(Период, МояОрганизация);

СформироватьОтчет(Период, МояОрганизация, "USD");

По умолчанию параметры передаются по ссылке: если внутри функции изменить параметр, изменится и переменная в месте вызова. Ключевое слово «Знач» перед параметром отключает это поведение — функция получит копию. Случайное изменение параметра по ссылке — классический источник трудноуловимых дефектов.

Где объявлять функцию: выбор места

Функцию, нужную только внутри одной формы, объявляют в модуле формы с директивой контекста — «&НаКлиенте», «&НаСервере» или «&НаСервереБезКонтекста». Последний вариант предпочтителен для вычислений: он не тащит на сервер данные формы и работает быстрее.

Функцию, используемую в нескольких объектах, выносят в общий модуль. Помещать экспортные функции в модуль объекта или модуль менеджера стоит только если логика жёстко привязана к этому объекту — например, расчёт специфичного реквизита документа.

Где разместить функцию

Модуль формы

Подходит для обработчиков и вспомогательных расчётов конкретной формы. Ограничение: недоступна извне формы.

Общий модуль

Для переиспользуемой логики. Требует Экспорт и корректных флажков контекста; вызов через ИмяМодуля.ИмяФункции().

Модуль объекта / менеджера

Для логики, неотделимой от конкретного объекта. Вызов из модуля менеджера: Справочники.Номенклатура.ИмяФункции().

Проверка результата и отладка вызова

После вызова функции проверяйте тип и содержимое возвращённого значения, особенно если функция может вернуть «Неопределено» — типичный признак того, что сработала ветка без «Возврат». Для быстрой диагностики используйте «Сообщить()» или вывод в журнал регистрации, для глубокой — точку останова в конфигураторе.

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

Контрольные точки

Как проверить результат

Тип возвращаемого значения
Норма

Совпадает с ожидаемым (число, строка, структура)

Тревожный признак

Неопределено или тип другого вида — ищите ветку без Возврат

Синтаксическая проверка модуля
Норма

Ctrl+F7 завершается без ошибок

Тревожный признак

Ошибка «функция не определена» — проверьте Экспорт и имя модуля

Поведение в отладчике
Норма

F11 заходит внутрь нужной функции

Тревожный признак

Выполнение проходит мимо — конфликт имён или не тот контекст

Типичные ошибки при обращении к функциям

Самая частая ошибка — «Процедура или функция с указанным именем не определена». Причины: функция объявлена без «Экспорт», опечатка в имени, обращение к общему модулю не по его имени или вызов серверной функции из клиентского контекста. Проверка начинается с точного имени модуля и функции в конфигураторе.

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

Типичные ошибки
01
Вызов без скобок: Результат = МояФункция — платформа ищет переменную, а не выполняет функцию
02
Забыто ключевое слово Экспорт — функция недоступна из других модулей, ошибка «не определена»
03
Пропущен Возврат в одной из веток — функция неожиданно возвращает Неопределено
04
Вызов серверного общего модуля из клиентского контекста — ошибка компиляции
05
Изменение параметра, переданного по ссылке, без намерения — побочные эффекты в вызывающем коде

FAQ

Чем функция отличается от процедуры при вызове?

Функция возвращает значение через «Возврат» и может использоваться в выражениях: присваивании, условии, арифметике. Процедура значения не возвращает и вызывается только отдельным оператором. Синтаксис вызова со скобками и параметрами у них одинаковый.

Как вызвать функцию из модуля менеджера объекта?

Через точку от менеджера: Справочники.Номенклатура.ИмяФункции(Параметры) или Документы.РеализацияТоваров.ИмяФункции(). Функция в модуле менеджера должна быть объявлена с «Экспорт». Такой вызов выполняется на сервере, поэтому из клиентского кода понадобится серверная обёртка.

Можно ли вызвать функцию до её объявления в том же модуле?

Да. Внутри одного модуля порядок объявления не важен: компилятор сначала собирает все объявления, затем проверяет вызовы. Ограничение действует только между разными модулями — там решает видимость и директива «Экспорт».

Почему функция возвращает «Неопределено», хотя код отрабатывает?

Почти всегда причина в ветке исполнения без оператора «Возврат». Проверьте все пути: условия Если/Иначе, попытки-исключения, циклы с Прервать. Удобный приём — поставить в конце функции «Возврат Неопределено;» явно и отладчиком проследить, какая ветка сработала.

Как передать в функцию произвольное число параметров?

Строго переменного числа аргументов во встроенном языке нет. Практические обходные пути: передать Структуру или Массив одним параметром, либо объявить несколько параметров со значениями по умолчанию и заполнять только нужные. Структура предпочтительнее — именованные ключи делают вызов читаемым.

Что делать, если при вызове возникает «Метод объекта не обнаружен»?

Эта ошибка означает обращение к методу, которого нет у конкретного объекта: например, вызов функции у значения «Неопределено» или у переменной другого типа. Проверьте тип переменной перед вызовом через ТипЗнч() и убедитесь, что объект инициализирован.

Итог

Что важно запомнить

Вызов функции — это имя, скобки и аргументы в правильном порядке; для общего модуля добавляется имя модуля через точку. Функция доступна извне только с «Экспорт» и при подходящем контексте модуля. Всегда проверяйте наличие «Возврат» во всех ветках, тип результата и не забывайте про передачу параметров по ссылке.