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