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

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

Какие есть переменные в 1С: виды и особенности использования

Какие переменные есть в 1С: локальные, глобальные, переменные модуля и формы. Объявление, области видимости, типы данных и типичные ошибки с примерами кода.

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

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

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

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

Переменная создаётся в момент первого присваивания ей значения или явного объявления через ключевое слово Перем. Явное объявление считается хорошим тоном: оно делает код читаемым и позволяет контролировать состав переменных процедуры.

bsl
Перем СуммаДокумента; // объявление
СуммаДокумента = 1250.50;   // Число
Наименование = "Товар А";   // Строка
ДатаОтгрузки = '20260115';   // Дата
Контрагент = Справочники.Контрагенты.НайтиПоКоду("00001"); // Ссылка
Признак = Истина;            // Булево

Основные типы значений, которые хранят переменные: Число, Строка, Булево, Дата, ссылки на объекты (справочники, документы, перечисления), коллекции (Массив, Структура, Соответствие, СписокЗначений, ТаблицаЗначений) и специальные значения Неопределено и Null.

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

Локальные переменные: внутри процедур и функций

Локальная переменная объявляется внутри процедуры или функции и существует только во время её выполнения. После завершения процедуры значение теряется. Такие переменные используются для промежуточных вычислений и не видны извне.

bsl
Функция РассчитатьСкидку(Сумма)
	Перем Процент;
	Если Сумма > 100000 Тогда
		Процент = 10;
	Иначе
		Процент = 5;
	КонецЕсли;
	Возврат Сумма * Процент / 100;
КонецФункции

Имена локальных переменных не должны совпадать с именами параметров процедуры и переменных модуля — иначе локальная переменная «перекроет» внешнюю, и код будет работать не так, как ожидалось. Платформа в таких случаях может выдать предупреждение при проверке модуля.

Переменные модуля и глобальные переменные

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

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

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

Переменные формы: реквизиты и переменные модуля формы

В управляемых формах данные, которые должны отображаться и передаваться между клиентом и сервером, хранятся в реквизитах формы — они создаются в конфигураторе или программно. Реквизиты сериализуются при серверных вызовах, поэтому в них нельзя хранить несериализуемые объекты, например ТабличныйДокумент или COM-объекты.

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

Типичные ошибки с переменными формы
01
Хранение данных в переменной модуля формы вместо реквизита — значение теряется при серверном вызове
02
Попытка поместить в реквизит формы несериализуемый объект — ошибка при передаче на сервер
03
Обращение к реквизиту объекта через форму без проверки заполненности — обращение к пустой ссылке

Параметры сеанса как разновидность глобального хранилища

Параметры сеанса — это объекты метаданных, значения которых устанавливаются при начале сеанса и доступны из любого кода в течение всего сеанса пользователя. Типичное применение — текущий пользователь, настройки ответственного, ограничения доступа на уровне записей (RLS).

Значение параметра сеанса устанавливается обычно в модуле сеанса через ПараметрыСеанса.ИмяПараметра = Значение;. Учитывайте: значение вычисляется один раз при старте сеанса (или при первом обращении), и изменение справочных данных в ходе сеанса не обновит его автоматически.

Где хранить значение

Локальная переменная

Промежуточные вычисления внутри одной процедуры; не нужна нигде снаружи

Переменная модуля

Значение нужно нескольким процедурам одного модуля; не требуется передача между клиентом и сервером

Реквизит формы

Данные отображаются на форме или нужны и на клиенте, и на сервере

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

Значение постоянно в рамках сеанса и нужно в разных объектах конфигурации

Правила именования и проверка кода

Имя переменной может содержать буквы (русские и латинские), цифры и знак подчёркивания, но не может начинаться с цифры. Принятые в сообществе соглашения: имена с большой буквы, осмысленные, без сокращений вроде А или Х1. Для коллекций принято использовать множественное число: МассивСтрок, ТаблицаТоваров.

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

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

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

Проверка модуля в конфигураторе
Норма

Нет ошибок вида «Переменная не определена»

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

Ошибки компиляции модуля при проверке

Повторный вызов процедуры
Норма

Результат одинаков при одинаковых входных данных

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

Результат зависит от предыдущего вызова — утечка состояния через переменную модуля

Работа формы с серверными вызовами
Норма

Данные не пропадают после серверных процедур

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

Значения обнуляются — данные хранятся не в реквизитах формы

Часто задаваемые вопросы

Чем отличаются Перем и реквизит формы?

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

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

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

Что будет, если использовать переменную без объявления?

Если переменной присваивается значение, она создаётся неявно. Но если попытаться прочитать необъявленную переменную, возникнет ошибка «Переменная не определена». Явное объявление через Перем защищает от опечаток в именах.

Может ли переменная менять тип в процессе выполнения?

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

Что такое Неопределено и когда его проверять?

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

Сохраняются ли переменные между сеансами пользователя?

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