Разработка и Конфигурация · 9 мин
Как выполнить функцию в 1С
Как выполнить функцию в 1С: объявление и вызов функции, передача параметров, возврат значения, выполнение через «Выполнить код», отладка и типичные ошибки.
Функция в 1С — это именованный блок кода на встроенном языке, который принимает параметры, выполняет вычисления и возвращает результат через оператор Возврат. Выполнить функцию можно несколькими способами: вызвать её из другого кода в конфигураторе, запустить произвольный код через обработку «Выполнение произвольного кода», протестировать в отладчике или вызвать из внешнего соединения. Выбор способа зависит от того, где находится функция (модуль объекта, общий модуль, модуль формы) и что требуется: разовая проверка или штатная работа.
Главное правило: функция всегда возвращает значение, а процедура — нет. Если вы попытаетесь присвоить результат процедуры переменной, платформа выдаст ошибку компиляции. Поэтому перед вызовом важно понять, что именно вы запускаете, и где этот код доступен: на клиенте, на сервере или в обоих контекстах.
Как объявить функцию в конфигураторе
Откройте конфигуратор, найдите нужный модуль (общий модуль, модуль объекта, модуль формы) и добавьте объявление по шаблону: ключевое слово Функция, имя, список параметров в скобках, директива контекста при необходимости (Экспорт), тело функции, оператор Возврат и завершающее КонецФункции.
Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
Результат = Сумма + Сумма * СтавкаНДС / 100;
Возврат Результат;
КонецФункции
Директива Экспорт делает функцию видимой из других модулей. Без неё функция доступна только внутри того же модуля. Имя функции должно быть уникальным в пределах модуля и не совпадать с зарезервированными словами языка.
Обратите внимание на директивы компиляции в общих модулях: НаСервере, НаКлиенте и другие. Если функция работает с базой данных (запросы, документы), она должна выполняться на сервере, иначе платформа выдаст ошибку недоступности контекста.
Как вызвать функцию из другого кода
Если функция объявлена с Экспорт в общем модуле, вызов выполняется через имя модуля: Результат = МойМодуль.РассчитатьСуммуСНДС(1000, 20);. Если функция находится в том же модуле, достаточно имени: Результат = РассчитатьСуммуСНДС(1000, 20);.
Параметры передаются в порядке объявления. Если у параметра задано значение по умолчанию (Параметр = 0), его можно опустить в конце списка. Пропуск параметра в середине допустим через запятую: МояФункция(Значение1,,Значение3) — тогда параметр примет значение Неопределено или значение по умолчанию.
Результат функции можно присвоить переменной, использовать в условии, передать в другую функцию или вывести пользователю через Сообщить() или ПоказатьПредупреждение(). Если результат не нужен, вызов всё равно допустим как отдельный оператор — но тогда логичнее оформить код процедурой.
- 1Откройте модуль, из которого будет вызов, и определите контекст (клиент или сервер)
- 2Напишите вызов: ИмяМодуля.ИмяФункции(Параметр1, Параметр2)
- 3Присвойте результат переменной или используйте в выражении
- 4Сохраните модуль и обновите конфигурацию базы данных, если менялась структура
- 5Проверьте работу через отладку или тестовый вызов
Как выполнить функцию без изменения конфигурации
Для разовой проверки или служебных операций не обязательно встраивать вызов в конфигурацию. Используйте внешнюю обработку «Выполнение произвольного кода» (входит в стандартные инструменты разработчика) или консоль кода. Откройте обработку в режиме 1С:Предприятие, впишите код вызова и нажмите «Выполнить».
Пример кода для такой обработки: Результат = ОбщегоНазначения.МояФункция(Параметр); Сообщить(Результат);. Код выполняется на сервере или клиенте в зависимости от настроек обработки — учитывайте это, если функция обращается к базе данных.
Отладка: как выполнить функцию по шагам
Отладка — основной способ понять, что происходит внутри функции. Запустите конфигуратор, откройте модуль с функцией и поставьте точку останова клавишей F9 на строке вызова или внутри тела функции. Затем запустите отладку (F5) и воспроизведите действие в клиентском приложении, которое приводит к вызову.
Когда выполнение остановится, используйте «Шагнуть через» (F10), «Шагнуть в» (F11) и «Шагнуть из» (Shift+F11). Значения переменных смотрите в табло (Shift+F9) или окне «Вычислить выражение» (Ctrl+W): там же можно выполнить произвольный вызов функции прямо во время остановки.
Если функция выполняется на сервере, убедитесь, что в параметрах отладки включён режим отладки сервера (Сервис → Параметры → Отладка). Для фоновых заданий и веб-сервисов потребуется подключение к соответствующему предмету отладки через меню «Отладка → Подключение».
Как проверить результат
Функция дошла до оператора «Возврат» и вернула ожидаемое значение
Возвращается Неопределено — «Возврат» не выполнился или ветка логики пропущена
Выполнение останавливается внутри функции
Остановки нет — функция не вызывается или вызывается другая версия кода
Значения соответствуют ожидаемым типам
Передан Неопределено или неверный тип — ошибка в месте вызова
Контексты выполнения: клиент, сервер, внешнее соединение
В тонком клиенте функции общих модулей с флагом «Сервер» выполняются на сервере, с флагом «Клиент (управляемое приложение)» — на клиенте. Вызов серверной функции с клиента возможен, но это сетевой вызов: не передавайте туда большие объёмы данных и не делайте такие вызовы в цикле.
Из внешних систем функцию можно выполнить через COM-соединение (V83.COMConnector), HTTP-сервисы или веб-сервисы, опубликованные в конфигурации. Для HTTP-сервиса логику вызова размещают в обработчике шаблона URL, а саму функцию выносят в общий серверный модуль.
Способы выполнить функцию
Штатный способ для рабочей логики. Требует обновления конфигурации, надёжен и контролируем.
Подходит для разовых проверок и служебных операций. Риск ошибки в рабочей базе — нужна копия.
Пошаговое выполнение и вычисление выражений. Только для анализа, не для продуктивной работы.
Для интеграций извне. Требует публикации и настройки прав доступа.
Типичные ошибки при выполнении функций
Самая частая ошибка — «Процедура или функция с указанным именем не определена». Она означает, что функция не объявлена с Экспорт, имя модуля указано неверно или общий модуль недоступен в текущем контексте (например, серверный модуль вызывается с клиента без флага «Вызов сервера»).
Вторая группа ошибок связана с параметрами: несовпадение количества или типов. Платформа не проверяет типы заранее, поэтому ошибка всплывёт в момент выполнения — защищайтесь проверками ТипЗнч() в начале функции. Третья типичная ситуация — функция возвращает Неопределено, потому что ни одна ветка условий не привела к оператору Возврат.
Частые вопросы
Чем функция отличается от процедуры в 1С?
Функция обязана вернуть значение оператором «Возврат» и может использоваться в выражениях: Сумма = МояФункция();. Процедура значения не возвращает и вызывается только как отдельный оператор. Остальной синтаксис объявления идентичен.
Как выполнить функцию в фоновом задании?
Используйте метод ФоновыеЗадания.Выполнить("ИмяМодуля.ИмяФункции", МассивПараметров). Функция должна быть экспортной и находиться в общем серверном модуле. Результат фонового задания возвращается через механизм длительных операций или сообщения пользователю.
Почему функция возвращает «Неопределено»?
Чаще всего потому, что выполнение не дошло до оператора «Возврат»: условие не сработало, возникла необработанная ветка логики или исключение перехвачено пустым блоком «Попытка...Исключение». Поставьте точку останова в конце функции и проверьте путь выполнения.
Можно ли вызвать функцию из формы другого объекта?
Напрямую функции модуля формы извне вызывать не рекомендуется — форма может быть не открыта. Общую логику выносите в общий модуль или модуль менеджера объекта, а из форм обращайтесь уже к нему.
Как выполнить функцию, написанную на английском синтаксисе?
Встроенный язык 1С поддерживает оба варианта: Function ... Return ... EndFunction работает так же, как русский синтаксис. Вызов и отладка ничем не отличаются — платформа распознаёт оба варианта автоматически.
Как передать параметр по ссылке, чтобы функция его изменила?
Используйте ключевое слово Знач для передачи по значению или опустите его для передачи по ссылке. Без Знач изменения параметра внутри функции отразятся на переменной вызывающего кода. Для примитивных типов в тонком клиенте поведение может отличаться, поэтому явно документируйте такие параметры.
Что важно запомнить
Функция объявляется в модуле с «Экспорт» и завершается «Возврат», вызывается по имени с параметрами с учётом контекста клиент/сервер. Для проверки используйте отладку или обработку выполнения кода, а любые операции с данными сначала тестируйте на копии базы.