Разработка и Конфигурация · 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: все процедуры и функции глобального модуля по умолчанию доступны глобально, если только они не объявлены с модификатором Лок (локальные). Переменные, объявленные в разделе определения переменных глобального модуля, также становятся глобальными переменными всей системы.
// Глобальный модуль 1С 7.7
Перем глТекущийПользователь;
Функция глСуммаПрописью(Сумма, Валюта)
// ... реализация
КонецФункции
Процедура ПриНачалеРаботыСистемы()
глТекущийПользователь = ИмяПользователя();
КонецПроцедурыТиповая структура глобального модуля 7.7 в конфигурациях вроде «Торговля и склад» или «Бухгалтерия» занимала десятки тысяч строк. В ней размещались: обработчики системных событий, функции работы с периодическими реквизитами, расчёт налогов, печатные формы общего назначения, служебные утилиты. При сопровождении такой конфигурации поиск нужной функции начинают с глобального модуля — через меню конфигуратора «Правка — Найти» по тексту модуля.
Чем заменён глобальный модуль в 1С 8.x
В платформе 1С 8.x отдельного глобального модуля нет. Вместо него используются общие модули (ветка «Общие — Общие модули» в дереве конфигурации). У каждого общего модуля есть набор свойств, определяющих его поведение: Сервер, Вызов сервера, Клиент, Глобальный, Привилегированный режим.
Именно флажок «Глобальный» делает общий модуль аналогом глобального модуля 7.7: его экспортные процедуры и функции попадают в глобальный контекст и вызываются без имени модуля. Если флажок снят (стандартный вариант в типовых конфигурациях), вызов идёт через имя модуля: ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Организация").
Подходы к общему коду
Вызов без префикса, короткий код. Риск конфликта имён, нельзя использовать на клиенте и сервере одновременно в тонком клиенте без ограничений, усложняет чтение кода.
Стандарт типовых конфигураций 8.x. Явный вызов Модуль.Функция() — понятно, где лежит код, нет конфликтов имён. Код чуть длиннее.
Приём БСП: типовая логика вызывает процедуру из модуля с постфиксом Переопределяемый, куда внедренец вписывает свой код, не меняя типовой модуль.
Типовые конфигурации на базе Библиотеки стандартных подсистем практически не используют глобальные общие модули. Исключение — модуль СтандартныеПодсистемыГлобальный и аналогичные с постфиксом «Глобальный», которые нужны для обработчиков ожидания и событий, требующих глобального контекста. Это осознанное архитектурное решение платформы, а не приглашение размещать там прикладной код.
Как найти и прочитать глобальный модуль
Задача «найти, где объявлена эта функция» — самая частая причина, по которой открывают глобальный модуль. Порядок действий зависит от версии платформы.
- 1Определите версию: 7.7 — ищите в конфигураторе ветку «Общие — Глобальный модуль»; 8.x — ветку «Общие — Общие модули».
- 2В 1С 8.x поставьте курсор на имя функции в коде и нажмите F12 — конфигуратор перейдёт к объявлению независимо от того, глобальный это контекст или именованный модуль.
- 3Если F12 не сработал, используйте глобальный поиск (Ctrl+Shift+F) по тексту «Функция ИмяФункции» с областью поиска «Вся конфигурация».
- 4В 7.7 откройте глобальный модуль и выполните поиск по имени функции (Ctrl+F) внутри модуля.
- 5Проверьте, не является ли функция методом платформы: откройте синтакс-помощник (Ctrl+Shift+F1) и найдите имя в разделе глобального контекста.
При чтении глобального модуля 7.7 полезно помнить: переменные модуля инициализируются при запуске системы, процедуры без Лок доступны везде, а порядок выполнения при старте определяется процедурой ПриНачалеРаботыСистемы. Если конфигурация «падает» при запуске с ошибкой в непонятной строке — почти наверняка проблема в глобальном модуле.
Когда стоит создавать глобальный общий модуль в 8.x
Прямая необходимость в глобальном общем модуле возникает редко. Обоснованные сценарии: обработчики ожидания, подключаемые через ПодключитьОбработчикОжидания("ИмяПроцедуры", ...) с глобальным именем; процедуры, вызываемые из строковых выражений; сопровождение кода, перенесённого с 7.7 методом прямой конвертации.
Куда поместить общий код
Если вы всё же создаёте глобальный общий модуль, соблюдайте правила: давайте всем экспортным методам уникальный префикс подсистемы, не объявляйте экспортных переменных без крайней нужды, документируйте назначение модуля в комментарии в его начале. Это снизит риск конфликтов при обновлении конфигурации.
Типичные проблемы и их диагностика
Большинство ошибок, связанных с глобальным контекстом, проявляются на этапе проверки конфигурации или при запуске. Характерные сообщения: «Процедура или функция с указанным именем уже определена», «Переменная не определена», «Метод объекта не обнаружен».
Для диагностики используйте полную проверку конфигурации: в конфигураторе 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 его заменяют общие модули, а глобальный контекст формируют модули с флажком «Глобальный». Используйте глобальные модули осознанно: уникальные префиксы имён, минимум глобальных переменных, резервная копия перед правками и проверка конфигурации после изменений.