Разработка и Конфигурация · 11 мин
Как задать глобальную переменную в 1С
Как объявить глобальную переменную в 1С через Экспорт в модуле приложения, чем заменить глобальные переменные в управляемых формах и какие ошибки чаще всего мешают работе кода.
Глобальная переменная в 1С — это переменная, которая объявлена с ключевым словом «Экспорт» в модуле приложения (в обычном приложении — в модуле обычного приложения) и доступна из любого модуля конфигурации по своему имени. Платформа подставляет её в контекст исполнения автоматически, поэтому обращаться к ней можно без указания модуля-владельца.
На практике глобальные переменные применяют редко и осторожно: они хранят значение только в рамках сеанса пользователя, не переживают перезапуск программы и усложняют отладку, потому что изменить их может код из любого места конфигурации. Для большинства задач существуют более управляемые альтернативы — параметры сеанса, общие модули с функциями, кэширование через повторное использование возвращаемых значений.
Ниже разобраны синтаксис объявления, отличия для обычного и управляемого приложений, типовые сценарии использования, ограничения платформы и способы проверить, что переменная действительно работает.
Где именно объявляется глобальная переменная
Место объявления зависит от режима запуска конфигурации. В управляемом приложении глобальные переменные размещают в модуле управляемого приложения (в дереве конфигурации: «Конфигурация» → «Модуль управляемого приложения»). В обычном приложении — в модуле обычного приложения. Если конфигурация поддерживает оба режима, объявление придётся продублировать или вынести логику в общий модуль.
Объявление выглядит так:
Перем ТекущийПользовательИБ Экспорт;
Перем НастройкиОбмена Экспорт;
Ключевое слово «Экспорт» обязательно: без него переменная останется локальной для модуля приложения и из других модулей будет недоступна. Объявления размещают в разделе описания переменных — до первой процедуры или функции модуля.
Инициализация: когда присваивать значение
Объявление само по себе не задаёт значение — до первого присваивания переменная содержит «Неопределено». Присваивание обычно выполняют в обработчике ПриНачалеРаботыСистемы() модуля приложения или при первом обращении через функцию-обёртку.
Процедура ПриНачалеРаботыСистемы()
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
КонецПроцедуры
Важно понимать ограничение: в ПриНачалеРаботыСистемы недоступен серверный вызов напрямую из клиентского контекста без вызова серверной процедуры общего модуля, а на тонком и веб-клиенте часть объектов (например, запросы) недоступна. Если для инициализации нужны данные из базы, вызывайте серверную функцию общего модуля и присваивайте результат.
- 1Откройте модуль управляемого (или обычного) приложения в конфигураторе
- 2В разделе переменных добавьте строку: Перем ИмяПеременной Экспорт;
- 3В обработчике ПриНачалеРаботыСистемы присвойте начальное значение, при необходимости через вызов серверного общего модуля
- 4Обновите конфигурацию базы данных (F7) и перезапустите сеанс
- 5Проверьте доступность переменной из любого модуля, например через Сообщить(ИмяПеременной)
Отличия для управляемого и обычного приложений
В обычном приложении глобальные переменные работают предсказуемо: один клиентский процесс, единый контекст, переменная доступна везде после старта. В управляемом приложении есть нюансы, связанные с разделением клиента и сервера.
| Критерий | Обычное приложение | Управляемое приложение |
|---|---|---|
| Место объявления | Модуль обычного приложения | Модуль управляемого приложения |
| Доступность на сервере | Код исполняется в одном процессе | Переменная живёт на клиенте; серверные процедуры её не видят |
| Тонкий/веб-клиент | Не применимо | Доступна, но только клиентские типы значений |
| Типовая замена | Редко требуется | Параметры сеанса, общие модули, реквизиты формы |
Ключевой момент: глобальная переменная существует в контексте клиентского сеанса. Серверная процедура общего модуля, вызванная с клиента, её не увидит — значение нужно передавать параметром. Это частая причина ошибок вида «Переменная не определена» в управляемых конфигурациях.
Чем заменить глобальную переменную
Платформа предлагает несколько механизмов, которые закрывают те же задачи без недостатков глобальных переменных.
Параметры сеанса
Параметры сеанса — типизированные значения, привязанные к сеансу пользователя и доступные на сервере, в том числе в запросах и ограничениях доступа к данным (RLS). Задаются в обработчике УстановкаПараметровСеанса модуля сеанса. Это лучший вариант для значений вроде текущего пользователя, подразделения или склада.
Общий модуль с функцией
Если значение вычисляемое, надёжнее написать функцию в общем модуле с признаком «Сервер» и «Повторное использование возвращаемых значений». Платформа закэширует результат на время сеанса или вызова — поведение близко к глобальной переменной, но с гарантированной инициализацией и доступностью на сервере.
Реквизиты и параметры формы
Для передачи данных между формами глобальная переменная не нужна вовсе: используйте параметры формы при открытии и реквизиты формы для хранения состояния. Это изолирует данные и упрощает сопровождение.
Сравнение вариантов
Быстрое решение для клиентского состояния; не видна на сервере, легко создать скрытые зависимости
Доступен на сервере и в запросах, инициализируется платформой; требует объявления в конфигураторе
Контролируемая инициализация и серверная доступность; чуть больше кода
Значение хранится между сеансами и общее для базы; избыточно для временных данных
Типичные ошибки и их признаки
Большинство проблем с глобальными переменными сводится к нескольким повторяющимся сценариям.
- Пропущено слово «Экспорт». Переменная объявлена, но из других модулей выдаёт ошибку «Переменная не определена». Проверьте объявление в модуле приложения.
- Обращение до инициализации. Переменная равна «Неопределено», потому что код формы выполняется раньше присваивания или сеанс стартовал с ошибкой в обработчике. Добавьте проверку на «Неопределено» или инициализируйте лениво — при первом обращении.
- Чтение на сервере. В серверной процедуре переменная недоступна. Передавайте значение параметром процедуры.
- Конфликт имён. Имя переменной совпадает с именем метода глобального контекста или переменной другого модуля — поведение становится неочевидным. Используйте префиксы, например «глТекущийСклад».
- Обновление конфигурации без перезапуска сеанса. Старый сеанс продолжает работать со старым контекстом; после изменения объявлений перезапустите клиентское приложение.
Как проверить, что переменная работает
Самый быстрый способ — вывести значение из произвольного места конфигурации, например из обработчика команды формы:
Сообщить("Значение: " + Строка(ТекущийПользовательИБ));
Если сообщение выводит ожидаемое значение, объявление и инициализация корректны. Если появляется ошибка «Переменная не определена» — проблема в объявлении или в том, что модуль приложения не перекомпилирован: обновите конфигурацию базы данных и перезапустите сеанс.
В отладчике глобальную переменную видно в табло при остановке в любом клиентском модуле. Дополнительно полезно поставить точку останова на строке присваивания в ПриНачалеРаботыСистемы — так вы убедитесь, что инициализация вообще выполняется.
Как проверить результат
Сообщить(ИмяПеременной) выводит значение без ошибок
Ошибка «Переменная не определена»
В отладчике точка останова в ПриНачалеРаботыСистемы срабатывает и присваивает значение
Обработчик не выполняется или завершается с исключением
Переменная содержит ожидаемый тип и данные
Значение «Неопределено» в момент обращения
Когда глобальная переменная оправдана
Оправданные сценарии немногочисленны: временное клиентское состояние, которое не нужно на сервере (например, признак открытого модального диалога, кэш интерфейсных настроек), поддержка старого кода в обычном приложении, быстрое прототипирование. В новых разработках под управляемое приложение сначала рассматривайте параметры сеанса и общие модули — они предсказуемее при росте конфигурации.
Признак того, что глобальных переменных стало слишком много: изменение одной из них неожиданно влияет на далёкие участки кода, а поиск места присваивания требует полнотекстового поиска по всей конфигурации. Это сигнал к рефакторингу в сторону явных параметров и функций.
Что важно запомнить
Глобальная переменная объявляется через «Перем Имя Экспорт» в модуле приложения и живёт только в клиентском сеансе. Для серверного доступа, запросов и хранения между сеансами используйте параметры сеанса, общие модули и константы. После изменения объявлений обновляйте конфигурацию базы данных и перезапускайте сеанс.
Частые вопросы
Можно ли объявить глобальную переменную в общем модуле?
Нет. Переменные общего модуля, даже экспортные, не попадают в глобальный контекст — к ним обращаются через имя модуля (ИмяМодуля.ИмяПеременной). Глобальной переменную делает только объявление с «Экспорт» в модуле приложения.
Почему глобальная переменная пустая в начале работы формы?
Форма может открываться до завершения инициализации, либо присваивание завершилось ошибкой. Проверьте обработчик ПриНачалеРаботыСистемы в отладчике и добавьте защиту: если переменная «Неопределено» — инициализировать заново через функцию общего модуля.
Видна ли глобальная переменная в фоновом задании?
Нет. Фоновое задание выполняется в отдельном сеансе на сервере, клиентский контекст ему недоступен. Нужные значения передавайте через параметры метода Выполнить или читайте внутри задания из базы.
Чем параметр сеанса лучше глобальной переменной?
Параметр сеанса доступен на сервере, участвует в запросах и механизме ограничения доступа к данным, а платформа контролирует его установку. Глобальная переменная существует только на клиенте и может быть изменена из любого модуля без контроля.
Как сохранить значение между сеансами?
Глобальная переменная для этого не подходит. Используйте константу (одно значение на базу), регистр сведений (значения по измерениям) или хранилище общих настроек для пользовательских настроек интерфейса.
После добавления переменной конфигуратор не ругается, а клиент выдаёт ошибку. Что делать?
Обновите конфигурацию базы данных (клавиша F7) и полностью перезапустите клиентское приложение. Работающий сеанс использует старую скомпилированную версию модулей и не видит новых объявлений.