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

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

Что такое функция в 1С и как её правильно использовать

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

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

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

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

Синтаксис функции: как объявить и вызвать

Объявление функции начинается с ключевого слова Функция, за которым следуют имя, список параметров в круглых скобках и необязательное слово Экспорт. Тело функции завершается оператором КонецФункции. Внутри тела обязательно должен быть хотя бы один оператор Возврат, иначе при вызове возникнет ошибка.

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

СуммаНДС = Сумма * СтавкаНДС / (100 + СтавкаНДС);

Возврат Сумма + СуммаНДС;

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

Вызов функции выглядит как обращение по имени с передачей аргументов. Результат можно присвоить переменной, вывести в сообщение или использовать внутри другого выражения: Итого = РассчитатьСуммуСНДС(10000, 20);. Имя функции должно быть осмысленным и отражать то, что она возвращает: ПолучитьОстаток, ЭтоПолноправныйПользователь, НайтиКонтрагентаПоИНН.

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

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

КритерийФункцияПроцедура
Возврат значенияОбязателен (Возврат Значение)Отсутствует
Использование в выраженияхДа, в том числе в условияхНет, только отдельным оператором
Типичное назначениеВычислить и вернуть результатВыполнить действие, изменить состояние
Пример имениПолучитьКурсВалюты()ЗаписатьДокумент()

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

Что выбрать

Функция

Нужен результат вычисления: сумма, признак, найденная ссылка, строка. Результат используется в выражениях.

Процедура

Нужно выполнить действие без возврата значения: записать объект, вывести сообщение, заполнить табличную часть.

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

Параметры объявляются в скобках после имени функции. Каждому параметру можно задать значение по умолчанию: Функция ПолучитьЦену(Товар, ТипЦен = Неопределено). Параметры со значениями по умолчанию должны идти в конце списка — иначе компилятор выдаст ошибку. При вызове необязательные параметры можно опускать, сохраняя запятые для пропуска промежуточных.

По умолчанию параметры передаются по ссылке: если внутри функции изменить параметр, изменится и переменная в вызывающем коде. Чтобы запретить это, используется ключевое слово Знач: Функция Обработать(Знач Текст) — тогда функция работает с копией. Это важно для структур и массивов: без Знач функция может незаметно «испортить» коллекцию вызывающего кода.

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

Возврат значения и оператор «Возврат»

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

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

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

Как написать свою первую функцию
  1. 1
    Откройте общий модуль или модуль объекта в конфигураторе
  2. 2
    Объявите функцию: имя, параметры в скобках, слово Экспорт при необходимости
  3. 3
    Напишите проверку входных параметров и ранний Возврат для некорректных данных
  4. 4
    Реализуйте основную логику и верните результат через Возврат
  5. 5
    Вызовите функцию из другого кода и проверьте результат в отладчике (F5, точка останова)

Где размещать функции: модули и директивы компиляции

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

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

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

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

Самая частая ошибка новичков — отсутствие Возврат в одной из веток логики. Код компилируется, но при определённых входных данных функция «падает» с ошибкой о невозвращённом значении. Вторая распространённая проблема — использование результата процедуры как значения: Х = МояПроцедура(); не скомпилируется, потому что процедура ничего не возвращает.

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

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

Как проверить работу функции

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

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

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

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

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

Каждый путь исполнения заканчивается оператором Возврат

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

При некоторых входных данных возникает ошибка о невозвращённом значении

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

Повторный вызов с теми же параметрами даёт тот же результат

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

Результат зависит от числа вызовов или меняет данные в базе

Граничные данные
Норма

Пустые и нулевые параметры обрабатываются осмысленно

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

Функция падает на пустой ссылке или нулевом значении

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

Может ли функция в 1С ничего не возвращать?

Нет. Если выполнение достигнет КонецФункции без оператора Возврат, платформа выдаст ошибку. Если результат не нужен по смыслу, либо верните Неопределено, либо оформите код как процедуру.

Что означает слово «Экспорт» после параметров функции?

Оно делает функцию доступной для вызова из других модулей. Без Экспорт функция видна только внутри своего модуля и используется как вспомогательная.

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

Да, это называется рекурсия, и встроенный язык её поддерживает. Обязательно предусмотрите условие выхода, иначе получите переполнение стека. На практике рекурсия нужна редко — например, для обхода древовидных структур.

Чем Неопределено отличается от NULL в возвращаемых значениях?

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

Где лучше размещать функции, используемые в нескольких документах?

В общем модуле с признаком «Сервер» (для работы с данными) и словом Экспорт в объявлении. Так вы избежите дублирования кода и сможете править логику в одном месте.

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

Проверьте директиву компиляции: функция с директивой &НаСервере недоступна из клиентского контекста напрямую. Для вызова серверной логики с клиента используйте функцию &НаСервере или &НаСервереБезКонтекста и вызывайте её из клиентской процедуры.

Итог

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

Функция в 1С — блок кода, который принимает параметры и обязательно возвращает значение через Возврат. От процедуры отличается возможностью использовать результат в выражениях. Контролируйте возврат во всех ветках, передачу параметров через Знач и правильные директивы компиляции.