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

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

Как вызвать функцию в 1С: синтаксис, примеры и типичные ошибки

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

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

Вызвать можно как функции, объявленные в текущем модуле, так и экспортные функции общих модулей, модулей менеджеров объектов и встроенные функции платформы. Синтаксис везде одинаковый: имя, круглые скобки, параметры через запятую. Различия кроются в области видимости, директивах компиляции (&НаКлиенте, &НаСервере) и в том, разрешён ли вызов сервера с клиента.

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

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

// Объявление функции в модуле

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт

Возврат Сумма + Сумма * СтавкаНДС / 100;

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

// Вызов функции

ИтоговаяСумма = РассчитатьСуммуСНДС(10000, 20);

Сообщить("Итого: " + ИтоговаяСумма);

Результат функции можно использовать напрямую в условиях и выражениях, не сохраняя в промежуточную переменную: Если РассчитатьСуммуСНДС(Сумма, 20) > Лимит Тогда ... КонецЕсли;. Это допустимо, но при отладке удобнее присваивать результат переменной — тогда его видно в табло.

Если вызвать функцию как оператор, не используя возвращаемое значение (РассчитатьСуммуСНДС(10000, 20); отдельной строкой), код выполнится, но результат будет потерян. Строгая типовая проверка модулей в конфигураторе помечает такие вызовы как подозрительные, и это частый признак логической ошибки.

Вызов функции из общего модуля

Общие модули — стандартное место хранения переиспользуемых функций. Чтобы функция была доступна извне, в её объявлении после списка параметров должно стоять ключевое слово Экспорт. Вызов выполняется через точку: ИмяОбщегоМодуля.ИмяФункции(Параметры).

// В общем модуле РаботаСоСтроками

Функция УбратьЛишниеПробелы(ИсходнаяСтрока) Экспорт

Возврат СокрЛП(ИсходнаяСтрока);

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

// В любом другом модуле конфигурации

ЧистаяСтрока = РаботаСоСтроками.УбратьЛишниеПробелы(Наименование);

При обращении к общему модулю проверьте его свойства. Если у модуля снят флаг «Клиент (управляемое приложение)», его функции недоступны в клиентском контексте формы. Если установлен флаг «Вызов сервера», обращение к серверному модулю с клиента разрешено; без него вызов &НаКлиенте → серверный модуль завершится ошибкой компиляции.

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

Передача параметров: по значению и по ссылке

По умолчанию параметры передаются по ссылке: если внутри функции изменить параметр, изменится и переменная в вызывающем коде. Ключевое слово Знач в объявлении параметра отключает это поведение — функция получает копию значения.

Функция ДобавитьПрефикс(Номер, Знач Префикс) Экспорт

Префикс = СокрЛП(Префикс); // исходная переменная не изменится

Возврат Префикс + Номер;

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

При вызове можно пропускать необязательные параметры, оставляя запятые: Результат = МояФункция(Первый, , Третий);. Пропущенный параметр получит значение по умолчанию, указанное в объявлении функции, либо Неопределено. Порядок параметров при вызове строго позиционный — именованная передача аргументов во встроенном языке не поддерживается.

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

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

Вызов функции в контексте формы: клиент и сервер

В модулях форм директивы компиляции определяют, где выполняется код. Функция с директивой &НаКлиенте может вызывать только клиентские функции и экспортные функции общих модулей с доступным клиенту контекстом. Функция &НаСервере имеет доступ к данным базы, но не может вызывать клиентские функции.

&НаКлиенте

Процедура КнопкаРассчитать(Команда)

Итог = РассчитатьНаСервере(Объект.Сумма);

ПоказатьПредупреждение(, "Итог: " + Итог);

КонецПроцедуры

&НаСервере

Функция РассчитатьНаСервере(Сумма)

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

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

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

Функции, объявленные с директивой &НаСервереБезКонтекста, не имеют доступа к данным формы, зато вызываются быстрее, поскольку не требуют передачи состояния формы на сервер. Для расчётов, которым достаточно переданных параметров, предпочтителен именно этот вариант.

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

&НаСервереБезКонтекста

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

&НаСервере

Нужен, когда функция читает или меняет реквизиты формы. Минус — более тяжёлый серверный вызов с передачей контекста.

&НаКлиенте

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

Общий модуль

Для переиспользуемой логики, вызываемой из разных объектов. Требует правильной настройки флагов контекста.

Встроенные функции платформы и функции БСП

Значительная часть задач решается встроенными функциями платформы: СокрЛП, Формат, ТекущаяДата, СтрНайти, ТипЗнч и другими. Они вызываются напрямую, без указания модуля, и доступны в любом контексте, если иное не указано в синтакс-помощнике.

В конфигурациях на базе Библиотеки стандартных подсистем полезные функции сгруппированы в общих модулях: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование"), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(...). Перед тем как писать свою функцию, проверьте поиском по конфигурации — вероятно, готовая уже существует.

Точное описание любой функции доступно в синтакс-помощнике конфигуратора (меню «Справка» или Ctrl+F1 на имени функции в коде). Там указаны состав параметров, значения по умолчанию, доступность в тонком клиенте, веб-клиенте и на сервере — это первый источник при сомнениях.

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

Типичные ошибки и их диагностика

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

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

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

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

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

Основной инструмент — отладчик конфигуратора. Поставьте точку останова на строке вызова, запустите отладку (F5) и по F11 войдите внутрь функции. На строке Возврат вычислите возвращаемое выражение через «Вычислить выражение» (Shift+F9), чтобы увидеть значение до фактического выхода.

Для быстрой проверки без отладки используйте Сообщить() сразу после вызова — на клиенте сообщение появится в панели сообщений, на сервере — там же после завершения вызова. Во внешних обработках удобно выводить результат на форму.

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

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

Как проверить результат вызова функции

Значение в точке останова на строке Возврат
Норма

Возвращается ожидаемое значение нужного типа

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

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

Количество фактических параметров
Норма

Совпадает с объявлением с учётом значений по умолчанию

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

Ошибка компиляции о числе параметров

Контекст вызова
Норма

Флаги модуля соответствуют месту вызова, компиляция проходит

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

Ошибка «не определена» или запрет вызова сервера

Побочные эффекты
Норма

Входные переменные после вызова не изменились (если не планировалось)

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

Параметр изменён — добавьте Знач в объявление параметра

Часто задаваемые вопросы

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

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

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

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

Можно ли вызвать функцию без скобок, если параметров нет?

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

Как вызвать функцию общего модуля с клиента, если модуль серверный?

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

Что произойдёт, если в функции не выполнится ни один оператор Возврат?

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

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

Таблица значений передаётся как обычный параметр. Табличную часть объекта на сервере можно перебрать напрямую через ссылку; для передачи с клиента на сервер используйте выгрузку в массив структур или реквизит формы типа ДанныеФормыКоллекция, передавая его в серверную функцию с контекстом формы.

Итог

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

Функция вызывается по имени с обязательными скобками, из общего модуля — через точку с именем модуля и словом Экспорт в объявлении. Контролируйте контекст компиляции, число и порядок параметров и всегда проверяйте возвращаемое значение в отладчике.