← Назад к вопросам

Чем процедура отличается от функции в 1С?

1.0 Junior🔥 201 комментариев
#Стандарты разработки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Процедуры и функции в 1С: различия и особенности

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

Функция

Функция — это подпрограмма, которая возвращает значение:

// Объявление функции
Функция ПолучитьСумму(Число1, Число2) Экспорт
    // Тело функции
    Сумма = Число1 + Число2;
    
    // Обязательный возврат значения
    Возврат Сумма;
КонецФункции

// Использование функции
Результат = ПолучитьСумму(5, 3); // РЕЗультат = 8

// Функция может быть использована в выражениях
Итого = ПолучитьСумму(10, 20) * 2; // Итого = 60

Характеристики функции:

  • Возвращает значение через оператор Возврат
  • Используется в выражениях — может участвовать в вычислениях
  • Может быть правой частью присваиванияX = МояФункция()
  • Функция всегда что-то возвращает — даже если явно не указано, возвращает Неопределено
  • Синтаксис: Функция НазваниеФункции(Параметры) ... Возврат Значение; КонецФункции

Процедура

Процедура — это подпрограмма, которая выполняет действие без возврата значения:

// Объявление процедуры
Процедура ВывестиСообщение(ТекстСообщения)
    // Тело процедуры
    Сообщение(ТекстСообщения);
    
    // НЕ возвращает значение
КонецПроцедуры

// Использование процедуры
ВывестиСообщение("Привет"); // Просто выполняет действие

// НЕПРАВИЛЬНО: пытаться использовать в выражении
// РЕЗультат = ВывестиСообщение("Привет"); // ОШИБКА!

Характеристики процедуры:

  • Выполняет действие (побочный эффект)
  • НЕ возвращает значение — оператор Возврат работает как выход
  • НЕ может быть в правой части присваивания — её нельзя использовать в выражениях
  • Вызывается самостоятельно — стоит отдельным оператором
  • Синтаксис: Процедура НазваниеПроцедуры(Параметры) ... КонецПроцедуры

Сравнительная таблица

АспектФункцияПроцедура
Возвращает значениеДа (обязательно)Нет
Оператор возвратаВозврат ЗначениеВозврат (выход)
Использование в выраженииДа: X = Функция()Нет
ВызовX = МояФункция()МояПроцедура()
Побочный эффектОпциональноОсновное назначение
ПримерыВычисления, поискВывод, запись, действия
РекомендацияЧистые функции (без побочных эффектов)Модификация данных

Практические примеры

Пример 1: Функция для вычисления

// Чистая функция — вычисляет без побочных эффектов
Функция ВычислитьНДС(Сумма, СтавкаНДС = 0.18)
    НДС = Сумма * СтавкаНДС;
    Возврат НДС;
КонецФункции

// Использование
Стоимость = 1000;
НДС = ВычислитьНДС(Стоимость);
Итого = Стоимость + НДС;

Сообщение("НДС: " + НДС + ", Итого: " + Итого);

Пример 2: Процедура для действия

// Процедура — выполняет действие (побочный эффект)
Процедура ЗаписатьДокумент(ДокументСсылка)
    Попытка
        Объект = ДокументСсылка.ПолучитьОбъект();
        Объект.Проведение();
        Объект.Записать(РежимЗаписиДокумента.Проведение);
        
        Сообщение("Документ " + Объект.Номер + " проведён");
    Исключение
        СообщениеОбОшибке("Ошибка при проведении: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

// Использование
ЗаписатьДокумент(МойДокумент); // Просто вызываем

Пример 3: Комбинирование функции и процедуры

// Функция: вычисляет скидку
Функция ПолучитьПроцентСкидки(СуммаЗаказа)
    Если СуммаЗаказа > 10000 Тогда
        Возврат 0.10; // 10% скидка
    ИначеЕсли СуммаЗаказа > 5000 Тогда
        Возврат 0.05; // 5% скидка
    Иначе
        Возврат 0;    // Нет скидки
    КонецЕсли;
КонецФункции

// Процедура: применяет скидку и записывает
Процедура ПрименитьСкидку(ДокументСсылка, СуммаЗаказа)
    ПроцентСкидки = ПолучитьПроцентСкидки(СуммаЗаказа);
    СуммаСкидки = СуммаЗаказа * ПроцентСкидки;
    
    Объект = ДокументСсылка.ПолучитьОбъект();
    Объект.Скидка = СуммаСкидки;
    Объект.Записать();
    
    Сообщение("Скидка " + СуммаСкидки + " применена");
КонецПроцедуры

Возврат из процедуры

Оператор Возврат в процедуре работает как выход (не возвращает значение):

Процедура ПроверитьДанные(Данные)
    // Ранний выход из процедуры
    Если НЕ ЗначениеЗаполнено(Данные) Тогда
        Сообщение("Данные не заполнены");
        Возврат; // Выход из процедуры
    КонецЕсли;
    
    // Дальнейшая обработка
    СообщениеОбОшибке("Данные обработаны");
КонецПроцедуры

Правила экспорта

Оба типа могут быть экспортированы:

// Экспортная функция
Функция ПолучитьНаименованиеОрганизации() Экспорт
    Возврат Константы.НаименованиеОрганизации.Получить();
КонецФункции

// Экспортная процедура
Процедура ЗагрузитьДанныеИзФайла(ПутьКФайлу) Экспорт
    // Загрузка данных
КонецПроцедуры

Лучшие практики

  1. Функция — для вычислений, преобразований, поисков (чистые функции без побочных эффектов)
  2. Процедура — для действий, записи в БД, вывода, модификации состояния
  3. Названия: функции часто именуют как Получить...(), Вычислить...(), а процедуры как Выполнить...(), Записать...(), Удалить...()
  4. Принцип единственной ответственности — каждая функция/процедура должна делать одно
  5. Избегай побочных эффектов в функциях — функция должна быть предсказуемой
  6. Тестируемость — чистые функции легче тестировать, чем процедуры с побочными эффектами

Пример неправильного использования

// ❌ НЕПРАВИЛЬНО: функция с побочным эффектом
Функция ПолучитьИЗаписатьДату()
    Объект = Справочники.Константы.ПолучитьОбъект();
    Объект.ПослучениеДаты = ТекущаяДата();
    Объект.Записать(); // ПОБОЧНЫЙ ЭФФЕКТ!
    
    Возврат Объект.ПолучениеДаты;
КонецФункции

// ✅ ПРАВИЛЬНО: разделить на функцию и процедуру
Функция ПолучитьТекущуюДату()
    Возврат ТекущаяДата();
КонецФункции

Процедура ЗаписатьДатуПолучения()
    Объект = Справочники.Константы.ПолучитьОбъект();
    Объект.ПолучениеДаты = ПолучитьТекущуюДату();
    Объект.Записать();
КонецПроцедуры

Правильное выбор между функцией и процедурой улучшает читаемость, тестируемость и поддерживаемость кода 1С приложений.

Чем процедура отличается от функции в 1С? | PrepBro