Разработка и Конфигурация · 12 мин
Что такое функции в 1С и как их использовать
Разбираем, что такое функции во встроенном языке 1С: синтаксис, параметры, возврат значений, отличие от процедур, примеры кода и типичные ошибки новичков.
Функция в 1С — это именованный блок кода на встроенном языке, который принимает параметры, выполняет вычисления и возвращает результат через оператор «Возврат». Функции позволяют не дублировать одну и ту же логику в десятках мест конфигурации: расчёт скидки, формирование строки наименования, проверка заполнения реквизитов — всё это выносится в отдельные функции и вызывается по имени.
Понимание функций — базовый навык для любого, кто дорабатывает конфигурации 1С: от простых отчётов до серьёзных изменений в типовых решениях. Без функций код быстро превращается в набор скопированных фрагментов, где исправление ошибки в одном месте не исправляет её в остальных.
Материал рассчитан на начинающих разработчиков и продвинутых пользователей, которые хотят понимать, что происходит внутри конфигурации. Разберём синтаксис, отличия от процедур, область видимости, примеры кода и типичные ошибки.
Как устроена функция: синтаксис и минимальный пример
Функция объявляется в модуле по шаблону: ключевое слово «Функция», имя, список параметров в круглых скобках, необязательное слово «Экспорт», тело с операторами и завершающее «КонецФункции». Результат возвращается оператором «Возврат», после которого может стоять любое выражение.
Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
СуммаНДС = Сумма * СтавкаНДС / (100 + СтавкаНДС);
Возврат Сумма + СуммаНДС;
КонецФункции
Вызов такой функции выглядит как обычное выражение: Итого = РассчитатьСуммуСНДС(12000, 20);. Результат можно присвоить переменной, вывести в сообщение или передать дальше — именно этим функция отличается от процедуры.
Имя функции должно начинаться с буквы и не содержать пробелов; принято использовать осмысленные глаголы и существительные: «ПолучитьКурсВалюты», «СформироватьНаименование». Встроенный язык 1С допускает имена и на русском, и на английском, но смешивать стили в одной конфигурации не стоит.
Чем функция отличается от процедуры
Главное отличие — возвращаемое значение. Функция обязана вернуть результат (даже если это «Неопределено»), процедура ничего не возвращает и используется для действий: записи данных, вывода сообщений, изменения реквизитов объекта. Соответственно, процедуру нельзя вставить в выражение, а функцию — можно.
Если тело функции не содержит оператора «Возврат» с значением, при вызове она вернёт «Неопределено». Это частый источник трудноуловимых ошибок: код выполняется без сообщений об ошибках, но результат вычислений пустой.
| Критерий | Функция | Процедура |
|---|---|---|
| Возвращает значение | Да, через «Возврат» | Нет |
| Использование в выражениях | Можно: Х = Ф(1) | Нельзя |
| Типовое назначение | Вычисления, получение данных | Действия, изменение состояния |
| Объявление | Функция ... КонецФункции | Процедура ... КонецПроцедуры |
Практическое правило: если блок кода должен ответить на вопрос «сколько» или «какой» — это функция. Если он должен что-то сделать — процедура. Смешивать обе роли в одной функции (и считать, и записывать в базу) допустимо технически, но усложняет поддержку.
Параметры: значения по умолчанию и передача по ссылке
Параметры перечисляются в скобках через запятую. Для любого параметра можно задать значение по умолчанию: Функция Скидка(Сумма, Процент = 0). Тогда вызов Скидка(1000) корректно отработает, подставив ноль. Параметры со значениями по умолчанию следует размещать в конце списка — иначе вызывающий код станет нечитаемым.
По умолчанию параметры передаются по значению: внутри функции работает копия, и изменения не затрагивают переменную вызывающего кода. Если перед параметром поставить слово «Знач» — поведение явно закрепляется. Без него для объектов (например, таблиц значений, структур) изменения внутри функции могут отразиться на исходных данных, потому что передаётся ссылка на объект.
Функция ДобавитьСтроку(Таблица, Номенклатура, Количество = 1)
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = Количество;
Возврат НоваяСтрока;
КонецФункции
Если параметр не передан при вызове и значения по умолчанию нет, внутри функции он будет равен «Неопределено». Перед использованием таких параметров делайте проверку — это защитит от ошибок вида «попытка сложения с Неопределено».
Где объявлять функции: модули и область видимости
Функции размещаются в модулях разных типов, и от этого зависит, кто может их вызвать. Общие модули — основное место для прикладной логики: функция с «Экспорт» в общем модуле вызывается отовсюду через имя модуля, например РасчетыСервер.СуммаДокумента(Документ).
Модули объектов и форм содержат функции, привязанные к конкретному объекту или экранной форме. Модуль приложения и модуль внешнего соединения используются реже — для глобальных обработчиков и интеграционных сценариев.
- Общий модуль с флагом «Сервер» — вычисления, работа с базой данных, запросы.
- Общий модуль с флагом «Клиент» — работа с интерфейсом, диалогами, файлами на компьютере пользователя.
- Модуль объекта — логика конкретного справочника или документа, доступ к реквизитам через «ЭтотОбъект».
- Модуль формы — обработчики событий элементов формы, директивы &НаКлиенте и &НаСервере.
Директивы компиляции (&НаКлиенте, &НаСервере, &НаСервереБезКонтекста) в модулях форм определяют, где выполнится функция. Ошибка «процедура или функция не обнаружена» при вызове серверной функции с клиента — типичный признак неправильно выбранной директивы или флагов общего модуля.
Куда поместить функцию
Примеры функций для типовых задач
Проверка заполнения строки с возвратом булева результата — один из самых частых шаблонов:
Функция НаименованиеЗаполнено(Наименование)
Возврат Не ПустаяСтрока(СокрЛП(Наименование));
КонецФункции
Функция, возвращающая структуру, удобна, когда нужно передать несколько связанных значений одним результатом:
Функция ПолучитьДанныеКонтрагента(ИНН)
Результат = Новый Структура("Найден, Наименование", Ложь, "");
// поиск в справочнике по ИНН
// если найден — заполняем поля структуры
Возврат Результат;
КонецФункции
Обратите внимание на приём «сначала подготовить результат с безопасными значениями по умолчанию, потом заполнить». Даже если поиск ничего не нашёл, вызывающий код получит предсказуемую структуру, а не «Неопределено» — это исключает ошибки обращения к несуществующим свойствам.
- 1Откройте конфигуратор и выберите подходящий общий модуль или создайте новый
- 2Объявите функцию с осмысленным именем, параметрами и словом «Экспорт»
- 3Добавьте тело с вычислениями и оператором «Возврат» с результатом
- 4Выполните синтаксическую проверку модуля (команда в меню «Конфигурация» или сочетание клавиш)
- 5Вызовите функцию из тестового кода и проверьте результат через «Сообщить» или отладчик
- 6Проверьте граничные случаи: пустые параметры, «Неопределено», нулевые значения
Типичные ошибки при работе с функциями
Самая распространённая ошибка — отсутствие «Возврат» на одной из веток условий. Если функция в одном сценарии возвращает число, а в другом «забывает» вернуть значение, вызывающий код получит «Неопределено» и упадёт с ошибкой уже в другом месте. Проверяйте, что каждый путь выполнения заканчивается возвратом.
Вторая группа ошибок связана с контекстом исполнения: вызов серверной функции из клиентского кода, обращение к реквизитам объекта из общего модуля без передачи ссылки, использование интерактивных диалогов на сервере. Конфигуратор ловит часть таких проблем при проверке модулей, но не все — тестируйте вызовы в реальном режиме работы.
Третья группа — изменение переданных объектов «по ссылке» без намерения. Функция, которая получает таблицу значений и очищает её «для удобства», испортит данные вызывающего кода. Если побочный эффект не нужен, работайте с копией: ТаблицаКопия = Таблица.Скопировать();.
Отладка и проверка результата
Для быстрой проверки функции удобен отладчик конфигуратора: поставьте точку останова на строке с «Возврат», запустите отладку и посмотрите вычисляемое значение в табло. Так видно не только итог, но и значения всех локальных переменных в момент возврата.
Альтернатива без остановки работы — временный вывод через Сообщить(Результат) перед возвратом. Не забудьте убрать такие вызовы после проверки: забытое «Сообщить» в серверной функции, вызываемой в цикле, засоряет окно сообщений пользователям.
Как проверить результат
Проверка конфигуратора завершается без ошибок
Сообщения «процедура или функция не обнаружена», «переменная не определена»
На каждой ветке условий есть «Возврат» с осмысленным значением
В отладчике результат равен «Неопределено» там, где ожидались данные
Пустые параметры и нули обрабатываются без исключений
Ошибки при пустой строке, нуле или «Неопределено» в параметрах
Функция доступна оттуда, откуда вызывается (клиент/сервер)
Работает в толстом клиенте, но падает в тонком или веб-клиенте
Короткие функции из 5–15 строк с одной понятной задачей читаются и тестируются заметно легче, чем «универсальные» на сотни строк с десятком параметров. Если функция требует больше 5–6 параметров, чаще всего удобнее передать одну структуру с именованными полями.
Частые вопросы о функциях в 1С
Чем функция отличается от метода объекта?
Метод — это функция или процедура, привязанная к конкретному объекту (справочнику, документу, таблице значений) и вызываемая через точку: Таблица.Найти(Значение). Свободная функция объявляется в модуле и вызывается по имени. По сути метод — тоже функция, просто с контекстом владельца.
Можно ли вызвать функцию до её объявления в модуле?
Да. Внутри одного модуля порядок объявления функций и процедур не важен: компилятор сначала собирает все объявления, потом выполняет код. Можно вызывать функцию, которая описана ниже по тексту модуля.
Что вернёт функция, если не написать «Возврат»?
Она вернёт значение «Неопределено», и ошибки при этом не возникнет. Это опасно: вызывающий код может принять «Неопределено» за корректный результат. Поэтому следите, чтобы каждый сценарий выполнения завершался явным возвратом значения.
Сколько параметров может быть у функции?
Жёсткого практического ограничения, с которым сталкиваются в реальной работе, нет, но большое число параметров — признак плохого дизайна. Когда параметров больше пяти-шести, их обычно группируют в структуру или передают объект целиком.
Можно ли вызвать функцию общего модуля из внешней обработки?
Да, если функция объявлена с ключевым словом «Экспорт» и общий модуль доступен в нужном контексте (клиент или сервер). Вызов выполняется через имя модуля: ИмяМодуля.ИмяФункции(Параметры).
Что такое англоязычный синтаксис функций и нужно ли его учить?
Встроенный язык 1С имеет два варианта синтаксиса: русский (Функция, Возврат) и английский (Function, Return). Они полностью взаимозаменяемы, конфигуратор понимает оба. Для работы с типовыми конфигурациями достаточно русского варианта; английский встречается в международных решениях и примерах кода.
Что важно запомнить
Функция в 1С объявляется конструкцией «Функция ... КонецФункции», принимает параметры и обязана возвращать результат через «Возврат». Ключевое слово «Экспорт» открывает доступ из других модулей, а место размещения (общий модуль, модуль объекта, формы) определяет контекст выполнения. Проверяйте возврат значений на всех ветках логики и граничные случаи с пустыми параметрами — это убережёт от большинства ошибок.