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

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

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

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

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

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

Объявление переменных — обязательная практика, хотя язык 1С формально допускает неявное создание переменной при первом присваивании. Явное объявление через Перем делает код читаемым, позволяет контролировать область видимости и защищает от опечаток в именах.

Базовый синтаксис оператора Перем

Оператор имеет простой формат: Перем, затем одно или несколько имён через запятую, в конце — точка с запятой. Допустимо объявить несколько переменных одной строкой: Перем Счетчик, Итог, Наименование;. Каждая переменная сразу доступна для присваивания значения.

Имена переменных могут содержать русские и латинские буквы, цифры и знак подчёркивания, но не должны начинаться с цифры. Регистр букв не имеет значения: Сумма и СУММА — одна и та же переменная. Имена не должны совпадать с ключевыми словами языка (Если, Функция, КонецЕсли и т. п.).

Пример минимального кода:

Перем Количество;

Процедура Рассчитать()

Количество = 10;

Сообщить("Количество: " + Количество);

КонецПроцедуры

Обратите внимание: объявление переменной не присваивает ей значение. До первого присваивания переменная содержит Неопределено. Попытка использовать её в арифметике без присваивания приведёт к ошибке преобразования типов.

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

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

Функция ВычислитьСкидку(Сумма)

Перем Процент, Результат;

Если Сумма > 10000 Тогда

Процент = 10;

Иначе

Процент = 5;

КонецЕсли;

Результат = Сумма * Процент / 100;

Возврат Результат;

КонецФункции

Локальные переменные — основной инструмент промежуточных вычислений. Используйте их для всего, что не нужно за пределами метода: счётчиков циклов, временных строк, промежуточных сумм. Это снижает риск случайного изменения данных из другого кода.

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

Глобальные переменные модуля и экспорт

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

Ключевое слово Экспорт после имени делает переменную доступной из других модулей конфигурации:

// Модуль общего назначения

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

Перем СчетчикОпераций; // доступна только внутри этого модуля

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

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

Типичные ошибки
01
Объявление переменной модуля ради одного расчёта — засоряет пространство имён и провоцирует конфликты; используйте локальные переменные
02
Ожидание, что переменная общего модуля сохранит значение между вызовами сервера, — храните такие данные в параметрах сеанса или регистрах
03
Использование переменной до присваивания — она равна Неопределено, и арифметика с ней вызовет ошибку
04
Опечатка в имени при неявном объявлении создаёт новую переменную вместо ошибки — всегда объявляйте переменные явно

Типы значений и присваивание

1С — язык с динамической типизацией: одна и та же переменная в разные моменты может хранить число, строку, дату, ссылку на объект или значение Неопределено. Тип проверяется в момент выполнения операции, поэтому ошибки типов выявляются не при сохранении модуля, а при работе кода.

Основные примитивные типы:

  • Число — Цена = 1250.50;, разделитель дробной части — точка;
  • Строка — Имя = "Контрагент";, кавычки внутри строки удваиваются;
  • Булево — Активен = Истина;;
  • Дата — ДатаДок = '20260115';, литерал даты в одинарных кавычках в формате ГГГГММДД;
  • Неопределено — признак отсутствия значения.

Для проверки типа значения используются функции ТипЗнч() и Тип():

Если ТипЗнч(Значение) = Тип("Число") Тогда

// безопасно выполнять арифметику

КонецЕсли;

Явное преобразование выполняют функции Число(), Строка(), Дата(). Они полезны при обработке данных из внешних источников, где тип значения заранее не гарантирован.

bsl
Перем Значение;
Значение = "123";
Если ТипЗнч(Значение) = Тип("Строка") Тогда
    Значение = Число(Значение);
КонецЕсли;

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

В управляемых формах есть важное ограничение: переменные модуля формы не сохраняются между серверными вызовами. Форма при каждом обращении к серверу может быть пересоздана, и значения переменных модуля обнулятся. Это частая причина «пропадающих» данных в управляемых приложениях.

Для хранения данных между вызовами используйте реквизиты формы. Они создаются в редакторе формы (панель «Реквизиты») и доступны в коде через обращение по имени: ЭтаФорма.ИмяРеквизита или просто по имени в модуле формы. Реквизиты с признаком «Ключевой» влияют на уникальность формы.

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

Маршрут решения

Где объявлять переменную

Значение нужно только внутри одной процедуры или функцииОбъявите локальную переменную через Перем внутри метода
Значение разделяют несколько методов одного модуляОбъявите переменную в разделе описания переменных модуля
Значение нужно другим модулям конфигурацииДобавьте Экспорт, но лучше рассмотрите функцию-геттер в общем модуле
Данные должны жить между серверными вызовами формыСоздайте реквизит формы вместо переменной модуля
Значение относится к сеансу пользователяИспользуйте параметры сеанса, а не переменные модулей

Именование и проверка кода

Единый стиль имён упрощает чтение конфигурации. Распространённая практика — именовать переменные существительными, отражающими содержимое: СуммаДокумента, ТаблицаТоваров, КоличествоСтрок. Избегайте однобуквенных имён вне коротких циклов и сокращений, понятных только автору.

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

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

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

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

Компиляция модуля
Норма

Модуль сохраняется без синтаксических ошибок

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

Сообщение «Переменная не определена» или ошибка ожидания символа «;»

Значение переменной в отладчике
Норма

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

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

Значение «Неопределено» в точке, где переменная уже должна быть заполнена

Проверка конфигурации
Норма

Нет предупреждений о неиспользуемых и необъявленных переменных

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

Предупреждения об обращении к необъявленным идентификаторам

Частые ошибки и их последствия

Ошибка «Переменная не определена» возникает при обращении к имени, которое не объявлено ни в текущем методе, ни в модуле. Причины: опечатка, объявление переменной в другой процедуре, пропущенный оператор Перем. Лечится проверкой области видимости и точного написания имени.

Ошибка преобразования значения к типу возникает, когда переменная содержит Неопределено или значение несовместимого типа. Типичный сценарий — присваивание внутри условия Если, которое не выполнилось. Защита — инициализировать переменные значением по умолчанию сразу после объявления: Итог = 0;.

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

Итог

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

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

Частые вопросы

Можно ли в 1С использовать переменную без объявления через Перем?

Технически да: при первом присваивании необъявленному имени переменная создаётся неявно. Однако это плохая практика — опечатка в имени создаст новую переменную вместо ошибки, а область видимости такой переменной неочевидна. Явное объявление через Перем считается стандартом разработки.

Чем переменная отличается от реквизита объекта?

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

Как объявить массив в 1С?

Массив — это обычная переменная, которой присвоен объект типа Массив: Перем Список; Список = Новый Массив;. Отдельного оператора для массивов нет. Аналогично создаются структуры (Новый Структура), таблицы значений и списки значений.

Почему переменная общего модуля «обнуляется»?

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

Как передать переменную между процедурами одного модуля?

Два способа: передать значение как параметр вызова (Рассчитать(Сумма)) или объявить переменную в разделе описания переменных модуля. Первый способ предпочтительнее — он делает зависимости между методами явными и упрощает тестирование.

Есть ли в 1С константы вместо переменных?

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