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