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

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

Как сделать глобальную переменную в 1С

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

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

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

Ниже разобраны все рабочие варианты с примерами кода, типовыми ошибками и способами проверки результата. Примеры приведены для управляемого приложения (тонкий/веб-клиент), но большинство приёмов работает и в обычном приложении.

Как объявить глобальную переменную в модуле приложения

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

Откройте конфигуратор, в дереве метаданных найдите корень «Конфигурация», откройте контекстное меню и выберите «Открыть модуль управляемого приложения». В самом верху, до первой процедуры, добавьте объявление:

Перем ТекущийПользовательИмя Экспорт;

Перем СчетчикОпераций Экспорт;

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

Процедура ПриНачалеРаботыСистемы()

ТекущийПользовательИмя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

СчетчикОпераций = 0;

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

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

Глобальная переменная через общий модуль

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

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

Перем мКэшЗначений;

Функция ПолучитьЗначение(ИмяПеременной) Экспорт

Если мКэшЗначений = Неопределено Тогда

мКэшЗначений = Новый Соответствие;

КонецЕсли;

Возврат мКэшЗначений.Получить(ИмяПеременной);

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

Процедура УстановитьЗначение(ИмяПеременной, Значение) Экспорт

Если мКэшЗначений = Неопределено Тогда

мКэшЗначений = Новый Соответствие;

КонецЕсли;

мКэшЗначений.Вставить(ИмяПеременной, Значение);

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

Обращение из любого места кода выглядит так: ГлобальныеПеременные.УстановитьЗначение("Курс", 90.5) и ГлобальныеПеременные.ПолучитьЗначение("Курс"). Такой подход удобен тем, что все глобальные значения собраны в одном месте и не засоряют пространство имён.

Учтите важное ограничение: у серверного общего модуля переменные не сохраняются между вызовами, потому что каждый вызов сервера может выполняться в новом контексте сеанса. Поэтому УстановитьЗначение на сервере имеет смысл только в рамках одного вызова. Для постоянного хранения на сервере используйте параметры сеанса или базу данных (константы, регистры сведений).

Параметры сеанса как серверная альтернатива

Если значение должно быть привязано к конкретному пользователю и доступно на сервере, правильный инструмент — параметры сеанса. Это объекты метаданных (ветка «Общие» → «Параметры сеанса»), значения которых уникальны для каждого сеанса и хранятся на сервере.

Создайте параметр сеанса, например ТекущееПодразделение, и задайте его тип. Значение устанавливается в модуле сеанса в обработчике УстановкаПараметровСеанса:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

ПараметрыСеанса.ТекущееПодразделение = Справочники.Подразделения.НайтиПоНаименованию("Основное");

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

Чтение доступно отовсюду, включая серверный код: ТекПодр = ПараметрыСеанса.ТекущееПодразделение;. Это единственный способ получить «глобальное» значение, одинаково работающее и на клиенте, и на сервере.

Сравнение вариантов

Модуль приложения + Перем Экспорт

Быстро и просто, но только клиентский контекст; подходит для UI-настроек и счётчиков

Общий модуль с функцией

Контролируемый доступ, работает там, где включены флаги модуля; на сервере не хранит состояние между вызовами

Параметры сеанса

Доступны на клиенте и сервере, уникальны для каждого сеанса; требуют изменения конфигурации

Константа / регистр сведений

Значение сохраняется между сеансами; медленнее, требует прав на запись

Частые ошибки при работе с глобальными переменными

Самая распространённая ошибка — обращение к переменной до её инициализации. Если ПриНачалеРаботыСистемы ещё не отработал или значение не присвоено, переменная содержит Неопределено, и попытка вызвать её метод или сравнить с типом приводит к ошибке выполнения.

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

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

Типичные ошибки
01
Объявление без Экспорт — переменная видна только внутри своего модуля
02
Чтение до инициализации — значение Неопределено и ошибка выполнения
03
Обращение к клиентской переменной с сервера — ошибка «Переменная не определена»
04
Одинаковые имена глобальной и локальной переменных — молчаливая подмена значения
05
Хранение больших таблиц в глобальных переменных — рост потребления памяти сеанса

Как проверить, что переменная работает

Быстрый способ проверки — отладчик. Поставьте точку останова в месте чтения переменной, запустите отладку (F5) и добавьте переменную в табло (Ctrl+Shift+W). Если значение отображается корректно — объявление и инициализация работают.

Второй способ — временный вывод сообщения: Сообщить("Значение: " + СчетчикОпераций);. Если в окне сообщений появилось ожидаемое значение, доступ к переменной есть. Ошибка «Переменная не определена» означает, что либо не хватает Экспорт, либо обращение идёт из несовместимого контекста (например, с сервера к клиентской переменной).

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

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

Компиляция модуля (Ctrl+F7)
Норма

Ошибок нет, переменная распознаётся

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

«Переменная не определена» — нет Экспорт или неверный контекст

Значение в отладчике
Норма

Отображается ожидаемое значение после инициализации

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

Неопределено — инициализация не выполнилась

Доступ из другого модуля
Норма

Значение читается и изменяется

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

Ошибка выполнения при обращении

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

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

Для данных, которые должны переживать перезапуск программы, глобальные переменные не подходят в принципе — используйте константы, регистры сведений или хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить / Загрузить). Для больших структур данных, например кэша справочников, глобальная переменная увеличивает потребление памяти каждого сеанса, что в клиент-серверном режиме заметно при большом числе пользователей.

Итог

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

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

Частые вопросы

Видна ли глобальная переменная другим пользователям базы?

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

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

Частично. Внешние обработки могут хранить значения в собственных модулях, но видимость ограничена этой обработкой. Полноценные параметры сеанса и общие модули требуют доработки конфигурации. Альтернатива без изменения метаданных — хранилище общих настроек, но оно работает через сохранение/загрузку, а не как переменная в памяти.

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

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

Чем параметр сеанса лучше переменной в общем модуле?

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

Влияют ли глобальные переменные на производительность?

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