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