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

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

Что значит глобальный модуль в 1С

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

Глобальный модуль — это специальный программный модуль конфигурации 1С, процедуры и функции которого доступны из любого другого модуля системы без дополнительных указаний. Если вы встречаете в коде вызов функции без префикса имени модуля — например, глНайтиЭлемент(Код) — скорее всего, она объявлена именно в глобальном модуле или в глобальном контексте.

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

Знание того, как устроен глобальный контекст, критично при сопровождении старых конфигураций на 7.7, при чтении чужого кода в 8.x и при проектировании собственных механизмов. Ошибки в этой области приводят к конфликтам имён, замедлению компиляции модулей и трудноуловимым ошибкам «переменная не определена».

Что такое глобальный модуль и зачем он нужен

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

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

Обратная сторона — загрязнение глобального пространства имён. Если в глобальном модуле объявить функцию с именем, совпадающим с методом платформы или с экспортной функцией другого глобального модуля, конфигуратор выдаст ошибку при сохранении конфигурации или поведение станет непредсказуемым. Поэтому в типовых конфигурациях 7.7 принят префикс гл (глПроведениеДокумента, глСуммаПрописью), а в 8.x глобальные модули используют крайне редко.

Глобальный модуль в 1С 7.7: устройство и особенности

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

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

bsl
// Глобальный модуль 1С 7.7
Перем глТекущийПользователь;

Функция глСуммаПрописью(Сумма, Валюта)
    // ... реализация
КонецФункции

Процедура ПриНачалеРаботыСистемы()
    глТекущийПользователь = ИмяПользователя();
КонецПроцедуры

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

Чем заменён глобальный модуль в 1С 8.x

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

Именно флажок «Глобальный» делает общий модуль аналогом глобального модуля 7.7: его экспортные процедуры и функции попадают в глобальный контекст и вызываются без имени модуля. Если флажок снят (стандартный вариант в типовых конфигурациях), вызов идёт через имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Организация").

Подходы к общему коду

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

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

Обычный общий модуль с именем

Стандарт типовых конфигураций 8.x. Явный вызов Модуль.Функция() — понятно, где лежит код, нет конфликтов имён. Код чуть длиннее.

Переопределяемые модули (Переопределяемый)

Приём БСП: типовая логика вызывает процедуру из модуля с постфиксом Переопределяемый, куда внедренец вписывает свой код, не меняя типовой модуль.

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

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

Задача «найти, где объявлена эта функция» — самая частая причина, по которой открывают глобальный модуль. Порядок действий зависит от версии платформы.

Поиск объявления функции
  1. 1
    Определите версию: 7.7 — ищите в конфигураторе ветку «Общие — Глобальный модуль»; 8.x — ветку «Общие — Общие модули».
  2. 2
    В 1С 8.x поставьте курсор на имя функции в коде и нажмите F12 — конфигуратор перейдёт к объявлению независимо от того, глобальный это контекст или именованный модуль.
  3. 3
    Если F12 не сработал, используйте глобальный поиск (Ctrl+Shift+F) по тексту «Функция ИмяФункции» с областью поиска «Вся конфигурация».
  4. 4
    В 7.7 откройте глобальный модуль и выполните поиск по имени функции (Ctrl+F) внутри модуля.
  5. 5
    Проверьте, не является ли функция методом платформы: откройте синтакс-помощник (Ctrl+Shift+F1) и найдите имя в разделе глобального контекста.

При чтении глобального модуля 7.7 полезно помнить: переменные модуля инициализируются при запуске системы, процедуры без Лок доступны везде, а порядок выполнения при старте определяется процедурой ПриНачалеРаботыСистемы. Если конфигурация «падает» при запуске с ошибкой в непонятной строке — почти наверняка проблема в глобальном модуле.

Когда стоит создавать глобальный общий модуль в 8.x

Прямая необходимость в глобальном общем модуле возникает редко. Обоснованные сценарии: обработчики ожидания, подключаемые через ПодключитьОбработчикОжидания("ИмяПроцедуры", ...) с глобальным именем; процедуры, вызываемые из строковых выражений; сопровождение кода, перенесённого с 7.7 методом прямой конвертации.

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

Куда поместить общий код

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

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

Типичные проблемы и их диагностика

Большинство ошибок, связанных с глобальным контекстом, проявляются на этапе проверки конфигурации или при запуске. Характерные сообщения: «Процедура или функция с указанным именем уже определена», «Переменная не определена», «Метод объекта не обнаружен».

Типичные ошибки
01
Дублирование имени экспортной функции в двух глобальных модулях — конфигурация не сохраняется или ведёт себя непредсказуемо; решение — уникальные префиксы.
02
Вызов серверной глобальной функции из клиентского модуля в тонком клиенте — ошибка компиляции; проверяйте флажки Сервер/Клиент у модуля.
03
Использование глобальных переменных для передачи данных между объектами — данные теряются при перезапуске сеанса и создают скрытые зависимости; используйте параметры сеанса или параметры вызова.
04
Правка глобального модуля типовой конфигурации 7.7 без резервной копии — при обновлении релиза изменения теряются; ведите список доработок отдельным файлом.
05
Размещение тяжёлого кода в ПриНачалеРаботыСистемы — замедляет запуск программы у всех пользователей; выносите инициализацию в момент первого обращения.

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

Как проверить, что всё работает правильно

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

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

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

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

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

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

Ошибки компиляции в модулях, вызывающих глобальные функции

Запуск программы
Норма

Предприятие стартует, ПриНачалеРаботыСистемы отрабатывает без исключений

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

Окно ошибки при старте или аварийное завершение

Вызов из разных контекстов
Норма

Функция работает и из формы, и из модуля объекта, и из отчёта

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

В одних модулях вызов проходит, в других — ошибка (обычно проблема флажков Клиент/Сервер)

Обновление типовой конфигурации
Норма

Доработки сохранены или перенесены по списку изменений

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

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

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

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

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

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

Общий модуль — это объект конфигурации 8.x для общего кода; его методы вызываются через имя модуля. Глобальный — это либо отдельный модуль 7.7, либо общий модуль 8.x с включённым свойством «Глобальный», чьи методы попадают в глобальный контекст и вызываются без префикса.

Можно ли в 1С 8.3 создать глобальный модуль как в 7.7?

Отдельного объекта «глобальный модуль» в 8.x нет. Создайте общий модуль и в палитре свойств установите флажок «Глобальный» — его экспортные процедуры и функции станут доступны из любого модуля без указания имени. Учитывайте ограничения по флажкам Клиент и Сервер.

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

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

Где искать процедуру ПриНачалеРаботыСистемы?

В 1С 7.7 — в глобальном модуле. В 8.x — в модуле управляемого приложения или модуле обычного приложения (ветка «Конфигурация» в дереве объектов). Дополнительную логику запуска типовые конфигурации размещают в общих модулях подсистем, вызываемых из этих обработчиков.

Безопасно ли хранить данные в глобальных переменных?

Для временных данных сеанса — допустимо, но с оговорками: значения существуют только в рамках сеанса, не переносятся между клиентом и сервером в 8.x и создают скрытые связи между участками кода. Для настроек и прав используйте константы, параметры сеанса или регистры сведений.

Что делать, если после обновления пропали доработки глобального модуля?

Восстановите код из резервной копии конфигурации (MD-файл для 7.7, выгрузка CF или хранилище для 8.x). Чтобы ситуация не повторялась, выносите доработки в отдельные добавленные общие модули и ведите файл-реестр всех изменений типовых объектов.

Итог

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

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