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