Процедуры и функции в 1С: что это, чем они различаются и как работают
2026-02-21 17:37 Diff

#статьи

  • 17 окт 2025
  • 0

Процедурно функционируем в 1С.

Иллюстрация: Оля Ежак для Skillbox Media

Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.

В «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С. Они структурируют код, сокращают дублирование и управляют бизнес-процессами.

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

Например:

Процедура ПровестиДокумент() ПроверитьДанные(); ЗаписатьПроводки(); Сообщить("Документ проведён успешно!"); КонецПроцедуры

Функции используются, когда нужно вычислить и вернуть результат (сумму, количество, дату, строку) или оформить часть логики в отдельный модуль для повторного использования.

Функция РассчитатьСуммуСоСкидкой(Сумма, Скидка) Возврат Сумма * (100 - Скидка) / 100; КонецФункции

В модулях объектов (Документ, Справочник, Регистр):

  • проведение документов;
  • проверка данных при записи;
  • расчёт регламентных показателей.

В модулях форм:

  • обработка событий интерфейса (нажатие кнопки, изменение реквизита);
  • вызов серверных процедур для работы с базой;
  • заполнение табличных частей и управляемых элементов.

В общих модулях:

  • хранение универсальных функций, доступных разным объектам (например, функция округления сумм, работа с датами).

Чтобы просмотреть список процедур и функций текущего модуля, нужно нажать на кнопку с изображением лупы и подписью Proc или использовать сочетание клавиш Ctrl + Alt + P. Откроется окно навигации, в котором можно выбрать нужную процедуру или функцию и перейти к её коду.

Скриншот: «1С: Предприятие» / Skillbox Media

По умолчанию элементы отображаются так, как они расположены в модуле. Список можно отсортировать по алфавиту, установив флажок Сортировка.

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



Бесплатный курс по Python ➞
Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу