В среде разработки 1С:Предприятие процедуры и функции представляют собой подпрограммы (методы), предназначенные для группировки исполняемого кода. На начальном этапе изучения платформы часто возникает вопрос: зачем разделять подпрограммы на два типа, если функция технически способна выполнить любое действие, которое делает процедура? Разберем подробно, в чем заключаются их принципиальные различия, как устроена передача данных через параметры и в каких сценариях платформа жестко требует использовать строго определенный тип метода.
Фундаментальное концептуальное различие между процедурой и функцией заключается в возврате значения и способе вызова метода:
Возврат. Если оператор Возврат вызван без значения или выполнение дошло до конца тела функции, она неявно возвращает системное значение Неопределено. Процедура не возвращает значение через оператор Возврат — в процедуре данное ключевое слово используется исключительно для досрочного прерывания работы.Посмотрим на пример использования функции в выражении:
// Вызов функции в составе выражения присваивания
СуммаВзаиморасчетов = РассчитатьИтог(ДокументСсылка) + ТекущаяСкидка;
// Вызов функции внутри логического условия
Если ПроверитьЗаполнениеРеквизитов(Объект) Тогда
ЗафиксироватьРезультат();
КонецЕсли;
Процедуру невозможно разместить в правой части оператора присваивания или внутри конструкции Если. Попытка написать такой код приведет к синтаксической ошибке на этапе компиляции модуля.
В языке 1С параметры в процедуры и функции по умолчанию передаются по ссылке. Это означает, что процедура также способна изменять переданные в нее переменные, возвращая результат вызывающему коду через список аргументов. Проанализируем, как это работает на практике:
Процедура РассчитатьСумму(А, Б, Результат)
Результат = А + Б;
КонецПроцедуры
Процедура ВыполнитьРасчет()
Перем ИтоговаяСумма;
ИтоговаяСумма = 0;
// Переменная ИтоговаяСумма изменяется внутри вызванной процедуры
РассчитатьСумму(10, 25, ИтоговаяСумма);
Сообщить(ИтоговаяСумма); // Выведет 35
КонецПроцедуры
Однако здесь существует важная деталь: если перед формальным параметром указать ключевое слово Знач, значение будет передано по значению (скопировано), и процедура уже не сможет повлиять на исходную переменную:
Процедура РассчитатьСумму(А, Б, Знач Результат)
Результат = А + Б; // Локальное изменение, не выходящее за пределы процедуры
КонецПроцедуры
Кроме того, при использовании функции нет необходимости заранее объявлять или инициализировать переменную в вызывающем модуле. Результат функции можно сразу присвоить новой переменной:
ИтоговаяСумма = РассчитатьСумму(10, 25);
Выясним ситуации, когда разработчик лишен выбора и платформа 1С строго обязывает объявлять метод как процедуру:
ПриСозданииНаСервере, ПередЗаписью, ПриИзменении) и событий элементов управления должны быть процедурами.ПодпискаНаСобытие допустимо указывать только экспортную процедуру общего модуля. Назначить функцию обработчиком подписки невозможно: конфигуратор зафиксирует ошибку проверки структуры метаданных.ОписаниеОповещения в качестве процедур обработки завершения или оповещения, обязаны быть процедурами. Передача функции в данный механизм нарушает контракт платформы и приводит к ошибке времени выполнения.Существуют контексты, где платформа допускает вызов только функций:
При проектировании клиент-серверной архитектуры выбор между процедурой и функцией напрямую влияет на потребление сетевого трафика и скорость работы приложения:
Неопределено). Вызов серверной процедуры без параметров возврата избавляет платформу от формирования пакета с возвращаемым объектом.Асинх ведет себя принципиально по-разному: асинхронная функция всегда возвращает системный объект Обещание (Promise), который можно ожидать ключевым словом Ждать, в то время как асинхронная процедура выполняется в фоновом режиме без возможности ожидания ее результата в вызывающем коде.Официальные стандарты разработки платформы 1С предъявляют строгие требования к чистоте архитектуры кода: