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

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

Как в процедуре вызвать процедуру в 1С

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

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

В простейшем случае достаточно написать имя процедуры и передать параметры в круглых скобках. Если процедура находится в другом модуле, она должна быть объявлена с ключевым словом Экспорт, а обращение к ней выполняется через имя модуля. Ниже разобраны все варианты вызова с примерами кода, ограничениями клиент-серверного взаимодействия и типичными ошибками.

Вызов процедуры в том же модуле

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

Процедура ПриПроведенииДокумента() Экспорт

РассчитатьИтоги();

ЗаписатьДвижения();

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

Процедура РассчитатьИтоги()

// логика расчёта

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

Обратите внимание: вызов процедуры — это оператор, поэтому после него ставится точка с запятой. Если процедура не принимает параметров, скобки всё равно пишутся — это обязательное требование синтаксиса, иначе платформа воспримет имя как переменную и выдаст ошибку «Переменная не определена».

Передача параметров при вызове

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

Если нужно, чтобы процедура изменила переданную переменную, параметр объявляется с ключевым словом Знач — наоборот, оно фиксирует передачу по значению. Без Знач параметр передаётся по ссылке, и присвоение ему нового значения внутри процедуры вернётся в вызывающий код.

Процедура ОбработатьДокумент(ДокументСсылка, Отказ)

ПроверитьЗаполнение(ДокументСсылка, Отказ);

Если Отказ Тогда

Возврат;

КонецЕсли;

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

Процедура ПроверитьЗаполнение(Ссылка, Отказ)

Если Не ЗначениеЗаполнено(Ссылка.Организация) Тогда

Отказ = Истина; // изменение вернётся в вызывающую процедуру

КонецЕсли;

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

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

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

// В общем модуле РаботаСДокументами

Процедура ЗаполнитьПоУмолчанию(ДокументОбъект) Экспорт

// логика заполнения

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

// В модуле документа

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

РаботаСДокументами.ЗаполнитьПоУмолчанию(ЭтотОбъект);

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

Если у общего модуля установлено свойство «Глобальный», его экспортные процедуры доступны напрямую по имени без указания модуля. Это удобно для часто используемых функций, но повышает риск конфликтов имён: две процедуры с одинаковым именем в разных глобальных модулях приведут к ошибке компиляции.

Маршрут решения

Куда поместить вызываемую процедуру

Логика нужна только внутри одного объекта или формыОставьте процедуру в том же модуле без Экспорт
Процедура используется в нескольких объектах конфигурацииСоздайте общий модуль и объявите процедуру с Экспорт
Процедура работает с данными конкретного вида документов или справочниковРазместите её в модуле менеджера объекта и вызывайте как Справочники.Номенклатура.МояПроцедура()

Клиент-серверный вызов из формы

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

&НаКлиенте

Процедура КомандаРассчитать(Команда)

РассчитатьНаСервере(Объект.Ссылка);

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

&НаСервереБезКонтекста

Процедура РассчитатьНаСервере(Ссылка)

// серверная логика

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

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

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

Экспортные процедуры модуля объекта вызываются через сам объект: сначала получается объект методом ПолучитьОбъект(), затем вызывается его процедура. Такой вызов доступен только на сервере.

ДокОбъект = ДокументСсылка.ПолучитьОбъект();

ДокОбъект.ПересчитатьСуммы();

Процедуры модуля менеджера вызываются через менеджер объекта без получения объекта данных: Справочники.Номенклатура.МояПроцедура(Параметр). Это предпочтительный способ для операций, которым не нужен открытый объект, — он не создаёт лишних блокировок и работает быстрее.

Типичные ошибки
01
Вызов неэкспортной процедуры другого модуля — ошибка «Процедура или функция с указанным именем не определена». Добавьте Экспорт после списка параметров.
02
Пропуск скобок при вызове без параметров — платформа ищет переменную с таким именем вместо вызова процедуры.
03
Попытка вызвать с клиента процедуру серверного общего модуля без флага «Вызов сервера» — вызов недоступен, включите свойство модуля.
04
Изменение параметра, переданного со словом Знач, с ожиданием эффекта снаружи — изменения теряются, уберите Знач.
05
Циклический вызов: процедура А вызывает Б, а Б вызывает А без условия выхода — переполнение стека и аварийное завершение.

Проверка результата и отладка вызовов

Убедиться, что вызов выполняется, проще всего через конфигуратор: поставьте точку останова на строке вызова и пройдите внутрь процедуры клавишей F11. Если точка внутри вызываемой процедуры не срабатывает, проверьте, что вызывается именно та процедура — совпадают ли имя модуля, директива компиляции и контекст.

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

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

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

Наличие Экспорт у вызываемой процедуры
Норма

Процедура видна из других модулей, вызов компилируется

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

Ошибка «Процедура или функция с указанным именем не определена»

Контекст выполнения
Норма

Директива вызываемой процедуры доступна из вызывающей (клиент → сервер)

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

Процедура не видна на клиенте, хотя объявлена в модуле формы

Передача параметров
Норма

Количество и порядок аргументов совпадают с объявлением

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

Ошибка «Несоответствие числа переданных параметров»

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

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

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

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

Функция возвращает значение и может использоваться в выражениях: Результат = МояФункция(Параметр). Процедура ничего не возвращает и вызывается отдельным оператором. Синтаксис вызова и передачи параметров при этом одинаковый.

Как вызвать процедуру общего модуля с клиента, если модуль серверный?

Установите в свойствах общего модуля флаги «Сервер» и «Вызов сервера». После этого его экспортные процедуры станут доступны из клиентского кода. Учитывайте, что каждый такой вызов — обращение к серверу с соответствующими накладными расходами.

Почему изменения параметра внутри процедуры не видны снаружи?

Скорее всего, параметр объявлен с ключевым словом Знач — в этом случае передаётся копия значения. Уберите Знач из объявления параметра, чтобы он передавался по ссылке, либо верните результат через функцию.

Можно ли вызвать процедуру по имени, хранящемуся в строке?

Да, через метод Выполнить или через построение выражения, но это небезопасно и затрудняет отладку. Предпочтительный вариант — структура с соответствием имён и явных вызовов через Если/ИначеЕсли. Динамический вызов оправдан только в редких механизмах расширяемости.

Итог

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

Вызов процедуры из процедуры в 1С выполняется по имени с параметрами в скобках. Для вызова из другого модуля нужна директива Экспорт и обращение через имя модуля. В формах учитывайте клиент-серверный контекст, а параметры, которые должны измениться снаружи, передавайте без слова Знач.