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

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

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

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

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

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

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

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

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

В тексте модуля переменная объявляется так:

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

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

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

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

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

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

Способ 2. Параметры сеанса для данных пользователя

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

Добавьте параметр, укажите тип (например, СправочникСсылка.Организации) и задайте начальное значение в модуле сеанса в обработчике УстановкаПараметровСеанса:

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

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

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

Обращение из любого места кода выполняется через ПараметрыСеанса.ИмяПараметра. Значения разных пользователей изолированы друг от друга — один пользователь не перезапишет настройку другого. Это главное преимущество перед экспортными переменными общего модуля.

Способ 3. Константы для постоянного хранения

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

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

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

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

Быстрый доступ, живёт в сеансе. Не сохраняется после перезапуска, не изолирована между пользователями.

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

Индивидуально для каждого пользователя, инициализируется при входе. Только простые типы и ссылки, живёт в рамках сеанса.

Константа

Сохраняется между сеансами, общая для базы. Каждое изменение — запись в БД, не подходит для частых обновлений.

Глобальный контекст и переменные модуля приложения

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

// В модуле управляемого приложения

Перем ГлобальныйСтатус Экспорт;

// В любой клиентской форме

ГлобальныйСтатус = "Готово";

Это удобно для клиентских флагов интерфейса, но у способа есть ограничение: такие переменные существуют только на клиенте и недоступны в серверном коде. Для серверной логики используйте общие модули с флагами «Сервер» или «Клиент и сервер».

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

Проверка результата и типичные ошибки

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

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

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

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

Когда какой способ выбрать

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

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

Итог

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

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

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

Почему переменная общего модуля не видна из формы?

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

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

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

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

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

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

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

Можно ли хранить в параметре сеанса таблицу значений?

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