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