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

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

Как вызвать функцию в 1С Предприятие

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

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

Функция в 1С всегда возвращает значение через оператор Возврат, в отличие от процедуры, которая только выполняет действия. Вызов выглядит как Результат = ИмяФункции(Параметр1, Параметр2);. Если функция находится в другом модуле, к имени добавляется имя общего модуля: Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Номер");.

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

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

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

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

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

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

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

// Вызов в том же модуле:

Итог = СуммаСНДС(1000, 20);

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

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

Общие модули — основное место хранения переиспользуемых функций. Чтобы функция была доступна извне, она должна быть экспортной, а общий модуль должен иметь подходящие флажки контекста в палитре свойств: «Сервер», «Клиент (управляемое приложение)», «Клиент (обычное приложение)», «Внешнее соединение».

Вызов выполняется через имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Организация");. Имя общего модуля пишется без кавычек — это не строка, а идентификатор объекта конфигурации. Если модуль называется РаботаСДокументами, а функция — ПолучитьНомер, вызов будет Номер = РаботаСДокументами.ПолучитьНомер(ДокументСсылка);.

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

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

Серверный и клиентский контекст: где функция доступна

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

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

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

Маршрут решения

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

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

Параметры функции: передача и значения по умолчанию

Параметры передаются в том порядке, в котором объявлены в заголовке функции. Для необязательных параметров задаются значения по умолчанию: Функция СформироватьОтчет(Период, Вариант = Неопределено) Экспорт. При вызове такие параметры можно опускать, но только если они идут в конце списка или пропускаются запятыми: СформироватьОтчет(Период, , Истина); — пустое место между запятыми означает «значение по умолчанию».

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

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

Проверка результата и обработка возвращаемого значения

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

В месте вызова проверяйте результат перед использованием, особенно если функция может вернуть Неопределено или пустое значение как признак «не найдено». Например, при поиске элемента справочника: Найденный = НайтиКонтрагентаПоИНН(ИНН); Если Найденный = Неопределено Тогда ... КонецЕсли;.

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

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

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

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

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

Неопределено там, где ожидалось значение

Поведение на некорректных входных данных
Норма

Функция возвращает контролируемое пустое значение или понятное исключение

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

Падение с системной ошибкой в глубине вызова

Все ветки логики
Норма

Каждая ветка заканчивается оператором Возврат

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

Есть путь выполнения без возврата значения

Вызов функций объектов: формы, документы, запросы

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

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

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

Отладка вызова функции

Чтобы увидеть, что реально происходит при вызове, поставьте точку останова на строке вызова и включите отладку в конфигураторе. Клавиша F11 («Шагнуть в») проваливается внутрь функции, F10 («Шагнуть через») выполняет её целиком. В табло (Ctrl+Alt+W) можно вычислить любое выражение, включая сам вызов функции с произвольными параметрами.

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

Итог

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

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

Частые вопросы

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

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

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

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

Можно ли вызвать функцию формы из другой формы?

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

Как вызвать функцию асинхронно, чтобы не блокировать интерфейс?

Для длительных операций используйте механизм фоновых заданий: функция помещается в общий модуль и запускается через ФоновыеЗадания.Выполнить(). Результат забирается на клиенте по завершении. Это стандартный способ выполнения тяжёлых операций без зависания формы.

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

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

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

Штатного механизма переменного числа аргументов во встроенном языке нет. Используйте структуру или массив как единый параметр-контейнер: функция принимает Структуру с именованными полями и извлекает нужные значения через Свойство(). Это делает вызов читаемым и расширяемым.