К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Разбираем, что такое процедура и функция в 1С, чем они отличаются, как объявлять, передавать параметры и возвращать значения. Примеры кода и типичные ошибки.

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

Главное различие между ними одно: функция обязательно возвращает значение через оператор Возврат, а процедура просто выполняет действия и ничего не возвращает. Из-за этого они по-разному используются в выражениях: результат функции можно присвоить переменной или вставить в условие, а вызов процедуры всегда стоит отдельной строкой.

Разобраться в этом важно ещё до первой доработки типовой конфигурации: неправильный выбор между процедурой и функцией приводит к ошибкам компиляции, потерянным значениям и неочевидным побочным эффектам. Ниже — правила объявления, передача параметров, область видимости, экспортные методы и типичные ошибки с примерами.

Как объявляются процедуры и функции

Объявление начинается с ключевого слова Процедура или Функция, затем идёт имя, в скобках — список параметров, далее тело и завершающее слово КонецПроцедуры или КонецФункции. Имена пишутся на русском или английском языке без пробелов, по договорённости — с заглавной буквы каждого слова, например РассчитатьСуммуДокумента.

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС)

СуммаНДС = Сумма * СтавкаНДС / (100 + СтавкаНДС);

Возврат Сумма + СуммаНДС;

КонецФункции

Процедура СообщитьОПереполнении(ИмяПоля)

Сообщить("Превышено допустимое значение поля: " + ИмяПоля);

КонецПроцедуры

После объявления метод можно вызвать по имени из того же модуля, а если он помечен словом Экспорт — и из других модулей конфигурации. Вызов функции обычно входит в выражение: Итог = РассчитатьСуммуСНДС(10000, 20);. Вызов процедуры — самостоятельный оператор.

Ключевые отличия процедуры от функции

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

  • Возврат значения. Функция обязана содержать оператор Возврат Значение;. Если его нет, платформа вернёт Неопределено, что часто маскирует ошибку. Процедура может использовать Возврат; без значения только для досрочного выхода.
  • Использование в выражениях. Вызов функции можно вставить в присваивание, условие, арифметическое выражение. Вызов процедуры в выражении недопустим — будет ошибка компиляции.
  • Назначение. Функция отвечает на вопрос «сколько/что получилось», процедура — выполняет действие: записывает, проводит, выводит, изменяет.

Что выбрать

Функция

Нужен результат вычисления: сумма, признак, найденный объект, строка. Результат присваивается переменной или проверяется в условии.

Процедура

Нужно выполнить действие без результата: записать данные, показать сообщение, заполнить табличную часть, отправить файл.

Параметры: значение, Знач и значения по умолчанию

Параметры перечисляются в скобках через запятую. По умолчанию параметр передаётся по ссылке: если внутри метода изменить значение параметра-объекта, изменение будет видно вызывающему коду. Чтобы запретить изменение, перед именем параметра ставится слово Знач — тогда внутрь передаётся копия.

Процедура ДобавитьНаценку(Сумма, Знач Процент)

// Сумма изменится и в вызывающем коде

Сумма = Сумма * (1 + Процент / 100);

КонецПроцедуры

Для необязательных параметров задаётся значение по умолчанию: Функция НайтиКлиента(Имя, ТолькоАктивные = Истина). Такие параметры должны стоять в конце списка. Если вызывающий код не передал параметр без значения по умолчанию, внутри он будет равен Неопределено — это частая причина ошибок.

Практическое правило: сложные объекты (таблицы значений, структуры, объекты документов) передавайте по ссылке, если метод должен их заполнить или изменить; простые числа и строки, которые метод не должен портить, — через Знач.

Где размещать методы: модули и область видимости

Процедуры и функции живут в модулях: модуле формы, модуле объекта, модуле менеджера, общих модулях. От места размещения зависит видимость и доступный контекст. В модуле формы доступны реквизиты формы и её элементы; в модуле объекта — данные самого объекта через ЭтотОбъект.

Общие модули — основное место для переиспользуемой логики. Метод из общего модуля вызывается через имя модуля: РаботаСЦенами.ПолучитьЦену(Номенклатура, Дата). Для этого метод обязан быть экспортным, а у модуля должны быть корректно выставлены флаги контекста: «Сервер», «Клиент», «Вызов сервера».

Директивы компиляции &НаКлиенте, &НаСервере, &НаСервереБезКонтекста перед методом определяют, где он исполняется. Ошибка с директивами — классическая причина сообщения «Процедура или функция с указанным именем не определена»: метод существует, но скомпилирован в другом контексте и недоступен.

Возврат значения и досрочный выход

В функции оператор Возврат не только возвращает результат, но и завершает выполнение. Это удобно для раннего выхода при невыполненных условиях — так код остаётся плоским и читаемым:

Функция ПолучитьСкидку(Клиент)

Если Клиент.Пустая() Тогда

Возврат 0;

КонецЕсли;

// основная логика расчёта

Возврат ВычислитьПоКарте(Клиент);

КонецФункции

Хороший тон — чтобы функция возвращала значение одного предсказуемого типа на всех ветках. Если в одном месте возвращается число, а в другом строка с текстом ошибки, вызывающий код рано или поздно сломается на сравнении или арифметике. Для ошибок лучше возвращать Неопределено и проверять его, либо вызывать исключение через ВызватьИсключение.

В процедуре Возврат; без значения просто прерывает выполнение. Использовать процедуру как функцию, «возвращая» результат через параметр по ссылке, допустимо, но менее читаемо — оставляйте такой приём для случаев, когда результатов несколько.

Как добавить свою функцию в общий модуль
  1. 1
    Создайте новый общий модуль с понятным именем и префиксом, установите флаги Сервер и Вызов сервера при необходимости.
  2. 2
    Объявите функцию с параметрами, добавьте слово Экспорт после скобок.
  3. 3
    Напишите тело: проверки входных данных, основную логику, оператор Возврат с результатом.
  4. 4
    Вызовите функцию из нужного места по схеме ИмяМодуля.ИмяФункции(параметры).
  5. 5
    Проверьте модуль на синтаксические ошибки (Ctrl+F7 в конфигураторе) и протестируйте вызов на тестовой базе.

Типичные ошибки при работе с процедурами и функциями

Большинство проблем начинающих разработчиков связано не со сложной логикой, а с базовыми правилами объявления и вызова методов. Ниже — то, что встречается чаще всего.

Типичные ошибки
01
Функция без оператора Возврат на одной из веток — результат Неопределено, ошибка проявляется далеко от места причины.
02
Вызов процедуры в выражении присваивания — ошибка компиляции, так как процедура не возвращает значение.
03
Отсутствие слова Экспорт при вызове из другого модуля — сообщение «метод не обнаружен».
04
Неверная директива (&НаКлиенте вместо &НаСервере) — метод недоступен в нужном контексте или недоступны серверные вызовы.
05
Изменение параметра по ссылке без намерения — побочный эффект ломает вызывающий код, используйте Знач.
06
Один метод на несколько сотен строк — трудно тестировать и сопровождать, дробите на отдельные функции.

Отдельно стоит упомянуть именование. Имя метода должно отражать действие или результат: ЗаполнитьТаблицуТоваров — процедура, ПолучитьОстатокПоСкладу — функция. Если имя функции звучит как действие, а процедуры — как вопрос, код быстро становится запутанным для коллег и для вас самих через полгода.

Контрольные точки

Как проверить результат

Синтаксис модуля
Норма

Проверка конфигурации (Ctrl+F7) завершается без ошибок

Тревожный признак

Сообщения о неопределённых методах или неверных директивах

Возврат функции
Норма

На всех ветках выполнения есть Возврат с значением одного типа

Тревожный признак

Есть ветки без Возврат или с разными типами результата

Вызов из другого модуля
Норма

Метод экспортный, модуль доступен в нужном контексте

Тревожный признак

Ошибка «метод не обнаружен» при выполнении

Частые вопросы

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

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

Можно ли вернуть несколько значений из функции?

Напрямую — нет, оператор Возврат принимает одно значение. Обходные пути: вернуть структуру или массив с несколькими полями, либо передать в параметрах структуру по ссылке и заполнить её внутри метода. Первый вариант читается лучше и предпочтительнее.

Что делает слово Знач перед параметром?

Оно указывает, что параметр передаётся по значению: внутрь метода попадает копия, и изменения параметра не влияют на переменную вызывающего кода. Без Знач параметр передаётся по ссылке, и присваивание ему нового значения внутри метода видно снаружи.

Почему возникает ошибка «Процедура или функция с указанным именем не определена»?

Три частые причины: метод не помечен словом Экспорт, а вызов идёт из другого модуля; неверная директива компиляции — метод скомпилирован не в том контексте (клиент/сервер); опечатка в имени метода или модуля. Проверьте все три пункта по порядку.

Где лучше размещать общую логику — в модуле формы или в общем модуле?

Если логика нужна только одной форме и работает с её элементами — в модуле формы. Если код вызывается из нескольких мест или не зависит от интерфейса — выносите в общий модуль с экспортными методами. Это упрощает тестирование и повторное использование.

Что вернёт функция, если забыть оператор Возврат?

Платформа вернёт значение Неопределено. Ошибки на этапе выполнения не будет, поэтому дефект проявляется косвенно — например, сравнение с Неопределено или падение арифметики в вызывающем коде. Проверяйте, что на каждой ветке функции есть Возврат.

Итог

Что важно запомнить

Функция возвращает значение и используется в выражениях, процедура выполняет действия. Параметры без Знач передаются по ссылке, экспорт делает метод видимым из других модулей, директивы определяют контекст исполнения. Проверяйте наличие Возврат на всех ветках и тестируйте доработки на копии базы.