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

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

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

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

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

Обращение выполняется по простой схеме: ИмяОбщегоМодуля.ИмяПроцедуры(Параметры);. Платформа сама находит модуль по имени, поэтому никаких дополнительных объявлений или импортов не требуется. Главное — правильно настроить свойства модуля (Сервер, Клиент, Вызов сервера) и учитывать контекст, из которого выполняется вызов.

Базовый синтаксис вызова

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

// Вызов процедуры без возврата значения

ОбщегоНазначения.ЗаписатьДанныеВЖурнал(ТекстСообщения);

// Вызов функции с получением результата

Результат = РаботаСоСтроками.УбратьЛишниеПробелы(ИсходнаяСтрока);

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

Процедура ЗаписатьДанныеВЖурнал(ТекстСообщения) Экспорт

// тело процедуры

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

Настройка свойств общего модуля

Доступность процедуры определяется не только словом Экспорт, но и флагами в палитре свойств общего модуля. Неверная комбинация флагов — самая частая причина ошибок «метод не обнаружен» или недоступности модуля в нужном контексте.

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

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

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

Контекст вызова определяет, какие модули доступны. Из клиентского кода (например, из обработчика команды формы с директивой &НаКлиенте) можно напрямую обратиться только к клиентским модулям и к серверным модулям с установленным флагом «Вызов сервера».

&НаКлиенте

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

// вызов серверной процедуры — модуль должен иметь флаг "Вызов сервера"

Результат = МойСерверныйМодуль.ПолучитьДанные(Параметр);

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

Из серверного контекста (&НаСервере, модуль объекта, регламентное задание) доступны все серверные общие модули без дополнительных условий. Обратный вызов — с сервера на клиента — невозможен: сервер не знает о состоянии конкретного клиентского сеанса. Если нужно передать что-то на клиент, возвращайте значение из серверной функции и обрабатывайте его в клиентском коде.

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

Как выбрать настройки модуля

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

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

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

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

Типичные ошибки и их устранение

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

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

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

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

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

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

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

Компиляция модуля
Норма

Проверка конфигурации проходит без ошибок по этому модулю

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

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

Вход в процедуру
Норма

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

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

Точка останова не срабатывает — вызов не доходит

Возвращаемое значение
Норма

Функция возвращает ожидаемый тип данных

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

Возвращается Неопределено или значение другого типа

Права доступа
Норма

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

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

Ошибка нарушения прав доступа — нужен привилегированный режим или настройка ролей

Для проверки без отладчика удобно временно вывести результат через Сообщить() или записать его в журнал регистрации. После отладки такие вызовы удаляйте, чтобы не засорять журнал и не замедлять работу пользователей.

Итог

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

Вызов выполняется по схеме ИмяМодуля.ИмяПроцедуры(Параметры). Процедура должна быть экспортной, а флаги модуля должны соответствовать контексту вызова: «Сервер» для работы с БД, «Вызов сервера» для обращения с клиента. Нельзя передавать несериализуемые объекты между клиентом и сервером и вызывать клиентский код с сервера.

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

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

Точно так же, как из любого другого места: ИмяМодуля.ИмяПроцедуры(Параметры). Если вызов происходит в клиентском обработчике формы (директива &НаКлиенте), у серверного модуля должен стоять флаг «Вызов сервера». Из серверного обработчика формы (&НаСервере) серверные модули доступны без ограничений.

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

Три основные причины: у процедуры отсутствует ключевое слово Экспорт, допущена опечатка в имени процедуры или модуля, либо модуль недоступен в текущем контексте из-за настроек флагов (Сервер, Клиент, Вызов сервера). Проверьте эти пункты по порядку.

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

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

Чем общий модуль отличается от модуля менеджера объекта?

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

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

Нет, прямой вызов с сервера на клиент невозможен архитектурно. Возвращайте данные из серверной функции и обрабатывайте их в клиентском коде, либо используйте оповещения форм через Оповестить() уже на стороне клиента.

Нужно ли перезапускать сеанс после изменения общего модуля?

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