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