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