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