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

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

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

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

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

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

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

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

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

Объявление выглядит так:

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

Перем НастройкиОбмена Экспорт;

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

Инициализация: когда присваивать значение

Объявление само по себе не задаёт значение — до первого присваивания переменная содержит «Неопределено». Присваивание обычно выполняют в обработчике ПриНачалеРаботыСистемы() модуля приложения или при первом обращении через функцию-обёртку.

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

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

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

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

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

Отличия для управляемого и обычного приложений

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

КритерийОбычное приложениеУправляемое приложение
Место объявленияМодуль обычного приложенияМодуль управляемого приложения
Доступность на сервереКод исполняется в одном процессеПеременная живёт на клиенте; серверные процедуры её не видят
Тонкий/веб-клиентНе применимоДоступна, но только клиентские типы значений
Типовая заменаРедко требуетсяПараметры сеанса, общие модули, реквизиты формы

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

Чем заменить глобальную переменную

Платформа предлагает несколько механизмов, которые закрывают те же задачи без недостатков глобальных переменных.

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

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

Общий модуль с функцией

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

Реквизиты и параметры формы

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

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

Глобальная переменная (Экспорт)

Быстрое решение для клиентского состояния; не видна на сервере, легко создать скрытые зависимости

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

Доступен на сервере и в запросах, инициализируется платформой; требует объявления в конфигураторе

Общий модуль с кэшированием

Контролируемая инициализация и серверная доступность; чуть больше кода

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

Значение хранится между сеансами и общее для базы; избыточно для временных данных

Типичные ошибки и их признаки

Большинство проблем с глобальными переменными сводится к нескольким повторяющимся сценариям.

  • Пропущено слово «Экспорт». Переменная объявлена, но из других модулей выдаёт ошибку «Переменная не определена». Проверьте объявление в модуле приложения.
  • Обращение до инициализации. Переменная равна «Неопределено», потому что код формы выполняется раньше присваивания или сеанс стартовал с ошибкой в обработчике. Добавьте проверку на «Неопределено» или инициализируйте лениво — при первом обращении.
  • Чтение на сервере. В серверной процедуре переменная недоступна. Передавайте значение параметром процедуры.
  • Конфликт имён. Имя переменной совпадает с именем метода глобального контекста или переменной другого модуля — поведение становится неочевидным. Используйте префиксы, например «глТекущийСклад».
  • Обновление конфигурации без перезапуска сеанса. Старый сеанс продолжает работать со старым контекстом; после изменения объявлений перезапустите клиентское приложение.
Типичные ошибки
01
Объявление без «Экспорт» — переменная невидима за пределами модуля приложения
02
Ожидание, что значение сохранится после перезапуска — глобальные переменные живут только в сеансе
03
Обращение к переменной из серверной процедуры — получение ошибки «Переменная не определена»
04
Использование глобальной переменной там, где нужен параметр сеанса, — невозможность применить значение в запросах и RLS

Как проверить, что переменная работает

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

Сообщить("Значение: " + Строка(ТекущийПользовательИБ));

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

В отладчике глобальную переменную видно в табло при остановке в любом клиентском модуле. Дополнительно полезно поставить точку останова на строке присваивания в ПриНачалеРаботыСистемы — так вы убедитесь, что инициализация вообще выполняется.

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

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

Доступность из другого модуля
Норма

Сообщить(ИмяПеременной) выводит значение без ошибок

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

Ошибка «Переменная не определена»

Инициализация при старте
Норма

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

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

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

Значение после присваивания
Норма

Переменная содержит ожидаемый тип и данные

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

Значение «Неопределено» в момент обращения

Когда глобальная переменная оправдана

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

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

Итог

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

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

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

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

Нет. Переменные общего модуля, даже экспортные, не попадают в глобальный контекст — к ним обращаются через имя модуля (ИмяМодуля.ИмяПеременной). Глобальной переменную делает только объявление с «Экспорт» в модуле приложения.

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

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

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

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

Чем параметр сеанса лучше глобальной переменной?

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

Как сохранить значение между сеансами?

Глобальная переменная для этого не подходит. Используйте константу (одно значение на базу), регистр сведений (значения по измерениям) или хранилище общих настроек для пользовательских настроек интерфейса.

После добавления переменной конфигуратор не ругается, а клиент выдаёт ошибку. Что делать?

Обновите конфигурацию базы данных (клавиша F7) и полностью перезапустите клиентское приложение. Работающий сеанс использует старую скомпилированную версию модулей и не видит новых объявлений.