← Назад к вопросам
Чем процедура отличается от функции в 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С приложений.