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

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

Как вызвать процедуру из общего модуля 1С

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

Общий модуль в 1С — это контейнер для процедур и функций, которые доступны из разных объектов конфигурации: форм, документов, отчётов, обработок. Чтобы вызвать процедуру из общего модуля, достаточно указать имя модуля, точку и имя процедуры: ОбщийМодуль.ИмяПроцедуры();. Однако на практике вызов часто не работает из-за забытого ключевого слова «Экспорт», неправильных флагов контекста компиляции или попытки вызвать серверную процедуру с тонкого клиента.

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

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

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

Синтаксис вызова одинаков для всех контекстов: сначала имя модуля, затем через точку имя процедуры с параметрами в скобках. Если процедура ничего не принимает, скобки всё равно ставятся: ОбщегоНазначения.ЗаписатьВЖурнал();. Для функций результат присваивается переменной или используется в выражении: Результат = РаботаСоСтроками.УбратьЛишниеПробелы(ИсходнаяСтрока);.

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

Шаг 1. Создать общий модуль и экспортную процедуру

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

В тексте модуля объявите процедуру с ключевым словом «Экспорт»:

Процедура ЗаписатьСобытиеВЖурнал(ТекстСобытия, Уровень = Неопределено) Экспорт

ЗаписьЖурналаРегистрации(ТекстСобытия, Уровень);

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

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

Порядок создания вызываемой процедуры
  1. 1
    Создайте общий модуль в ветке «Общие» → «Общие модули» и дайте ему уникальное имя
  2. 2
    Объявите процедуру с ключевым словом «Экспорт» после списка параметров
  3. 3
    Настройте флаги компиляции модуля под нужный контекст (сервер, клиент, внешнее соединение)
  4. 4
    Обновите конфигурацию базы данных (F7) и проверьте вызов из тестового места

Шаг 2. Настроить флаги компиляции модуля

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

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

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

Шаг 3. Вызвать процедуру из кода

Вызов на сервере

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

ОбщегоНазначения.ЗаписатьСобытиеВЖурнал("Запуск обмена", УровеньЖурналаРегистрации.Информация);

Вызов с клиента

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

&НаКлиенте

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

ОбменДаннымиСервер.ЗапуститьОбмен(ПараметрыОбмена);

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

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

Вызов из внешнего соединения

При подключении через COM или HTTP-сервисы код выполняется в контексте внешнего соединения. Для таких сценариев у модуля должен быть установлен флаг «Внешнее соединение», иначе процедура окажется недоступна, хотя в пользовательском режиме всё работает.

Где размещать процедуру

Серверный модуль

Работа с базой данных, запросы, проведение. Требует флага «Вызов сервера» для обращения с клиента.

Клиентский модуль

Диалоги, работа с файлами на компьютере пользователя, оповещения. Не имеет доступа к запросам и транзакциям.

КлиентСерверный модуль

Чистые вычисления без обращения к БД и без клиентских API: форматирование строк, расчёты, работа с коллекциями.

Как проверить, что вызов отработал

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

Второй способ — запись в журнал регистрации из первой строки процедуры. Это удобно для фоновых заданий и внешних соединений, где интерактивная отладка затруднена.

Также проверьте синтаксис модуля через «Конфигурация» → «Проверка конфигурации» с включённой проверкой модулей для нужных режимов запуска. Проверка выявит несуществующие имена, несовпадение числа параметров и недоступность процедур в выбранном контексте ещё до запуска.

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

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

Точка останова внутри процедуры
Норма

Отладчик останавливается в процедуре при вызове

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

Точка не срабатывает — модуль недоступен в данном контексте или вызов не выполняется

Сообщение об ошибке при вызове
Норма

Ошибок нет, действие выполняется

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

«Процедура не определена» — нет «Экспорт» или неверное имя модуля

Проверка конфигурации
Норма

Проверка модулей проходит без ошибок

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

Ошибки компиляции для конкретного режима запуска

Типичные ошибки и их причины

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

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

Ошибка «Слишком много фактических параметров» или несоответствие типов появляется после изменения сигнатуры процедуры: общий модуль вызывается из множества мест, и правка параметров ломает старые вызовы. Перед изменением сигнатуры найдите все обращения через «Правка» → «Замена» или поиск по конфигурации.

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

Ограничения и особенности

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

Процедуры общего модуля нельзя вызывать по имени строкой напрямую, как методы формы. Для динамического вызова используйте ОбщегоНазначения.ВызватьФункциюКонфигурации() в типовых решениях или собственные механизмы сопоставления имён, но учитывайте риски безопасности при передаче имени процедуры извне.

В фоновых заданиях вызов процедуры общего модуля выполняется через ФоновыеЗадания.Выполнить("ИмяМодуля.ИмяПроцедуры", Параметры) — это единственный штатный способ запустить код модуля асинхронно. Имя указывается строкой, поэтому опечатки здесь проявятся только в момент запуска задания.

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

FAQ

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

Да, это стандартный сценарий. В серверной процедуре формы (&НаСервере, &НаСервереБезКонтекста) доступны серверные модули, в клиентской (&НаКлиенте) — клиентские, клиент-серверные и серверные с флагом «Вызов сервера». Директива компиляции процедуры формы определяет доступный контекст.

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

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

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

Точно так же, по полному имени, при условии что обработка работает в контексте, где модуль скомпилирован. Если обработка открывается на тонком клиенте, а модуль серверный без флага «Вызов сервера», вызов будет недоступен — вынесите логику в доступный модуль или вызывайте через серверный контекст формы обработки.

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

Только наличием возвращаемого значения: функция объявляется словом «Функция» и возвращает результат через «Возврат», её можно использовать в выражениях. Правила экспорта, флагов компиляции и контекстов идентичны для обоих.

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

На клиенте — через «ПодключитьОбработчикОжидания» с указанием имени клиентской процедуры. На сервере асинхронный запуск выполняется через «ФоновыеЗадания.Выполнить», где имя метода задаётся строкой вида «ИмяМодуля.ИмяПроцедуры», а процедура должна быть экспортной и серверной.

Что делать, если процедура есть, экспорт объявлен, а ошибка «не определена» остаётся?

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

Итог

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

Вызов процедуры из общего модуля строится на трёх условиях: ключевое слово «Экспорт», корректные флаги компиляции под контекст вызова и точное имя «Модуль.Процедура()». Проверяйте вызов отладчиком или проверкой конфигурации, а перед изменением сигнатуры и флагов рабочей базы делайте выгрузку.