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