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