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

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

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

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

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

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

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

Какие способы объявления общей переменной существуют

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

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

Сравнение способов хранения общих значений

Модуль приложения + Экспорт

Подходит для глобальных флагов клиентского сеанса. Ограничение: значение теряется при перезапуске клиента.

Общий модуль + Экспорт

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

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

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

Константы и регистры

Подходят для постоянного хранения. Ограничение: требуется запись в базу данных, медленнее обращения в памяти.

Объявление переменной в модуле приложения

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

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

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

После этого обращаться к переменной можно напрямую по имени из любого клиентского модуля: формы документа, общей формы, команды. Например, СчетчикОпераций = СчетчикОпераций + 1;. Инициализировать начальные значения удобно в обработчике ПриНачалеРаботыСистемы того же модуля приложения.

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

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

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

Общие модули как контейнер переменных

Общий модуль — предпочтительное место для переменных, относящихся к конкретной подсистеме. Создайте общий модуль в ветке «Общие → Общие модули», например РаботаСНастройками, и объявите в нём переменную с Экспорт:

Перем ТекущаяНастройкаОтбора Экспорт;

Обращение извне выполняется через имя модуля: РаботаСНастройками.ТекущаяНастройкаОтбора = Новый СписокЗначений;. Такой подход явно показывает, где живёт переменная, и упрощает поиск по конфигурации.

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

Параметры сеанса для данных пользователя

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

Инициализация выполняется в модуле сеанса в обработчике УстановкаПараметровСеанса. Здесь параметру присваивается значение, например подразделение текущего пользователя из справочника. После установки обращение из любого кода выглядит так: ПараметрыСеанса.ТекущееПодразделение.

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

Порядок создания параметра сеанса
  1. 1
    Откройте в конфигураторе ветку Общие → Параметры сеанса и добавьте новый параметр
  2. 2
    Укажите имя и тип параметра, например ссылку на справочник
  3. 3
    В модуле сеанса в обработчике УстановкаПараметровСеанса присвойте параметру значение
  4. 4
    Обращайтесь к значению через ПараметрыСеанса.ИмяПараметра
  5. 5
    Проверьте работу, запустив сеанс под нужным пользователем

Хранение значений между сеансами

Если значение должно переживать перезапуск программы, переменные не подходят в принципе — нужна запись в базу данных. Для одиночных значений используйте константу: создайте константу в дереве конфигурации, а в коде работайте через Константы.ИмяКонстанты.Получить() и Константы.ИмяКонстанты.Установить(Значение).

Для значений, зависящих от измерений (пользователь, организация, дата), подходит регистр сведений. Для пользовательских настроек интерфейса и мелких параметров существует хранилище общих настроек: ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить(). Этот механизм не требует изменения конфигурации и работает в режиме предприятия.

Проверка результата и типичные ошибки

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

Самые частые проблемы связаны не с синтаксисом, а с контекстом выполнения. Переменная объявлена в клиентском модуле, а обращение идёт с сервера — значение недоступно. Переменная объявлена без Экспорт — внешний код её не видит. Значение присвоено в одном сеансе, а проверяется в другом — переменные модуля для каждого сеанса свои.

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

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

Синтаксис модуля
Норма

Проверка конфигурации проходит без ошибок по переменной

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

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

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

Значение читается и изменяется из другого модуля

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

Значение видно только внутри модуля объявления

Контекст выполнения
Норма

Переменная используется только там, где живёт её контекст (клиент/сервер)

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

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

Сохранность значения
Норма

Значение живёт ровно столько, сколько нужно задаче

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

Значение пропадает при перезапуске, хотя должно храниться постоянно

FAQ

Чем переменная с Экспорт отличается от обычной переменной модуля?

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

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

Одной переменной модуля это сделать нельзя: клиент и сервер — разные контексты выполнения. Используйте параметры сеанса, которые доступны в обоих контекстах, либо передавайте значение параметром в серверную процедуру.

Где объявить переменную, доступную только внутри одной формы?

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

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

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

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

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

Сколько глобальных переменных допустимо в конфигурации?

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

Итог

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

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