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

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

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

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

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

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

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

Способ 1: экспортная переменная модуля приложения

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

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

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

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

После этого в любом клиентском модуле (форме, команде) можно напрямую обращаться к переменной: СчетчикОпераций = СчетчикОпераций + 1;. Значение живёт, пока открыт сеанс клиентского приложения, и сбрасывается при перезапуске.

Инициализация значения при старте

Объявленная переменная изначально имеет значение «Неопределено». Задавать начальное значение удобно в обработчике «ПриНачалеРаботыСистемы»:

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

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

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

Если инициализацию пропустить, первое обращение к переменной вернёт «Неопределено», и арифметические операции с ней вызовут ошибку преобразования типов.

Способ 2: экспортная переменная общего модуля

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

Перем ТекущийКурсОбмена Экспорт;

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

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

Способ 3: функция с повторным использованием значений

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

Функция ПолучитьТекущегоПользователя() Экспорт

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

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

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

Способ 4: параметры сеанса

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

Установка значения выполняется в модуле сеанса в обработчике «УстановкаПараметровСеанса»:

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

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

Справочники.Подразделения.НайтиПоКоду("001");

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

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

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

Сравнение способов: что выбрать под свою задачу

Единого «лучшего» варианта нет — выбор определяется контекстом исполнения и временем жизни значения. Сопоставление ключевых свойств приведено ниже.

СпособГде доступенВремя жизни значенияТипичное применение
Переменная модуля приложенияТолько клиентДо закрытия клиентаКлиентские счётчики, флаги интерфейса
Переменная общего модуляКлиент или серверДо конца вызова/сеанса клиентаВременные значения в рамках одного вызова
Функция с кэшемКлиент и серверВремя вызова или сеансаВычисляемые константы, настройки
Параметры сеансаПовсюду (через сервер)Весь сеанс, у каждого пользователя своёПодразделение, валюта, права пользователя

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

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

Подходит для клиентских флагов и счётчиков; не работает на сервере и теряется при перезапуске клиента.

Функция с повторным использованием

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

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

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

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

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

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

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

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

Значение читается и совпадает с установленным

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

Ошибка «Переменная не определена» — забыли Экспорт или неверное имя модуля

Работа после серверного вызова
Норма

Значение параметра сеанса сохраняется

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

Неопределено — значение хранилось в переменной серверного общего модуля

Повторный запуск сеанса
Норма

Инициализация выполняется автоматически

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

Неопределено при первом обращении — нет инициализации в ПриНачалеРаботыСистемы

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

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

Удобный приём — сгруппировать все «глобальные» значения в одном общем модуле с говорящим именем и обращаться к ним только через него. Это упрощает поиск мест использования и снижает риск случайной перезаписи.
ПЗ
Практическое замечание

FAQ: частые вопросы о глобальных переменных в 1С

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

Нет. Область видимости переменной определяется модулем, в котором она объявлена. Минимальное действие — открыть модуль приложения или общий модуль в конфигураторе и добавить объявление с «Экспорт». Обойти это программно нельзя.

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

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

Чем параметр сеанса лучше экспортной переменной?

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

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

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

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

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

Что делать, если при обращении возникает «Переменная не определена»?

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

Итог

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

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