Разработка и Конфигурация · 10 мин
Процедура в 1С: что это и как с ней работать
Что такое процедура в 1С, чем отличается от функции, как объявить и вызвать процедуру, передать параметры и избежать типичных ошибок разработчика.
Процедура в 1С — это именованный блок кода на встроенном языке, который выполняет определённые действия и не возвращает значения. Процедуры позволяют разбить программу на логические части, избежать дублирования кода и упростить его сопровождение. Когда одна и та же последовательность действий нужна в нескольких местах конфигурации, её оформляют как процедуру и вызывают по имени.
Каждый модуль в 1С — общий модуль, модуль формы, модуль объекта — состоит из процедур и функций. Понимание того, как устроены процедуры, как передавать в них параметры и где их правильно размещать, — базовый навык для любого, кто дорабатывает конфигурацию или разбирается в чужом коде.
Важно различать процедуры, которые вы пишете сами, и предопределённые процедуры — обработчики событий, которые платформа вызывает автоматически: например, «ПриОткрытии» формы или «ПередЗаписью» документа. Оба вида устроены одинаково, но запускаются по-разному: первые — явным вызовом из кода, вторые — платформой при наступлении события.
Чем процедура отличается от функции
Главное различие — возвращаемое значение. Функция завершается оператором «Возврат» и отдаёт результат тому, кто её вызвал: число, строку, ссылку на объект. Процедура ничего не возвращает — она просто выполняет действия: записывает данные, выводит сообщение, заполняет табличную часть, открывает форму.
Из-за этого различается и синтаксис вызова. Функцию можно использовать в выражении: Сумма = РассчитатьСумму(ТаблицаТоваров);. Процедуру вызывают как отдельный оператор: ЗаполнитьТабличнуюЧасть(Документ);. Если попытаться присвоить результат процедуры переменной, платформа выдаст ошибку.
На практике выбор прост: если код должен вычислить и отдать значение — пишите функцию; если код должен что-то сделать (провести документ, отправить сообщение, изменить данные) — пишите процедуру. Когда функция начинает «по пути» менять данные в базе, это признак плохой архитектуры: такой код трудно тестировать и отлаживать.
Процедура или функция
Подходит для действий без результата: запись данных, вывод сообщений, открытие форм. Не возвращает значение.
Подходит для вычислений: расчёт суммы, получение ссылки, проверка условия. Обязательно возвращает значение через «Возврат».
Как объявить и вызвать процедуру
Объявление начинается с ключевого слова «Процедура», затем идут имя, круглые скобки с параметрами (могут быть пустыми), тело с операторами и завершающее «КонецПроцедуры». Имя должно отражать действие: «ПроверитьЗаполнениеРеквизитов», «ОтправитьУведомлениеМенеджеру». Имена вида «Проц1» или «Обработка» затрудняют чтение кода.
Процедура ВывестиСообщениеПользователю(ТекстСообщения)
Сообщить(ТекстСообщения);
КонецПроцедуры
Вызов выполняется по имени с передачей фактических параметров в том же порядке, в каком они объявлены: ВывестиСообщениеПользователю("Документ записан");. Если процедура находится в том же модуле, достаточно имени. Если в общем модуле — указывают имя модуля через точку: РаботаСДокументами.ПровестиДокумент(Ссылка);.
Директивы компиляции перед объявлением определяют, где будет доступна процедура: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Ключевое слово «Экспорт» после скобок делает процедуру видимой из других модулей. Без «Экспорт» процедура доступна только внутри своего модуля — это правильный способ скрыть вспомогательную логику.
&НаСервере
Процедура ЗаписатьИсториюИзменения(Документ, Комментарий) Экспорт
Запись = РегистрыСведений.ИсторияИзменений.СоздатьМенеджерЗаписи();
Запись.Документ = Документ;
Запись.Комментарий = Комментарий;
Запись.Записать();
КонецПроцедурыПараметры процедуры: передача по значению и по ссылке
Параметры объявляются в скобках через запятую. По умолчанию параметр передаётся по ссылке: если внутри процедуры изменить его значение, изменится и переменная в вызывающем коде. Это удобно, когда процедура должна «вернуть» несколько результатов через параметры, но опасно при неосторожном использовании — вызывающий код может не ожидать, что его переменная изменится.
Ключевое слово «Знач» перед параметром включает передачу по значению: процедура получает копию, и изменения внутри не влияют на исходную переменную. Используйте «Знач», когда параметр нужен только для чтения и вычислений внутри процедуры.
Параметру можно задать значение по умолчанию: Процедура ОтправитьОтчет(Получатель, Формат = "PDF"). Тогда при вызове этот параметр можно опустить. Параметры со значениями по умолчанию должны стоять в конце списка, иначе платформа выдаст ошибку компиляции модуля.
Предопределённые процедуры — обработчики событий
Часть процедур в конфигурации вы не вызываете сами — их запускает платформа при наступлении событий. У формы это «ПриСозданииНаСервере», «ПриОткрытии», «ПередЗакрытием»; у документа — «ПередЗаписью», «ПриПроведении», «ОбработкаЗаполнения». Такие процедуры называются обработчиками событий, и их имена строго фиксированы: переименуете обработчик — платформа перестанет его вызывать.
Создавать обработчик правильно через палитру свойств объекта: выберите событие, нажмите кнопку с лупой — конфигуратор сам создаст процедуру с корректным именем, директивой компиляции и параметрами. Ручной набор имени события — частый источник ошибок: одна опечатка, и код молча не выполняется.
Внутри обработчиков соблюдайте контекст. Клиентский обработчик «ПриОткрытии» не может напрямую обратиться к базе данных — для этого вызывают серверную процедуру. Попытка выполнить запрос на клиенте приведёт к ошибке выполнения.
Где размещать процедуры: модули и области
Процедура живёт в модуле, и выбор модуля определяет её доступность. Процедура в модуле формы видна только этой форме. Процедура в общем модуле с флагом «Сервер» доступна всей конфигурации на сервере. Процедура в модуле объекта (документа, справочника) работает с данными конкретного объекта.
Общие правила размещения просты. Логику работы с данными — запросы, записи, расчёты — выносите в серверные общие модули. Интерфейсные действия — открытие форм, предупреждения, опросы пользователя — оставляйте на клиенте. Вспомогательные процедуры модуля не помечайте «Экспорт», чтобы не раздувать программный интерфейс.
Внутри модуля процедуры группируют по областям: #Область ПрограммныйИнтерфейс для экспортных, #Область СлужебныеПроцедурыИФункции для внутренних. Это не влияет на выполнение, но существенно упрощает навигацию в больших модулях и соответствует стандартам разработки.
- 1Откройте нужный модуль: форму, общий модуль или модуль объекта
- 2Напишите объявление: директива, слово «Процедура», имя, параметры, тело, «КонецПроцедуры»
- 3Если процедура нужна извне — добавьте «Экспорт», иначе оставьте внутренней
- 4Вызовите процедуру по имени из нужного места кода
- 5Проверьте модуль на синтаксические ошибки (Ctrl+F7 в конфигураторе) и выполните вызов в отладке
Как проверить работу процедуры и типичные ошибки
Основной инструмент проверки — отладчик конфигуратора. Поставьте точку останова на строке вызова или внутри процедуры, запустите предприятие в режиме отладки и выполните действие, которое приводит к вызову. По шагам (F11 — с заходом в процедуру, F10 — поверх) проследите, какие значения принимают параметры и переменные.
Если процедура не выполняется, проверьте по порядку: правильно ли указано имя при вызове, есть ли «Экспорт» у процедуры в другом модуле, совпадает ли число и порядок параметров, корректна ли директива компиляции (серверную процедуру нельзя вызвать из клиентского контекста без специальных мер). Для обработчиков событий дополнительно убедитесь, что процедура действительно привязана к событию в палитре свойств.
Отдельный класс проблем — рекурсия и длинные циклы вызовов. Процедура, вызывающая саму себя без условия выхода, приведёт к переполнению стека и аварийному завершению. Перед рекурсивным вызовом всегда проверяйте условие завершения.
Как проверить результат
Ошибок нет, модуль сохраняется
Сообщения о синтаксических ошибках или несоответствии параметров
Точка останова внутри процедуры срабатывает, параметры имеют ожидаемые значения
Отладчик не заходит в процедуру — проверяйте имя, Экспорт и привязку обработчика
Данные записаны, сообщения выведены, форма открылась
Действия не выполняются или выполняются дважды — проверьте, не вызывается ли процедура из нескольких мест
Частые вопросы о процедурах в 1С
Можно ли вызвать процедуру одного общего модуля из другого?
Да, если процедура объявлена с ключевым словом «Экспорт» и оба модуля доступны в одном контексте (например, оба серверные). Вызов выглядит так: ИмяМодуля.ИмяПроцедуры(Параметры). Учитывайте флаги модулей: клиентский модуль не вызовет процедуру серверного модуля напрямую.
Чем отличается «Процедура» от «Процедура Экспорт»?
Без «Экспорт» процедура видна только внутри своего модуля — это внутренняя, служебная процедура. С «Экспорт» она становится частью программного интерфейса модуля и доступна для вызова из других модулей конфигурации.
Почему моя процедура-обработчик не выполняется?
Чаще всего причина в опечатке в имени события или в том, что процедура не привязана к событию в палитре свойств. Создайте обработчик заново через палитру свойств объекта — конфигуратор сформирует корректное имя и директиву автоматически.
Как вернуть значение из процедуры?
Напрямую — никак, для этого существуют функции. Обходные варианты: передать параметр по ссылке и изменить его внутри процедуры, либо переписать код как функцию с оператором «Возврат». Второй вариант предпочтительнее — он понятнее при чтении кода.
Что означают директивы &НаКлиенте и &НаСервере?
Они определяют, где компилируется и выполняется процедура. &НаКлиенте — на компьютере пользователя, доступен интерфейс, но нет прямого доступа к базе. &НаСервере — на сервере, доступны запросы и данные, но нельзя открыть форму или показать диалог.
Сколько параметров может быть у процедуры?
Жёсткого практического ограничения вы не упрётесь, но большое число параметров — признак плохого проектирования. Если параметров больше трёх-четырёх, подумайте о передаче структуры с именованными полями: такой вызов легче читать и расширять.
Что важно запомнить
Процедура в 1С — именованный блок кода без возвращаемого значения. Отличие от функции — отсутствие «Возврата». Размещайте логику в подходящих модулях, скрывайте внутренние процедуры без «Экспорт», обработчики событий создавайте через палитру свойств, а работу проверяйте отладчиком.