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

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

Глобальный модуль в 1С: назначение, настройка и типичные ошибки

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

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

Термин имеет двойное происхождение. В 1С:Предприятии 7.7 существовал единственный «Глобальный модуль» — отдельный объект конфигурации, куда разработчики складывали общий код. В платформе 8.x отдельного объекта «глобальный модуль» нет: его роль выполняют общие модули с соответствующим свойством. Когда опытные разработчики говорят «глобальный модуль», чаще всего речь идёт именно об общем модуле с флагом «Глобальный» в 1С 8.3.

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

Что такое глобальный модуль и где он находится в конфигураторе

В конфигураторе 1С 8.3 общие модули расположены в ветке дерева конфигурации «Общие» → «Общие модули». Чтобы сделать модуль глобальным, нужно открыть его свойства (правый клик → «Свойства» или палитра свойств) и установить флажок «Глобальный». После этого все процедуры и функции модуля, помеченные словом «Экспорт», попадают в глобальный контекст прикладного решения.

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

Важно понимать различие: обычный (неглобальный) общий модуль требует явного указания имени — например, ОбщегоНазначения.НайтиЭлемент(Параметры). Глобальный модуль позволяет написать просто НайтиЭлемент(Параметры). Это сокращает код, но повышает риск неоднозначности.

Чем глобальный модуль отличается от обычного общего модуля

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

ПараметрГлобальный общий модульОбычный общий модуль
Способ вызоваПо имени процедуры без префиксаИмяМодуля.ИмяПроцедуры
Риск конфликта имёнВысокий — имя занимает глобальное пространствоНизкий — имя изолировано внутри модуля
Серверный вызовОпределяется флагами «Сервер», «Вызов сервера»Аналогично
Типичное применениеНебольшой набор универсальных утилитОсновная библиотека прикладного кода
ПоддерживаемостьСложнее искать источник методаПроще: по имени модуля понятно назначение

Типовые конфигурации 1С (БСП — библиотека стандартных подсистем) почти не используют глобальные модули: подавляющее большинство общих модулей там неглобальные. Это осознанное архитектурное решение — явное имя модуля делает код читаемее и упрощает поиск вызовов.

Как создать глобальный модуль: пошаговый порядок

Создание глобального модуля занимает несколько минут. Главное — заранее продумать состав экспортируемых методов, чтобы не перегружать глобальное пространство имён.

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

Пример минимального содержимого глобального модуля:

// Глобальный общий модуль

Функция ФорматироватьСумму(Сумма) Экспорт

Возврат Формат(Сумма, "ЧДЦ=2; ЧРГ=' '");

КонецФункции

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

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

УровеньЖурналаРегистрации.Информация);

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

После этого из любого модуля конфигурации достаточно написать СуммаСтрокой = ФорматироватьСумму(ИтогДокумента); — без указания имени модуля.

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

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

Не стоит выносить в глобальный контекст прикладную бизнес-логику: расчёт цен, проведение документов, обмены данными. Эти операции должны жить в именованных общих модулях — тогда по вызову РасчетЦен.Пересчитать(...) сразу видно, к какой подсистеме относится код.

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

Как выбрать действие

Функция вызывается из десятков мест и не привязана к конкретной подсистемеДопустимо разместить её в глобальном модуле
Код относится к конкретной подсистеме (склад, зарплата, обмены)Используйте обычный общий модуль с говорящим именем
Метод должен выполняться на сервере с обращением к даннымВключите флаги «Сервер» и «Вызов сервера», клиентские флаги снимите
В конфигурации уже есть похожая функция в другом модулеНе создавайте дубль в глобальном контексте — выберите одно место и унифицируйте вызовы

Ограничения и подводные камни платформы

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

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

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

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

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

Отдельно стоит упомянуть ошибку миграции с 1С 7.7: при переносе кода из старого глобального модуля разработчики иногда копируют всё подряд в один глобальный общий модуль 8.x. Правильнее разбить этот код на тематические неглобальные модули, оставив в глобальном только действительно универсальные функции.

Как проверить, что глобальный модуль работает корректно

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

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

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

Обновление конфигурации базы данных (F7)
Норма

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

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

Ошибки «Дублирование процедуры/функции» или «Метод не обнаружен»

Контекстная подсказка в другом модуле
Норма

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

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

Функция не находится — проверьте слово «Экспорт» и флаг «Глобальный»

Вызов в пользовательском режиме
Норма

Код выполняется, результат возвращается корректно

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

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

Клиент-серверный вызов
Норма

Серверная функция вызывается с клиента при включённом «Вызов сервера»

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

Ошибка недопустимого вызова — флаг «Вызов сервера» не установлен

Дополнительно имеет смысл запустить полную проверку конфигурации (меню «Конфигурация» → «Проверка конфигурации») с включённой проверкой модулей — она выявит неоднозначные имена и недопустимые контексты до обновления базы.

Глобальный модуль в 1С 7.7: краткая справка для миграций

В 1С:Предприятии 7.7 глобальный модуль — это отдельный обязательный объект конфигурации, единственный в своём роде. В нём описывались глобальные переменные, процедуры и функции, доступные во всей системе, а также системные предопределённые процедуры вроде ПриНачалеРаботыСистемы().

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

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

FAQ: частые вопросы о глобальном модуле 1С

Чем глобальный модуль отличается от модуля приложения?

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

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

Да, обращение вида ИмяМодуля.ИмяФункции() остаётся работоспособным и для глобального модуля. Такой стиль иногда используют намеренно — для ясности кода. Глобальность лишь добавляет возможность короткого вызова, но не отменяет полный синтаксис.

Почему функция глобального модуля не видна в коде?

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

Сколько глобальных модулей может быть в конфигурации?

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

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

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

Что произойдёт при совпадении имён в двух глобальных модулях?

При проверке или обновлении конфигурации платформа сообщит о дублировании процедуры или функции в глобальном контексте, и обновление не выполнится. Лечится переименованием одного из методов либо снятием флага «Глобальный» у одного из модулей с переводом вызовов на полный синтаксис через имя модуля.

Итог

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

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