К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как работают функции в 1С

Как устроены функции во встроенном языке 1С: объявление, параметры, возврат значений, отличие от процедур, экспортные функции и типичные ошибки разработчиков.

Функция — это именованный блок кода во встроенном языке 1С, который принимает параметры, выполняет вычисления и обязательно возвращает результат тому, кто её вызвал. Функции лежат в основе любой доработки конфигурации: расчёт суммы документа, проверка заполнения реквизита, формирование печатной формы — всё это оформляется в виде функций и процедур в модулях.

Понимание того, как объявляются функции, как передаются параметры и где хранится код, позволяет читать типовые конфигурации и безопасно вносить изменения без риска сломать учёт. Ниже разобраны синтаксис, отличия функций от процедур, область видимости, экспорт и типичные ошибки, которые допускают начинающие разработчики.

Как объявить функцию: базовый синтаксис

Функция объявляется в модуле между ключевыми словами Функция и КонецФункции. После имени в скобках перечисляются параметры, а тело содержит произвольный код. Результат возвращается оператором Возврат, после которого указывается вычисленное значение.

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС)

СуммаНДС = Сумма * СтавкаНДС / 100;

Возврат Сумма + СуммаНДС;

КонецФункции

Вызов выглядит как использование имени функции в выражении: Итого = РассчитатьСуммуСНДС(10000, 20);. Возвращённое значение можно присвоить переменной, передать в другую функцию или сразу вывести пользователю.

Имя функции должно начинаться с буквы и не должно совпадать с именами других методов того же модуля. Допускаются русские и английские идентификаторы, однако смешивать языки в одном имени не стоит — это затрудняет поиск по коду.

Параметры: обязательные, по умолчанию и по ссылке

Параметры перечисляются через запятую. Если параметру присвоено значение по умолчанию (СтавкаНДС = 20), его можно не передавать при вызове — тогда используется значение по умолчанию. Обязательные параметры должны идти в списке раньше необязательных.

Ключевое слово Знач перед параметром означает передачу по значению: функция получает копию, и изменения внутри не затрагивают переменную вызывающего кода. Без Знач параметр передаётся по ссылке, и функция может изменить исходную переменную — это удобно для возврата нескольких результатов, но требует аккуратности.

Функция РазобратьСтроку(ИсходнаяСтрока, Знач Разделитель = ",")

// Разделитель передан по значению, изменить его снаружи нельзя

Возврат СтрРазделить(ИсходнаяСтрока, Разделитель);

КонецФункции

Чем функция отличается от процедуры

Процедура выполняет действия, но не возвращает значение: её нельзя использовать в правой части присваивания или внутри выражения. Функция обязана вернуть результат через Возврат. Если оператор Возврат не выполнится ни разу, функция вернёт Неопределено — это штатное поведение, но часто неожиданное для вызывающего кода.

Правило выбора простое: если результат нужен для дальнейших вычислений — объявляйте функцию, если нужно только выполнить действие (записать объект, показать сообщение, заполнить табличную часть) — процедуру. Функции с побочными эффектами, которые одновременно считают и записывают данные, затрудняют сопровождение.

Функция или процедура

Функция

Нужен результат вычисления: сумма, признак, найденная ссылка. Можно использовать в выражениях и условиях.

Процедура

Нужно только действие: запись объекта, вывод сообщения, заполнение данных. Результат не возвращается.

Где размещаются функции: виды модулей

Код функций хранится в модулях, и от типа модуля зависит, где функция доступна и на какой стороне — клиенте или сервере — выполняется. Основные места размещения: общие модули, модуль объекта, модуль формы, модуль менеджера и модуль приложения.

Общие модули предназначены для переиспользуемых функций, которые вызываются из разных объектов. Модуль объекта содержит логику конкретного справочника или документа, например обработчик ОбработкаПроведения. Модуль формы работает с интерфейсом и данными формы; функции, обращающиеся к базе данных, из клиентского контекста формы вызываются через серверные вызовы.

Ключевое слово Экспорт после заголовка функции делает её доступной из других модулей. Без Экспорт функция видна только внутри своего модуля — это правильный способ скрыть вспомогательные вычисления.

Функция ПолучитьКурсВалюты(Валюта, Дата) Экспорт

// доступна из любого модуля конфигурации

...

КонецФункции

Нужна в нескольких объектахОбщий модуль

Проверьте, есть ли подходящий существующий общий модуль, чтобы не плодить дубли

Логика одного документаМодуль объекта

Функция работает с реквизитами и движениями конкретного вида документов

Работа с элементами формыМодуль формы

Обращение к реквизитам формы, видимости элементов, клиентским событиям

Запросы к базеСерверный контекст

В общем модуле с признаком «Сервер» или в серверной процедуре формы

Контекст выполнения: клиент и сервер

В управляемом приложении код делится на клиентский и серверный. Функции, выполняющие запросы к базе данных, проведение документов и обращение к правам, должны работать на сервере. Клиентский контекст предназначен для интерфейсной логики: предупреждений, диалогов, работы с файлами на компьютере пользователя.

Директивы компиляции &НаКлиенте, &НаСервере, &НаСервереБезКонтекста в модуле формы определяют, где выполняется функция. В общих модулях контекст задаётся флажками «Клиент», «Сервер», «Внешнее соединение» в свойствах модуля. Вызов серверной функции с клиента — это обращение к серверу, поэтому частые мелкие вызовы в цикле замедляют работу.

Типичные ошибки
01
Вызов серверной функции в цикле с клиента — каждый проход порождает отдельный серверный вызов, форма «зависает». Решение: собрать данные на клиенте и передать в одну серверную функцию массивом или таблицей.
02
Отсутствие «Возврата» на одной из веток условий — функция неожиданно возвращает Неопределено, и сравнение результата с числом вызывает ошибку.
03
Изменение параметра, переданного по ссылке, без документирования — вызывающий код получает испорченные данные.
04
Экспорт всех функций подряд — модуль превращается в набор глобальных переменных, любую доработку сложно сделать без побочных эффектов.

Как проверить и отладить функцию

Основной инструмент — отладчик конфигуратора. Поставьте точку останова на первой строке функции, запустите отладку (F5) и выполните действие, которое вызывает функцию. Клавиша F11 заходит внутрь вызываемых функций, F10 выполняет строку без захода внутрь.

Табло (Shift+F9) показывает значения параметров и локальных переменных на каждом шаге. Если функция возвращает неожиданный результат, проверьте каждую ветку условий: убедитесь, что Возврат выполняется с тем значением, которое вы ожидаете.

Порядок отладки функции
  1. 1
    Откройте модуль и поставьте точку останова в начале функции
  2. 2
    Запустите отладку и воспроизведите сценарий вызова
  3. 3
    Проверьте входящие параметры в табло — совпадают ли с ожидаемыми
  4. 4
    Пройдите тело функции по шагам (F10/F11), отслеживая изменения переменных
  5. 5
    Проверьте значение в операторе «Возврат» и результат в вызывающем коде

Ограничения и безопасная доработка

При доработке типовой конфигурации не изменяйте функции в общих модулях поставщика напрямую — при обновлении изменения будут потеряны или вызовут конфликт сравнения. Используйте расширения конфигурации: аннотации &ИзменениеИКонтроль, &Вместо, &После позволяют переопределить поведение функции, не трогая исходный код.

Перед любыми изменениями в рабочей базе сделайте выгрузку конфигурации или резервную копию. Ошибка в функции расчёта или проведения может привести к некорректным данным в учёте, которые сложно выявить задним числом.

Частые вопросы

Что вернёт функция, если не написать оператор «Возврат»?

Функция вернёт значение Неопределено. Это не вызовет ошибку само по себе, но дальнейшие операции с результатом (сравнение с числом, арифметика) могут завершиться исключением. Всегда прописывайте Возврат на всех ветках логики.

Можно ли вызвать функцию из другой конфигурации?

Напрямую — нет, функции доступны только внутри своей информационной базы. Между базами обмен организуется через веб-сервисы, HTTP-сервисы, COM-соединение или файлы обмена.

Чем «&НаСервереБезКонтекста» отличается от «&НаСервере» в модуле формы?

Функция «БезКонтекста» не имеет доступа к данным формы (реквизитам, элементам), поэтому вызов выполняется быстрее и не требует сериализации формы. Используйте её для вычислений, которым достаточно переданных параметров.

Можно ли объявить функцию внутри другой функции?

Нет, встроенный язык 1С не поддерживает вложенные объявления функций и процедур. Все методы объявляются на верхнем уровне модуля, вспомогательные выносятся в отдельные неэкспортные функции.

Как вернуть из функции несколько значений?

Оберните результат в структуру: Возврат Новый Структура("Сумма, СуммаНДС", Сумма, СуммаНДС). Альтернатива — параметры, переданные по ссылке, но структура читается и сопровождается проще.

Почему функция недоступна при вызове из другого модуля?

Чаще всего причина в отсутствии ключевого слова «Экспорт» после заголовка функции. Также проверьте, что общий модуль имеет нужные флажки контекста (сервер/клиент) и что вызов идёт с допустимой стороны.

Итог

Что важно запомнить

Функция в 1С объявляется словом «Функция», принимает параметры и возвращает результат через «Возврат»; без «Возврата» результат — Неопределено. Размещайте переиспользуемые функции в общих модулях, экспортируйте только нужное, учитывайте клиент-серверный контекст, а типовой код дорабатывайте через расширения, а не прямым изменением.