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

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

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

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

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

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

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

Синтаксис объявления функции

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

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

СуммаНДС = СуммаБезНДС * СтавкаНДС / 100;

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

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

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

bsl
Функция ПолучитьЦенуТовара(Товар, Дата = Неопределено) Экспорт
	Если Дата = Неопределено Тогда
		Дата = ТекущаяДатаСеанса();
	КонецЕсли;
	// ... запрос к регистру цен
	Возврат Цена;
КонецФункции

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

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

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

Функция или процедура

Функция

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

Процедура

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

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

Параметры перечисляются через запятую. Если параметру присвоено значение по умолчанию (СтавкаНДС = 20), при вызове его можно опустить — но пропускать можно только хвостовые параметры, середина списка пропускается запятой с пустым местом.

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

Функция ОкруглитьСумму(Сумма, Точность = 2) Экспорт

Возврат Окр(Сумма, Точность);

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

Возврат значения и контроль результата

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

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

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

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

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

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

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

Есть ветка без Возврат — вернётся Неопределено

Тип результата
Норма

Один тип во всех ветках, задокументирован в комментарии

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

В разных ветках разные типы

Вызов из другого модуля
Норма

Функция Экспорт, общий модуль доступен (Сервер/Клиент по контексту)

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

Ошибка «Процедура или функция не обнаружена»

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

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

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

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

Типичные ошибки и ограничения

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

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

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

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

Можно ли задать функцию в 1С без параметров?

Да, скобки оставляют пустыми: Функция ПолучитьТекущийКурс() Экспорт. При вызове скобки всё равно указываются: Курс = ПолучитьТекущийКурс();.

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

Без Экспорт функция видна только внутри своего модуля. С Экспорт её можно вызывать из других модулей через имя модуля, например ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование").

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

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

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

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

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

В общих модулях. Серверную логику с запросами — в модулях с флагом Сервер, клиентские вычисления без обращения к БД — в клиентских. Это устраняет копирование кода и упрощает исправления.

Почему изменение параметра внутри функции меняет переменную снаружи?

По умолчанию параметры передаются по ссылке. Чтобы функция работала с копией, укажите модификатор Знач перед именем параметра: Функция Обработать(Знач Число).

Итог

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

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