Разработка и Конфигурация · 10 мин
Как сделать глобальную переменную в 1С
Как создать глобальную переменную в 1С: модуль приложения, общие модули, параметры сеанса. Примеры кода, ошибки, ограничения и проверка результата.
Глобальная переменная в 1С — это значение, доступное из любого места кода: из форм, модулей объектов, процедур и функций. В отличие от локальных переменных, объявленных внутри процедуры, глобальные живут в течение всего сеанса работы пользователя и теряют значение при закрытии программы.
В 1С нет единого ключевого слова «global» — глобальность достигается местом объявления переменной. Основные способы: объявление в модуле управляемого приложения (или обычного приложения), хранение значения в общем модуле через функцию, а также использование параметров сеанса. Каждый подход имеет свои ограничения по контексту, правам и производительности.
Ниже разобраны все рабочие варианты с примерами кода, типовыми ошибками и способами проверки результата. Примеры приведены для управляемого приложения (тонкий/веб-клиент), но большинство приёмов работает и в обычном приложении.
Как объявить глобальную переменную в модуле приложения
Самый прямой способ — объявить переменную в модуле управляемого приложения (в старых конфигурациях — модуль обычного приложения). Переменная, объявленная с ключевым словом Экспорт, становится видимой из любого клиентского контекста.
Откройте конфигуратор, в дереве метаданных найдите корень «Конфигурация», откройте контекстное меню и выберите «Открыть модуль управляемого приложения». В самом верху, до первой процедуры, добавьте объявление:
Перем ТекущийПользовательИмя Экспорт;
Перем СчетчикОпераций Экспорт;
Инициализировать значения удобно в обработчике ПриНачалеРаботыСистемы, который вызывается при старте сеанса:
Процедура ПриНачалеРаботыСистемы()
ТекущийПользовательИмя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
СчетчикОпераций = 0;
КонецПроцедуры
Обращаться к такой переменной из форм и других модулей нужно через имя модуля приложения, например МодульУправляемогоПриложения недоступен как объект напрямую — в клиентском коде переменные модуля приложения видны просто по имени, если клиентский контекст общий. В клиент-серверном режиме учитывайте: модуль приложения выполняется на клиенте, поэтому серверные данные нужно получать через вызовы серверных процедур.
Глобальная переменная через общий модуль
Более контролируемый способ — создать общий модуль и хранить значение в нём. Прямое объявление Перем ... Экспорт в общем модуле тоже работает, но лучшей практикой считается доступ через функцию: так проще отследить, кто читает и меняет значение, и легче добавить логику инициализации.
Создайте общий модуль (ветка «Общие» → «Общие модули»), например ГлобальныеПеременные. Установите нужные флаги: «Клиент (управляемое приложение)», «Сервер» — в зависимости от того, где нужна переменная. Если модуль серверный, а данные нужны на клиенте, включите «Вызов сервера».
Перем мКэшЗначений;
Функция ПолучитьЗначение(ИмяПеременной) Экспорт
Если мКэшЗначений = Неопределено Тогда
мКэшЗначений = Новый Соответствие;
КонецЕсли;
Возврат мКэшЗначений.Получить(ИмяПеременной);
КонецФункции
Процедура УстановитьЗначение(ИмяПеременной, Значение) Экспорт
Если мКэшЗначений = Неопределено Тогда
мКэшЗначений = Новый Соответствие;
КонецЕсли;
мКэшЗначений.Вставить(ИмяПеременной, Значение);
КонецПроцедуры
Обращение из любого места кода выглядит так: ГлобальныеПеременные.УстановитьЗначение("Курс", 90.5) и ГлобальныеПеременные.ПолучитьЗначение("Курс"). Такой подход удобен тем, что все глобальные значения собраны в одном месте и не засоряют пространство имён.
Учтите важное ограничение: у серверного общего модуля переменные не сохраняются между вызовами, потому что каждый вызов сервера может выполняться в новом контексте сеанса. Поэтому УстановитьЗначение на сервере имеет смысл только в рамках одного вызова. Для постоянного хранения на сервере используйте параметры сеанса или базу данных (константы, регистры сведений).
Параметры сеанса как серверная альтернатива
Если значение должно быть привязано к конкретному пользователю и доступно на сервере, правильный инструмент — параметры сеанса. Это объекты метаданных (ветка «Общие» → «Параметры сеанса»), значения которых уникальны для каждого сеанса и хранятся на сервере.
Создайте параметр сеанса, например ТекущееПодразделение, и задайте его тип. Значение устанавливается в модуле сеанса в обработчике УстановкаПараметровСеанса:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
ПараметрыСеанса.ТекущееПодразделение = Справочники.Подразделения.НайтиПоНаименованию("Основное");
КонецПроцедуры
Чтение доступно отовсюду, включая серверный код: ТекПодр = ПараметрыСеанса.ТекущееПодразделение;. Это единственный способ получить «глобальное» значение, одинаково работающее и на клиенте, и на сервере.
Сравнение вариантов
Быстро и просто, но только клиентский контекст; подходит для UI-настроек и счётчиков
Контролируемый доступ, работает там, где включены флаги модуля; на сервере не хранит состояние между вызовами
Доступны на клиенте и сервере, уникальны для каждого сеанса; требуют изменения конфигурации
Значение сохраняется между сеансами; медленнее, требует прав на запись
Частые ошибки при работе с глобальными переменными
Самая распространённая ошибка — обращение к переменной до её инициализации. Если ПриНачалеРаботыСистемы ещё не отработал или значение не присвоено, переменная содержит Неопределено, и попытка вызвать её метод или сравнить с типом приводит к ошибке выполнения.
Вторая типичная проблема — конфликт имён. Если в форме объявлена локальная переменная с тем же именем, что и глобальная, локальная перекрывает глобальную, и код читает не то значение. Используйте префиксы, например гл или м, чтобы имена не пересекались.
Третья ошибка — попытка читать клиентскую глобальную переменную из серверного кода. Серверный контекст физически не видит память клиента, поэтому компилятор выдаст «Переменная не определена». Переносите такие значения в параметры сеанса или передавайте аргументами в серверные вызовы.
Как проверить, что переменная работает
Быстрый способ проверки — отладчик. Поставьте точку останова в месте чтения переменной, запустите отладку (F5) и добавьте переменную в табло (Ctrl+Shift+W). Если значение отображается корректно — объявление и инициализация работают.
Второй способ — временный вывод сообщения: Сообщить("Значение: " + СчетчикОпераций);. Если в окне сообщений появилось ожидаемое значение, доступ к переменной есть. Ошибка «Переменная не определена» означает, что либо не хватает Экспорт, либо обращение идёт из несовместимого контекста (например, с сервера к клиентской переменной).
Как проверить результат
Ошибок нет, переменная распознаётся
«Переменная не определена» — нет Экспорт или неверный контекст
Отображается ожидаемое значение после инициализации
Неопределено — инициализация не выполнилась
Значение читается и изменяется
Ошибка выполнения при обращении
Когда глобальную переменную лучше не использовать
Глобальные переменные усложняют сопровождение: непонятно, кто и когда меняет значение, а ошибки воспроизводятся только в определённой последовательности действий. Если значение используется в двух-трёх местах, надёжнее передать его параметром процедуры.
Для данных, которые должны переживать перезапуск программы, глобальные переменные не подходят в принципе — используйте константы, регистры сведений или хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить / Загрузить). Для больших структур данных, например кэша справочников, глобальная переменная увеличивает потребление памяти каждого сеанса, что в клиент-серверном режиме заметно при большом числе пользователей.
Что важно запомнить
Глобальную переменную создают через «Перем Имя Экспорт» в модуле приложения, через общий модуль с функциями доступа или через параметры сеанса для серверного доступа. Инициализируйте значения при старте, избегайте конфликтов имён и не храните чувствительные и большие данные в памяти сеанса.
Частые вопросы
Видна ли глобальная переменная другим пользователям базы?
Нет. Переменные модуля приложения и общих модулей существуют только в памяти конкретного сеанса. Каждый пользователь работает со своим экземпляром значений. Для обмена данными между пользователями нужны объекты базы данных — константы, регистры сведений.
Можно ли сделать глобальную переменную без изменения конфигурации?
Частично. Внешние обработки могут хранить значения в собственных модулях, но видимость ограничена этой обработкой. Полноценные параметры сеанса и общие модули требуют доработки конфигурации. Альтернатива без изменения метаданных — хранилище общих настроек, но оно работает через сохранение/загрузку, а не как переменная в памяти.
Что происходит с глобальной переменной при перезапуске программы?
Значение теряется. При новом запуске переменные инициализируются заново — как правило, в обработчике ПриНачалеРаботыСистемы. Если нужно восстановить прежнее значение, сохраняйте его в хранилище настроек или в базе данных при завершении работы.
Чем параметр сеанса лучше переменной в общем модуле?
Параметр сеанса доступен и на клиенте, и на сервере, а его значение гарантированно уникально для каждого сеанса и контролируется платформой. Серверный общий модуль не сохраняет переменные между вызовами, поэтому для серверного кода параметры сеанса — единственный надёжный способ хранить «глобальное» состояние без обращения к базе.
Влияют ли глобальные переменные на производительность?
Сами по себе — незначительно. Проблемы возникают, когда в них хранят большие таблицы значений или результаты запросов: память расходуется в каждом сеансе, а в клиент-серверном режиме передача таких данных между клиентом и сервером создаёт лишний трафик. Кэшируйте только действительно часто используемые небольшие данные.