В чем разница между процедурой и функцией в 1С и когда их обязательно использовать?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Базовые синтаксические отличия и поведение в выражениях

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

  1. Возврат значения. Функция всегда возвращает результат в точку вызова с помощью ключевого слова Возврат. Если оператор Возврат вызван без значения или выполнение дошло до конца тела функции, она неявно возвращает системное значение Неопределено. Процедура не возвращает значение через оператор Возврат — в процедуре данное ключевое слово используется исключительно для досрочного прерывания работы.
  2. Использование в выражениях. Вызов функции может быть частью составного выражения (в условиях, формулах, при присваивании значения переменной или передаче в качестве параметра другого метода). Вызов процедуры является самостоятельным оператором языка и не может быть встроен в выражение.

Посмотрим на пример использования функции в выражении:


// Вызов функции в составе выражения присваивания
СуммаВзаиморасчетов = РассчитатьИтог(ДокументСсылка) + ТекущаяСкидка;

// Вызов функции внутри логического условия
Если ПроверитьЗаполнениеРеквизитов(Объект) Тогда
    ЗафиксироватьРезультат();
КонецЕсли;

Процедуру невозможно разместить в правой части оператора присваивания или внутри конструкции Если. Попытка написать такой код приведет к синтаксической ошибке на этапе компиляции модуля.

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

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


Процедура РассчитатьСумму(А, Б, Результат)
    Результат = А + Б;
КонецПроцедуры

Процедура ВыполнитьРасчет()
    Перем ИтоговаяСумма;
    ИтоговаяСумма = 0;
    
    // Переменная ИтоговаяСумма изменяется внутри вызванной процедуры
    РассчитатьСумму(10, 25, ИтоговаяСумма);
    Сообщить(ИтоговаяСумма); // Выведет 35
КонецПроцедуры

Однако здесь существует важная деталь: если перед формальным параметром указать ключевое слово Знач, значение будет передано по значению (скопировано), и процедура уже не сможет повлиять на исходную переменную:


Процедура РассчитатьСумму(А, Б, Знач Результат)
    Результат = А + Б; // Локальное изменение, не выходящее за пределы процедуры
КонецПроцедуры

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

ИтоговаяСумма = РассчитатьСумму(10, 25);

Случаи обязательного использования процедур (ограничения платформы)

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

  1. Обработчики событий интерфейса и метаданных. Обработчики событий форм (например, ПриСозданииНаСервере, ПередЗаписью, ПриИзменении) и событий элементов управления должны быть процедурами.
  2. Подписки на события. В свойстве «Обработчик» объекта метаданных ПодпискаНаСобытие допустимо указывать только экспортную процедуру общего модуля. Назначить функцию обработчиком подписки невозможно: конфигуратор зафиксирует ошибку проверки структуры метаданных.
  3. Регламентные и фоновые задания. В свойстве метаданных «Имя метода» регламентного задания разрешено указывать исключительно экспортную процедуру общего модуля.
  4. Механизмы обратного вызова и асинхронные оповещения. Методы, передаваемые в конструктор объекта ОписаниеОповещения в качестве процедур обработки завершения или оповещения, обязаны быть процедурами. Передача функции в данный механизм нарушает контракт платформы и приводит к ошибке времени выполнения.

Случаи обязательного использования функций

Существуют контексты, где платформа допускает вызов только функций:

  1. Выражения в Системе компоновки данных (СКД). В формулах вычисляемых полей, выражениях пользовательских полей, ресурсах и параметрах макетов СКД можно обращаться только к экспортным функциям общих модулей. Процедуру в синтаксис расчетных выражений СКД внедрить невозможно.
  2. Выражения условий динамических списков и интерфейсных свойств. Любые вычисляемые условия, используемые в пользовательских настройках или условном оформлении, требуют возврата логического значения, что реализуется исключительно функциями.

Влияние на клиент-серверное взаимодействие и производительность

При проектировании клиент-серверной архитектуры выбор между процедурой и функцией напрямую влияет на потребление сетевого трафика и скорость работы приложения:

  1. Объем сетевого пакета при возврате значения. Если клиент вызывает серверную функцию, клиентский сеанс ожидает завершения вызова и десериализует полученное возвращаемое значение (даже если функция явно ничего не возвращает и неявно передает Неопределено). Вызов серверной процедуры без параметров возврата избавляет платформу от формирования пакета с возвращаемым объектом.
  2. Двойная сериализация параметров. Если возвращать данные из процедуры на сервере через изменяемый параметр, этот параметр сериализуется дважды: сначала упаковывается для отправки с клиента на сервер, а затем передается обратно с сервера на клиент. Использование функции для возврата того же значения требует передачи данных только в одну сторону — с сервера на клиент, что существенно снижает накладные расходы при передаче тяжелых структур данных.
  3. Асинхронные функции и процедуры. В директивах асинхронного программирования метод с модификатором Асинх ведет себя принципиально по-разному: асинхронная функция всегда возвращает системный объект Обещание (Promise), который можно ожидать ключевым словом Ждать, в то время как асинхронная процедура выполняется в фоновом режиме без возможности ожидания ее результата в вызывающем коде.

Стандарты разработки фирмы «1С»

Официальные стандарты разработки платформы 1С предъявляют строгие требования к чистоте архитектуры кода:

  1. Запрет вызова функции как оператора. Стандарты запрещают вызывать функцию как самостоятельное действие без сохранения или проверки ее результата. Если возвращаемое значение игнорируется, статические анализаторы кода выдают предупреждение.
  2. Исключение скрытых побочных эффектов. Если метод предназначен для вычисления нового значения на основе входных данных, его необходимо оформлять функцией, а не процедурой с изменяемыми параметрами. Это делает поток данных очевидным и предотвращает трудноуловимые ошибки при повторном использовании кода.
← На главную