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