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

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

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

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

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

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

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

Как устроена функция: синтаксис и минимальный пример

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

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

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

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

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

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

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

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

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

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

КритерийФункцияПроцедура
Возвращает значениеДа, через «Возврат»Нет
Использование в выраженияхМожно: Х = Ф(1)Нельзя
Типовое назначениеВычисления, получение данныхДействия, изменение состояния
ОбъявлениеФункция ... КонецФункцииПроцедура ... КонецПроцедуры

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

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

Параметры перечисляются в скобках через запятую. Для любого параметра можно задать значение по умолчанию: Функция Скидка(Сумма, Процент = 0). Тогда вызов Скидка(1000) корректно отработает, подставив ноль. Параметры со значениями по умолчанию следует размещать в конце списка — иначе вызывающий код станет нечитаемым.

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

Функция ДобавитьСтроку(Таблица, Номенклатура, Количество = 1)

НоваяСтрока = Таблица.Добавить();

НоваяСтрока.Номенклатура = Номенклатура;

НоваяСтрока.Количество = Количество;

Возврат НоваяСтрока;

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

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

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

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

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

  • Общий модуль с флагом «Сервер» — вычисления, работа с базой данных, запросы.
  • Общий модуль с флагом «Клиент» — работа с интерфейсом, диалогами, файлами на компьютере пользователя.
  • Модуль объекта — логика конкретного справочника или документа, доступ к реквизитам через «ЭтотОбъект».
  • Модуль формы — обработчики событий элементов формы, директивы &НаКлиенте и &НаСервере.

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

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

Куда поместить функцию

Логика используется в нескольких объектах конфигурацииСоздайте общий модуль и объявите функцию с «Экспорт»
Функция обращается к базе данных или выполняет запросыРазместите её в серверном общем модуле или с директивой &НаСервере
Функция нужна только внутри одного объекта или формыОбъявите её без «Экспорт» в модуле этого объекта или формы
Функция работает с файлами на компьютере пользователяИспользуйте клиентский контекст — &НаКлиенте или клиентский общий модуль

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

Проверка заполнения строки с возвратом булева результата — один из самых частых шаблонов:

Функция НаименованиеЗаполнено(Наименование)

Возврат Не ПустаяСтрока(СокрЛП(Наименование));

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

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

Функция ПолучитьДанныеКонтрагента(ИНН)

Результат = Новый Структура("Найден, Наименование", Ложь, "");

// поиск в справочнике по ИНН

// если найден — заполняем поля структуры

Возврат Результат;

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

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

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

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

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

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

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

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

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

Для быстрой проверки функции удобен отладчик конфигуратора: поставьте точку останова на строке с «Возврат», запустите отладку и посмотрите вычисляемое значение в табло. Так видно не только итог, но и значения всех локальных переменных в момент возврата.

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

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

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

Синтаксис модуля
Норма

Проверка конфигуратора завершается без ошибок

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

Сообщения «процедура или функция не обнаружена», «переменная не определена»

Возвращаемое значение
Норма

На каждой ветке условий есть «Возврат» с осмысленным значением

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

В отладчике результат равен «Неопределено» там, где ожидались данные

Граничные случаи
Норма

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

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

Ошибки при пустой строке, нуле или «Неопределено» в параметрах

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

Функция доступна оттуда, откуда вызывается (клиент/сервер)

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

Работает в толстом клиенте, но падает в тонком или веб-клиенте

Короткие функции из 5–15 строк с одной понятной задачей читаются и тестируются заметно легче, чем «универсальные» на сотни строк с десятком параметров. Если функция требует больше 5–6 параметров, чаще всего удобнее передать одну структуру с именованными полями.
ПЗ
Практическое замечание

Частые вопросы о функциях в 1С

Чем функция отличается от метода объекта?

Метод — это функция или процедура, привязанная к конкретному объекту (справочнику, документу, таблице значений) и вызываемая через точку: Таблица.Найти(Значение). Свободная функция объявляется в модуле и вызывается по имени. По сути метод — тоже функция, просто с контекстом владельца.

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

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

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

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

Сколько параметров может быть у функции?

Жёсткого практического ограничения, с которым сталкиваются в реальной работе, нет, но большое число параметров — признак плохого дизайна. Когда параметров больше пяти-шести, их обычно группируют в структуру или передают объект целиком.

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

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

Что такое англоязычный синтаксис функций и нужно ли его учить?

Встроенный язык 1С имеет два варианта синтаксиса: русский (Функция, Возврат) и английский (Function, Return). Они полностью взаимозаменяемы, конфигуратор понимает оба. Для работы с типовыми конфигурациями достаточно русского варианта; английский встречается в международных решениях и примерах кода.

Итог

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

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