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