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

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

Процедура в 1С: что это и как с ней работать

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

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

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

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

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

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

Из-за этого различается и синтаксис вызова. Функцию можно использовать в выражении: Сумма = РассчитатьСумму(ТаблицаТоваров);. Процедуру вызывают как отдельный оператор: ЗаполнитьТабличнуюЧасть(Документ);. Если попытаться присвоить результат процедуры переменной, платформа выдаст ошибку.

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

Процедура или функция

Процедура

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

Функция

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

Как объявить и вызвать процедуру

Объявление начинается с ключевого слова «Процедура», затем идут имя, круглые скобки с параметрами (могут быть пустыми), тело с операторами и завершающее «КонецПроцедуры». Имя должно отражать действие: «ПроверитьЗаполнениеРеквизитов», «ОтправитьУведомлениеМенеджеру». Имена вида «Проц1» или «Обработка» затрудняют чтение кода.

Процедура ВывестиСообщениеПользователю(ТекстСообщения)

Сообщить(ТекстСообщения);

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

Вызов выполняется по имени с передачей фактических параметров в том же порядке, в каком они объявлены: ВывестиСообщениеПользователю("Документ записан");. Если процедура находится в том же модуле, достаточно имени. Если в общем модуле — указывают имя модуля через точку: РаботаСДокументами.ПровестиДокумент(Ссылка);.

Директивы компиляции перед объявлением определяют, где будет доступна процедура: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Ключевое слово «Экспорт» после скобок делает процедуру видимой из других модулей. Без «Экспорт» процедура доступна только внутри своего модуля — это правильный способ скрыть вспомогательную логику.

bsl
&НаСервере
Процедура ЗаписатьИсториюИзменения(Документ, Комментарий) Экспорт
	Запись = РегистрыСведений.ИсторияИзменений.СоздатьМенеджерЗаписи();
	Запись.Документ = Документ;
	Запись.Комментарий = Комментарий;
	Запись.Записать();
КонецПроцедуры

Параметры процедуры: передача по значению и по ссылке

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

Ключевое слово «Знач» перед параметром включает передачу по значению: процедура получает копию, и изменения внутри не влияют на исходную переменную. Используйте «Знач», когда параметр нужен только для чтения и вычислений внутри процедуры.

Параметру можно задать значение по умолчанию: Процедура ОтправитьОтчет(Получатель, Формат = "PDF"). Тогда при вызове этот параметр можно опустить. Параметры со значениями по умолчанию должны стоять в конце списка, иначе платформа выдаст ошибку компиляции модуля.

Предопределённые процедуры — обработчики событий

Часть процедур в конфигурации вы не вызываете сами — их запускает платформа при наступлении событий. У формы это «ПриСозданииНаСервере», «ПриОткрытии», «ПередЗакрытием»; у документа — «ПередЗаписью», «ПриПроведении», «ОбработкаЗаполнения». Такие процедуры называются обработчиками событий, и их имена строго фиксированы: переименуете обработчик — платформа перестанет его вызывать.

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

Внутри обработчиков соблюдайте контекст. Клиентский обработчик «ПриОткрытии» не может напрямую обратиться к базе данных — для этого вызывают серверную процедуру. Попытка выполнить запрос на клиенте приведёт к ошибке выполнения.

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

Процедура живёт в модуле, и выбор модуля определяет её доступность. Процедура в модуле формы видна только этой форме. Процедура в общем модуле с флагом «Сервер» доступна всей конфигурации на сервере. Процедура в модуле объекта (документа, справочника) работает с данными конкретного объекта.

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

Внутри модуля процедуры группируют по областям: #Область ПрограммныйИнтерфейс для экспортных, #Область СлужебныеПроцедурыИФункции для внутренних. Это не влияет на выполнение, но существенно упрощает навигацию в больших модулях и соответствует стандартам разработки.

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

Как проверить работу процедуры и типичные ошибки

Основной инструмент проверки — отладчик конфигуратора. Поставьте точку останова на строке вызова или внутри процедуры, запустите предприятие в режиме отладки и выполните действие, которое приводит к вызову. По шагам (F11 — с заходом в процедуру, F10 — поверх) проследите, какие значения принимают параметры и переменные.

Если процедура не выполняется, проверьте по порядку: правильно ли указано имя при вызове, есть ли «Экспорт» у процедуры в другом модуле, совпадает ли число и порядок параметров, корректна ли директива компиляции (серверную процедуру нельзя вызвать из клиентского контекста без специальных мер). Для обработчиков событий дополнительно убедитесь, что процедура действительно привязана к событию в палитре свойств.

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

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

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

Компиляция модуля (Ctrl+F7)
Норма

Ошибок нет, модуль сохраняется

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

Сообщения о синтаксических ошибках или несоответствии параметров

Вызов в отладчике
Норма

Точка останова внутри процедуры срабатывает, параметры имеют ожидаемые значения

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

Отладчик не заходит в процедуру — проверяйте имя, Экспорт и привязку обработчика

Результат действий
Норма

Данные записаны, сообщения выведены, форма открылась

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

Действия не выполняются или выполняются дважды — проверьте, не вызывается ли процедура из нескольких мест

Частые вопросы о процедурах в 1С

Можно ли вызвать процедуру одного общего модуля из другого?

Да, если процедура объявлена с ключевым словом «Экспорт» и оба модуля доступны в одном контексте (например, оба серверные). Вызов выглядит так: ИмяМодуля.ИмяПроцедуры(Параметры). Учитывайте флаги модулей: клиентский модуль не вызовет процедуру серверного модуля напрямую.

Чем отличается «Процедура» от «Процедура Экспорт»?

Без «Экспорт» процедура видна только внутри своего модуля — это внутренняя, служебная процедура. С «Экспорт» она становится частью программного интерфейса модуля и доступна для вызова из других модулей конфигурации.

Почему моя процедура-обработчик не выполняется?

Чаще всего причина в опечатке в имени события или в том, что процедура не привязана к событию в палитре свойств. Создайте обработчик заново через палитру свойств объекта — конфигуратор сформирует корректное имя и директиву автоматически.

Как вернуть значение из процедуры?

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

Что означают директивы &НаКлиенте и &НаСервере?

Они определяют, где компилируется и выполняется процедура. &НаКлиенте — на компьютере пользователя, доступен интерфейс, но нет прямого доступа к базе. &НаСервере — на сервере, доступны запросы и данные, но нельзя открыть форму или показать диалог.

Сколько параметров может быть у процедуры?

Жёсткого практического ограничения вы не упрётесь, но большое число параметров — признак плохого проектирования. Если параметров больше трёх-четырёх, подумайте о передаче структуры с именованными полями: такой вызов легче читать и расширять.

Итог

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

Процедура в 1С — именованный блок кода без возвращаемого значения. Отличие от функции — отсутствие «Возврата». Размещайте логику в подходящих модулях, скрывайте внутренние процедуры без «Экспорт», обработчики событий создавайте через палитру свойств, а работу проверяйте отладчиком.