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