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

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

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

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

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

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

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

Где объявляется глобальная переменная

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

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

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

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

Пошаговое создание глобальной переменной

Процедура занимает несколько минут и не требует изменения структуры метаданных, только правку кода.

Порядок действий
  1. 1
    Откройте конфигуратор и разблокируйте конфигурацию для изменений (поддержка → снять замок у корня конфигурации).
  2. 2
    В дереве конфигурации щёлкните правой кнопкой по корневому узлу и откройте модуль управляемого приложения.
  3. 3
    В начале модуля добавьте строку: Перем МояГлобальнаяПеременная Экспорт;
  4. 4
    При необходимости задайте начальное значение в обработчике ПередНачаломРаботыСистемы или ПриНачалеРаботыСистемы.
  5. 5
    Обновите конфигурацию базы данных (F7) и запустите сеанс.
  6. 6
    В любом другом модуле обратитесь к переменной по имени и проверьте, что значение читается и записывается.

Пример инициализации в обработчике запуска:

Перем ТекущийКоэффициент Экспорт;

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

ТекущийКоэффициент = 1.5;

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

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

bsl
Перем МояГлобальнаяПеременная Экспорт; // в модуле управляемого приложения

Ограничения в управляемом приложении

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

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

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

Альтернативы глобальным переменным

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

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

Экспортная переменная модуля приложения

Подходит для клиентского кэша и настроек на время сеанса. Ограничение: не видна на сервере, теряется при перезапуске.

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

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

Общий модуль с повторным использованием

Подходит для кэширования вычисляемых значений на сервере. Возвращаемые значения кэшируются на время сеанса или вызова.

Константа или хранилище настроек

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

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

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

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

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

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

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

Кэш в общем модуле

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

Проверка результата

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

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

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

Компиляция модулей
Норма

Конфигурация обновляется без ошибок, обращение к переменной из других модулей не вызывает «Переменная не определена»

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

Ошибка компиляции при обновлении или в момент обращения — значит, переменная объявлена без Экспорт или не в том модуле

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

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

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

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

Доступность на сервере
Норма

Серверный код получает значение через параметры сеанса или явные параметры процедур

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

Серверная процедура пытается читать клиентскую переменную напрямую — ошибка компиляции

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

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

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

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

Как выбрать подходящий механизм

Короткий маршрут выбора помогает не ошибиться до начала доработки.

Маршрут решения

Как выбрать действие

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

FAQ

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

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

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

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

Чем глобальная переменная отличается от параметра сеанса?

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

Почему возникает ошибка «Переменная не определена», хотя она объявлена?

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

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

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

Сколько глобальных переменных можно объявить?

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

Итог

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

Глобальная переменная в 1С — это экспортная переменная модуля приложения. Она доступна из любого клиентского кода, но не видна на сервере и обнуляется при перезапуске сеанса. Для серверного контекста используйте параметры сеанса, для кэша — общие модули с повторным использованием, для постоянных настроек — константы и хранилища настроек.