К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как вызвать процедуру в 1С: все способы с примерами

Как вызвать процедуру в 1С: из модуля формы, общего модуля, другого объекта и по имени строкой. Синтаксис, директивы компиляции, типичные ошибки.

Вызов процедуры в 1С — базовая операция встроенного языка, но у начинающих разработчиков она регулярно вызывает вопросы: где должна находиться процедура, какие директивы компиляции указать, почему вызов из формы «не видит» процедуру общего модуля. Ответ зависит от того, где объявлена процедура и откуда она вызывается.

В простейшем случае вызов выглядит как имя процедуры со списком параметров в скобках: РассчитатьСумму(ТаблицаТоваров);. Если процедура находится в том же модуле, что и вызывающий код, больше ничего не требуется. Если в другом модуле — нужно указать контекст: имя общего модуля, менеджер объекта или экспортную переменную формы.

Ниже разобраны все основные сценарии: вызов внутри модуля, из общего модуля, между формами, на клиенте и сервере, а также вызов по имени строкой и типичные ошибки компиляции.

Вызов процедуры внутри одного модуля

Самый простой случай — процедура и вызывающий её код находятся в одном модуле (модуле формы, объекта или общем модуле). Достаточно написать имя процедуры и передать параметры:

Процедура КнопкаРассчитатьНажатие(Элемент)

Итог = РассчитатьИтог(ТаблицаТоваров);

Сообщить("Итог: " + Итог);

КонецПроцедуры

Функция РассчитатьИтог(Таблица)

Итог = 0;

Для Каждого Строка Из Таблица Цикл

Итог = Итог + Строка.Сумма;

КонецЦикла;

Возврат Итог;

КонецФункции

Порядок объявления внутри модуля значения не имеет: вызываемая процедура может быть описана ниже вызывающего кода. Компилятор 1С анализирует модуль целиком.

Если процедура не экспортная (без ключевого слова Экспорт), она доступна только внутри своего модуля. Это удобно для вспомогательных алгоритмов, которые не должны вызываться снаружи.

Вызов процедуры из общего модуля

Общие модули — основное место для прикладной логики, используемой из разных объектов конфигурации. Чтобы процедура была доступна извне, она обязательно объявляется с ключевым словом Экспорт:

// Общий модуль РаботаСНоменклатурой

Функция ПолучитьЦену(Номенклатура, Дата) Экспорт

// ... логика получения цены

Возврат Цена;

КонецФункции

Вызов из любого другого модуля выполняется через имя общего модуля:

Цена = РаботаСНоменклатурой.ПолучитьЦену(ТекТовар, ТекущаяДата());

Обратите внимание на флажки в свойствах общего модуля: «Клиент (управляемое приложение)», «Сервер», «Вызов сервера». Если модуль скомпилирован только на сервере, вызвать его процедуру из клиентского кода напрямую нельзя — об этом подробнее в разделе про клиент и сервер.

Директивы компиляции: вызов между клиентом и сервером

В управляемых формах каждая процедура помечается директивой: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста или &НаКлиентеНаСервереБезКонтекста. Директива определяет, где выполняется код и откуда он доступен.

Клиентская процедура не может напрямую обратиться к базе данных. Поэтому типовой шаблон выглядит так: клиентская процедура обработчика события вызывает серверную, которая выполняет запрос и возвращает результат:

&НаКлиенте

Процедура ЗаполнитьЦены(Команда)

ЗаполнитьЦеныНаСервере();

КонецПроцедуры

&НаСервере

Процедура ЗаполнитьЦеныНаСервере()

// запрос к базе данных, заполнение таблицы формы

КонецПроцедуры

Порядок действий при ошибке доступности
  1. 1
    Определите, где выполняется вызывающий код: клиент или сервер
  2. 2
    Проверьте директиву компиляции вызываемой процедуры
  3. 3
    Если нужен серверный вызов из клиента — создайте серверную процедуру-обёртку или проверьте флажок «Вызов сервера» у общего модуля
  4. 4
    Скомпилируйте модуль (Ctrl+F7 в модуле) и повторите вызов

Процедуры &НаСервереБезКонтекста работают быстрее, так как не передают данные формы между клиентом и сервером, но у них нет доступа к реквизитам формы напрямую — данные нужно передавать через параметры.

Вызов процедуры другого объекта или формы

Из модуля объекта или менеджера

Экспортные процедуры модуля объекта вызываются через ссылку на объект: ДокументОбъект.ПроверитьЗаполнение() (после получения объекта методом ПолучитьОбъект()). Экспортные процедуры модуля менеджера вызываются через менеджер: Документы.РеализацияТоваров.СоздатьНаОсновании(Параметры).

Из одной формы в другую

Прямой вызов процедуры чужой формы — признак слабой архитектуры, но технически возможен: форму открывают с параметрами, а результат возвращают через Оповестить() / обработчик ОбработкаОповещения() либо через описание оповещения ОписаниеОповещения при закрытии формы. Так данные передаются без жёсткой связи между формами.

Вызов процедуры по имени строкой

Иногда имя процедуры известно только во время выполнения — например, обработчик хранится в настройках. Для этого используется метод Выполнить() (выполняет произвольный код) или вызов через точку с вычисляемым именем недоступен — только Выполнить:

Выполнить(ИмяПроцедуры + "(Параметр1, Параметр2);");

Метод Выполнить работает медленнее прямого вызова, не проверяется компилятором и недоступен в некоторых контекстах безопасного режима. Используйте его только там, где без динамического вызова не обойтись, и никогда не передавайте в него непроверенный пользовательский ввод — это риск исполнения произвольного кода.

Типичные ошибки
01
Забыто слово Экспорт — процедура недоступна из других модулей, ошибка «не определена»
02
Вызов серверной процедуры из клиентского кода без серверной обёртки — ошибка компиляции или выполнения
03
Несовпадение количества или типов параметров — ошибка «Несоответствие числа фактических параметров»
04
Использование Выполнить() там, где достаточно прямого вызова — потеря проверки компилятором и скорости
05
Опечатка в имени общего модуля — та же ошибка «процедура не определена»

Параметры: передача по значению и по ссылке

По умолчанию параметры передаются по ссылке: изменения параметра внутри процедуры видны в вызывающем коде. Если добавить ключевое слово Знач, передаётся копия значения, и исходная переменная не меняется:

Процедура Увеличить(Число)        // по ссылке — изменится у вызывающего

Число = Число + 1;

КонецПроцедуры

Процедура УвеличитьКопию(Знач Число) // копия — оригинал не изменится

Число = Число + 1;

КонецПроцедуры

У параметров могут быть значения по умолчанию: Процедура Записать(Документ, Режим = Неопределено). Такие параметры можно опускать при вызове, но только если они идут в конце списка.

Контрольные точки

Как проверить результат

Компиляция модуля (Ctrl+F7)
Норма

Ошибок нет, вызов подсвечивается корректно

Тревожный признак

Сообщение «Процедура или функция не определена»

Выполнение в отладчике (F11 — шаг с заходом)
Норма

Управление переходит внутрь вызываемой процедуры

Тревожный признак

Исключение на строке вызова

Значения параметров после вызова
Норма

Изменились только ожидаемые параметры

Тревожный признак

Побочные изменения из-за передачи по ссылке

Частые вопросы

Чем процедура отличается от функции при вызове?

Функция возвращает значение и может использоваться в выражениях: Х = ПолучитьЦену(Товар);. Процедура ничего не возвращает и вызывается отдельным оператором. Вызвать функцию как процедуру (проигнорировав результат) можно, вызвать процедуру в выражении — нельзя.

Почему общий модуль не виден из формы?

Чаще всего в свойствах общего модуля не установлен нужный флажок компиляции («Сервер» или «Клиент»), либо для серверного модуля не включён флажок «Вызов сервера». Также проверьте, что процедура объявлена с Экспорт и модуль входит в состав подсистемы, доступной вашей роли.

Можно ли вызвать процедуру формы из модуля объекта?

Напрямую — нет: модуль объекта не знает о формах. Правильный путь — выполнить логику в модуле объекта или общем модуле, а форма получит результат через реквизиты, параметры или оповещение.

Как вызвать процедуру с задержкой или периодически на клиенте?

Используйте ПодключитьОбработчикОжидания("ИмяКлиентскойПроцедуры", Интервал, Однократно). Процедура должна быть клиентской, экспортной и без параметров. Для отключения — ОтключитьОбработчикОжидания().

Что делать, если параметров много и вызов нечитаем?

Сгруппируйте параметры в структуру: Параметры = Новый Структура("Товар, Цена, Количество", ...); и передавайте её одним параметром. Это упрощает вызов и позволяет добавлять поля без изменения сигнатуры процедуры.

Итог

Что важно запомнить

Вызов процедуры — имя плюс параметры в скобках. Для вызова из другого модуля нужны слово Экспорт и правильный контекст (имя общего модуля или объекта). В управляемых формах следите за директивами компиляции и разделяйте клиентскую и серверную логику. Динамический вызов через Выполнить — крайняя мера.