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