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