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