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

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

Глобальная переменная в 1С: как объявить и обратиться к ней

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

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

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

Какие механизмы заменяют глобальные переменные в 1С

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

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

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

Экспортная переменная общего модуля

Подходит для значений, общих на весь сеанс пользователя. Обращение: ИмяМодуля.ИмяПеременной. Сбрасывается при перезапуске сеанса.

Переменная модуля приложения

Доступна из любого клиентского модуля просто по имени. Работает только в клиентском контексте, на сервере недоступна.

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

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

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

Единственный способ сохранить значение между сеансами и сделать его общим для всех пользователей. Требует записи в базу.

Обращение к экспортной переменной общего модуля

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

Пример объявления и обращения:

// Общий модуль "ГлобальныеПеременные"

Перем ТекущаяОрганизация Экспорт;

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

// Обращение из любого другого модуля

ГлобальныеПеременные.ТекущаяОрганизация = Справочники.Организации.НайтиПоКоду("000000001");

Сообщить(ГлобальныеПеременные.ТекущаяОрганизация);

ГлобальныеПеременные.СчетчикОпераций = ГлобальныеПеременные.СчетчикОпераций + 1;

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

Обращение к переменной модуля приложения

Переменные, объявленные с Экспорт в модуле управляемого приложения, доступны из любого клиентского модуля просто по имени, без указания модуля-владельца. Это ближайший аналог «классической» глобальной переменной. Объявление делается в начале модуля приложения: Перем гТекущийПользователь Экспорт;, а обращение из формы или общего модуля — напрямую: гТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();.

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

В обычном приложении (устаревший режим) действует то же правило: переменные модуля обычного приложения видны глобально, но только в клиентском контексте толстого клиента.

Обращение к параметрам сеанса

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

Инициализация значения обычно выполняется в модуле сеанса в обработчике УстановкаПараметровСеанса. Если обратиться к параметру, которому не присвоено значение, платформа автоматически вызовет этот обработчик. Пример обращения и присваивания:

// Чтение

ТекущееПодразделение = ПараметрыСеанса.ТекущееПодразделение;

// Запись

ПараметрыСеанса.ТекущееПодразделение = НовоеПодразделение;

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

Порядок создания параметра сеанса
  1. 1
    Откройте конфигуратор, ветка «Общие» → «Параметры сеанса», добавьте новый параметр и задайте имя и тип.
  2. 2
    В модуле сеанса в обработчике УстановкаПараметровСеанса присвойте начальное значение.
  3. 3
    Обращайтесь в коде через ПараметрыСеанса.ИмяПараметра для чтения и записи.
  4. 4
    Обновите конфигурацию базы данных и проверьте работу в режиме предприятия.

Когда переменная не подходит: константы и регистры сведений

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

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

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

Самая частая проблема — ошибка «Переменная не определена» при обращении. Причины: переменная объявлена без ключевого слова Экспорт, имя общего модуля указано с опечаткой, либо обращение к переменной модуля приложения выполняется из серверного контекста. Проверяйте точное имя модуля и признак «Экспорт» в объявлении.

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

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

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

После внедрения проверьте обращение в отладчике: поставьте точку останова на строку чтения переменной и посмотрите значение в табло. Для параметров сеанса убедитесь, что обработчик УстановкаПараметровСеанса отрабатывает при старте — иначе параметр останется неопределённым.

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

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

Чтение переменной из другого модуля
Норма

Значение возвращается без ошибки компиляции

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

Сообщение «Переменная не определена» — проверьте Экспорт и имя модуля

Сохранность значения между вызовами в одном сеансе
Норма

Значение, присвоенное ранее, читается корректно

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

Значение пустое — проверьте контекст исполнения и время жизни

Работа параметра сеанса на сервере и клиенте
Норма

Одинаковое значение в обоих контекстах

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

Разные значения или ошибка типа при присваивании

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

Итог

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

Глобальная переменная в 1С — это экспортная переменная общего модуля (обращение ИмяМодуля.Имя), переменная модуля приложения (обращение по имени, только клиент) или параметр сеанса (ПараметрыСеанса.Имя, клиент и сервер). Все они живут только в рамках сеанса; для постоянного хранения используйте константы и регистры сведений.

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

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

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

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

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

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

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

Сохранится ли значение переменной после перезапуска 1С?

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

Чем параметр сеанса лучше экспортной переменной общего модуля?

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

Что делать при ошибке «Переменная не определена»?

Проверьте три вещи: наличие ключевого слова Экспорт в объявлении, точное имя общего модуля при обращении и контекст исполнения — не вызывается ли клиентская переменная из серверного кода.