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