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

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

Как объявить глобальную переменную в 1С

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

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

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

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

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

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

Перем ТекущийКурсВалюты Экспорт;

Перем СчетчикОпераций Экспорт;

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

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

Пошаговое объявление в модуле приложения

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

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

Пример инициализации при старте системы:

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

ТекущийКурсВалюты = ПолучитьКурсИзНастроек();

СчетчикОпераций = 0;

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

Использование в произвольном модуле формы или общем модуле:

СчетчикОпераций = СчетчикОпераций + 1;

Если СчетчикОпераций > 100 Тогда

Сообщить("Превышен лимит операций за сеанс");

КонецЕсли;

Глобальные переменные в общих модулях

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

// В общем модуле ГлобальныеПеременные

Перем КэшСправочников Экспорт;

// В любом другом модуле

ГлобальныеПеременные.КэшСправочников = Новый Соответствие;

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

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

Функция ПолучитьКэш() Экспорт

Если КэшСправочников = Неопределено Тогда

КэшСправочников = Новый Соответствие;

КонецЕсли;

Возврат КэшСправочников;

КонецФункции

Альтернативы: параметры сеанса, константы, хранилище настроек

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

МеханизмВремя жизниОбласть видимостиКогда применять
Переменная Экспорт в модулеДо конца сеансаОдин сеанс, клиент или серверВременные кэши, счётчики, состояние интерфейса
Параметры сеансаДо конца сеансаТекущий сеанс, клиент и серверТекущий пользователь, отборы RLS, настройки сеанса
КонстантыПостоянно, в базеВсе пользователиОбщие настройки: валюта, префикс, функциональные опции
Хранилище общих настроекПостоянно, в базеПо пользователю или общиеПользовательские настройки форм и отчётов

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

// Модуль сеанса

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

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

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

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

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

Значение нужно только в текущем сеансе и только на клиенте или только на сервереИспользуйте экспортную переменную в общем модуле
Значение должно быть доступно и на клиенте, и на сервере в рамках сеансаИспользуйте параметр сеанса
Значение должно сохраняться между сеансами для всех пользователейИспользуйте константу или регистр сведений
Значение индивидуально для каждого пользователя и должно помниться между запускамиИспользуйте ХранилищеОбщихНастроек

Ограничения и подводные камни

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

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

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

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

Убедиться, что переменная объявлена корректно, проще всего через отладчик. Поставьте точку останова в месте обращения к переменной, запустите отладку (F5) и посмотрите значение в табло (Shift+F9). Если переменная не видна, конфигуратор сообщит об этом ещё при проверке модуля.

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

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

Компиляция модуля (Ctrl+F7 в модуле)
Норма

Ошибок нет, переменная определена

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

Сообщение «Переменная не определена» — нет Экспорт или неверный контекст

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

Переменная содержит ожидаемое значение

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

Неопределено — переменная не инициализирована

Доступность из серверного кода
Норма

Серверный модуль читает переменную серверного общего модуля

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

Ошибка компиляции — переменная объявлена только на клиенте

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

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

Типичные ошибки при объявлении

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

Отдельно стоит упомянуть именование. Глобальные переменные видны отовсюду, поэтому короткие общие имена вроде Т или Данные рано или поздно конфликтуют с локальными переменными и затеняются ими. Используйте осмысленные имена с указанием назначения: КэшКурсовВалют, НастройкиТекущегоСеанса.

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

Итог

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

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

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

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

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

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

Серверный вызов выполняется в отдельном контексте. Клиентская переменная там не существует, а серверная создаётся заново. Передавайте значения через параметры процедуры или используйте параметры сеанса.

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

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

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

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

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

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

Как сбросить значение глобальной переменной?

Присвойте ей Неопределено или новое значение в нужной точке кода. Специальной команды сброса нет; если переменная хранит коллекцию, очистите её методом Очистить() или замените новой.