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


Иллюстрация: Оля Ежак для Skillbox Media
В «1С: Предприятии» практически любая конфигурация основана на процедурах и функциях. Эти конструкции делают код логичным, корректным и удобным для сопровождения. Они выглядят похоже, поэтому не всегда понятно, в каких случаях лучше применять процедуру, а в каких — функцию. В этой статье мы подробно разберём их назначение, различия и правила использования.
Содержание
- Что такое процедуры и функции
- Какие параметры есть у процедур и функций
- Как работать с параметрами
- Как использовать процедуры и функции в конфигурациях «1С: Предприятия»
Что такое процедуры и функции
Процедура в 1С — это блок кода, который выполняет действия, но не возвращает результат. Процедуры используют, когда нужно выполнить действие: записать данные в справочник, изменить объект, вывести сообщение пользователю. Они действуют как команда «сделай что-то».
Функция в 1С — это блок кода, который не только выполняет действия, но и возвращает результат. Обычно функции используют, когда нужно что-то вычислить и получить значение, например сумму или дату.
Например, процедура может оформить документ продажи и внести его в базу, а функция — посчитать итоговую сумму по документу и вернуть её.
В языке 1С процедуры и функции пишутся по-разному, но структура у них похожая.
Процедуры и функции помогают разбивать программу на части, чтобы сделать код понятнее и проще для сопровождения. В отдельные процедуры и функции можно выносить общие алгоритмы, чтобы избежать дублирования кода. Вместо повторения одного и того же действия в разных местах достаточно вызвать процедуру или функцию. Если потребуется изменить алгоритм, можно просто внести изменения в одном месте.
Процедуры и функции делают код проще для чтения. Легче понять, что происходит, особенно если их имена объясняют, что они делают. Это облегчает поддержку программы.

Читайте также:
Объявление процедуры
Процедура объявляется с помощью ключевого слова Процедура, за которым следует имя и круглые скобки с параметрами. В теле процедуры пишутся действия, которые нужно выполнить, а завершение обозначается словом КонецПроцедуры.
Процедура НазваниеПроцедуры(Параметр1, Параметр2)
// Здесь выполняются действия
КонецПроцедуры
Вызов процедуры выглядит так:
НазваниеПроцедуры(10, 20);
Процедура выполняет код внутри, но ничего не возвращает.
Например:
Процедура ПоказатьСообщение()
Сообщить("Привет, мир!");
КонецПроцедуры
ПоказатьСообщение();
Объявление функции
Функция объявляется аналогично, только ключевое слово — Функция. В теле функции выполняются вычисления, а результат возвращается с помощью оператора Возврат. Если оператор отсутствует, функция вернёт Неопределено. Функции можно использовать в выражениях и присваиваниях.
Функция НазваниеФункции(Параметр1, Параметр2)
// Здесь выполняются вычисления
Возврат РезультатВыполнения;
КонецФункции
Функцию вызывают так:
Результат = НазваниеФункции(10, 20);
Например:
Функция Умножить(Число1, Число2)
Возврат Число1 * Число2;
КонецФункции
// Вызов функции:
Результат = Умножить(5, 7);
Использование процедур и функций
Порядок следования процедур и функций в модуле «1С: Предприятие 8» значения не имеет. Из любой процедуры (функции) модуля можно вызывать любую другую процедуру или функцию данного модуля, даже если она расположена после вызывающей.
В объявлении процедуры или функции после скобок можно указать Экспорт, если она должна быть доступна из других модулей. Внутри можно вызывать другие процедуры и функции из текущего или других модулей.
После описания процедуры или функции точка с запятой не нужна. Правда, её можно поставить после последней процедуры или функции в модуле, и это не будет ошибкой. Но, если позже вы добавите в модуль новые процедуры (функции), будет выдаваться сообщение об ошибке.
Параметры процедур и функций
При вызове процедуры или функции можно передавать параметры. Они позволяют использовать разные входные данные: функция будет формировать результат на основе переданных значений, а процедура — выбирать нужный алгоритм действий.
Параметры со значением по умолчанию
В описании можно указать, какое значение будет использоваться по умолчанию. Для этого справа от имени параметра через знак = задаётся значение. Если при вызове оно не указано, система подставит значение по умолчанию.
Процедура СоздатьПользователя(Имя, Пароль = "", Роль = "Пользователь")
Сообщить("Создан пользователь: " + Имя);
Сообщить("Роль: " + Роль);
КонецПроцедуры
// Вызовы
СоздатьПользователя("Иван");
// Пароль = "" , Роль = "Пользователь"
СоздатьПользователя("Мария", "12345");
// Пароль = "12345", Роль = "Пользователь"
СоздатьПользователя("Админ", "qwerty", "Администратор");
// Все параметры заданы
Параметры по умолчанию называются необязательными, а параметры, для которых не указано значение по умолчанию, называются обязательными. Их нужно передавать при вызове, иначе система выдаст ошибку или в параметр попадёт Неопределено, что обычно приводит к неправильной работе кода.
Передача параметров по ссылке
По умолчанию все параметры передаются по ссылке. Это значит, что в процедуру или функцию попадает сама переменная, а не её копия. Если внутри процедуры (функции) изменить параметр, то изменится и исходная переменная, так как мы фактически работаем с одним и тем же участком памяти.
Пример с процедурой:
Процедура УвеличитьНаОдин(Число)
Число = Число + 1;
КонецПроцедуры
МоёЧисло = 10;
УвеличитьНаОдин(МоёЧисло);
Сообщить(МоёЧисло); // Выведет 11
Здесь переменная МоёЧисло изменилась, потому что параметр был передан по ссылке.
Пример с функцией:
Функция Увеличить(Число)
Число = Число + 10;
Возврат Число;
КонецФункции
МоёЧисло = 5;
НовыйРезультат = Увеличить(МоёЧисло);
Сообщить(МоёЧисло); // Выведет: 15
Сообщить(НовыйРезультат); // Выведет: 15
Функция здесь не только возвращает НовыйРезультат через Возврат, но и напрямую изменяет исходную переменную МоёЧисло, так как параметр был передан по ссылке.
Передача параметров по значению
Чтобы передать параметр по значению, нужно явно указать ключевое слово Знач перед именем параметра в объявлении процедуры или функции. В этом случае в процедуру попадёт копия значения, а исходная переменная останется без изменений.
Пример с процедурой:
Процедура Увеличить(Знач Число)
Число = Число + 1;
КонецПроцедуры
МоёЧисло = 5;
Увеличить(МоёЧисло);
Сообщить(МоёЧисло); // Выведет 5
Теперь переменная МоёЧисло осталась прежней, потому что внутри процедуры менялась только копия.
Пример с функцией:
Функция Увеличить(Знач Число)
Число = Число + 10;
Возврат Число;
КонецФункции
МоёЧисло = 5;
НовыйРезультат = Увеличить(МоёЧисло);
Сообщить(МоёЧисло); // Выведет: 5
Сообщить(НовыйРезультат); // Выведет: 15
Специальный параметр Отказ
В некоторых процедурах-обработчиках в параметры передаётся специальная переменная Отказ. Её значение по умолчанию — Ложь. Если внутри обработчика присвоить ей Истина, выполнение процедуры будет прервано.
Пример:
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Сообщить("Нельзя проводить этот документ!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
В этом примере документ не проводится, потому что параметр Отказ был установлен в Истина.
Как работать с параметрами
Имена параметров. Имя должно отражать назначение параметра и быть связано с предметной областью. Это помогает понимать код без дополнительных комментариев.
Использование параметров. Параметры должны располагаться в логической последовательности: сначала указываются основные (общие), а затем уточняющие.
Неправильно:
Процедура РассчитатьСуммуДокумента(ИмяПоляСумма, ДокументОбъект, СуммаВключаетНДС = Истина)
Процедура ИзменитьЦветПоляФормы(Цвет, ИмяПоля, Форма)
Правильно:
Процедура РасчитатьСумму Документа(ДокументОбъект, ИмяПоляСумма, СуммаВключаетНДС = Истина)
Процедура ИзменитьЦветПоляФормы(Форма, ИмяПоля, Цвет)
Необязательные параметры должны располагаться после обязательных.
Пример:
Функция РассчитатьСкидку(СуммаПокупки, ПроцентСкидки = 5)
Возврат СуммаПокупки * (1 - ПроцентСкидки / 100);
КонецФункции
// Вызовы:
РассчитатьСкидку(1000); // ПроцентСкидки = 5 (по умолчанию)
РассчитатьСкидку(1000, 10); // ПроцентСкидки = 10
Количество параметров
Не нужно перегружать функцию большим количеством параметров. Рекомендуется не более семи параметров, из них не более трёх — со значением по умолчанию, иначе вызовы становятся громоздкими и трудночитаемыми.
Вместо длинных списков параметров лучше сгруппировать их в структуры или пересмотреть логику функции.
Плохой пример: слишком много параметров:
// Добавляет новый товар в документ
Процедура ДобавитьТоварВДокумент(ДокументОбъект, КодТовара, Наименование, Количество, Цена, СтавкаНДС = 20, Скидка = 0, Валюта = "RUB", ЕдиницаИзмерения = "шт")
// Громоздкий код
КонецПроцедуры
// Вызов функции выглядит запутанно:
ДобавитьТоварВДокумент(Документ, "A123", "Монитор", 2, 15000, 20, 5, "USD", "шт");
Здесь девять параметров, причём четыре из них необязательные. При вызове легко запутаться.
Хороший пример: параметры сгруппированы в структуру
// Добавляет новый товар в документ
Процедура ДобавитьТоварВДокумент(ДокументОбъект, ПараметрыТовара)
// Работаем с переданной структурой
КонецПроцедуры
// Вызов:
Параметры = Новый Структура;
Параметры.Вставить("КодТовара", "A123");
Параметры.Вставить("Наименование", "Монитор");
Параметры.Вставить("Количество", 2);
Параметры.Вставить("Цена", 15000);
Параметры.Вставить("СтавкаНДС", 20);
Параметры.Вставить("Скидка", 5);
Параметры.Вставить("Валюта", "USD");
Параметры.Вставить("ЕдиницаИзмерения", "шт");
ДобавитьТоварВДокумент(Документ, Параметры);
В этом примере код читается лучше: видно, какой параметр чему соответствует, и порядок свойств не имеет значения. Если добавить новые параметры, код вызова почти не меняется.
Как использовать процедуры и функции в конфигурациях «1С: Предприятия»
Процедуры и функции — это основные строительные блоки логики приложения 1С. Они структурируют код, сокращают дублирование и управляют бизнес-процессами.
Процедуры используются, когда нужно выполнить обработку данных (проведение документа, расчёт итогов), изменить интерфейс (скрыть или показать элементы формы, вывести сообщение пользователю), управлять последовательностью шагов бизнес-логики.
Например:
Процедура ПровестиДокумент()
ПроверитьДанные();
ЗаписатьПроводки();
Сообщить("Документ проведён успешно!");
КонецПроцедуры
Функции используются, когда нужно вычислить и вернуть результат (сумму, количество, дату, строку) или оформить часть логики в отдельный модуль для повторного использования.
Функция РассчитатьСуммуСоСкидкой(Сумма, Скидка)
Возврат Сумма * (100 - Скидка) / 100;
КонецФункции
Где применяются
В модулях объектов (Документ, Справочник, Регистр):
- проведение документов;
- проверка данных при записи;
- расчёт регламентных показателей.
В модулях форм:
- обработка событий интерфейса (нажатие кнопки, изменение реквизита);
- вызов серверных процедур для работы с базой;
- заполнение табличных частей и управляемых элементов.
В общих модулях:
- хранение универсальных функций, доступных разным объектам (например, функция округления сумм, работа с датами).
Как посмотреть
Чтобы просмотреть список процедур и функций текущего модуля, нужно нажать на кнопку с изображением лупы и подписью Proc или использовать сочетание клавиш Ctrl + Alt + P. Откроется окно навигации, в котором можно выбрать нужную процедуру или функцию и перейти к её коду.

По умолчанию элементы отображаются так, как они расположены в модуле. Список можно отсортировать по алфавиту, установив флажок Сортировка.
Кроме процедур и функций, в списке для каждого модуля отображаются стандартные обработчики, например ПриОткрытии (), ПриЗакрытии (), ПриЗаписиНаСервере (), набор которых различается для разных элементов. Если дважды щёлкнуть по выбранному обработчику, в модуле автоматически создастся заготовка соответствующей процедуры — обработчика события.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!