Разработка и Конфигурация · 11 мин
Как объявить переменные в 1С: полное руководство
Как объявить переменную в 1С: оператор Перем, локальные и глобальные переменные, экспорт, типы значений, типичные ошибки и примеры кода на встроенном языке.
Во встроенном языке 1С переменная объявляется оператором Перем, после которого указывается имя. Язык не требует задавать тип заранее: тип определяется значением, которое присвоено переменной в момент выполнения. Поэтому строка Перем Сумма; создаёт переменную без типа, а после Сумма = 1500; она становится числовой.
Объявлять переменные нужно в разных местах модуля в зависимости от области видимости. Переменные, описанные в начале модуля до процедур и функций, доступны во всём модуле. Переменные, объявленные внутри процедуры или функции, существуют только внутри неё. Понимание этой разницы — ключ к корректной работе кода и отсутствию ошибок «Переменная не определена».
Объявление переменных — обязательная практика, хотя язык 1С формально допускает неявное создание переменной при первом присваивании. Явное объявление через Перем делает код читаемым, позволяет контролировать область видимости и защищает от опечаток в именах.
Базовый синтаксис оператора Перем
Оператор имеет простой формат: Перем, затем одно или несколько имён через запятую, в конце — точка с запятой. Допустимо объявить несколько переменных одной строкой: Перем Счетчик, Итог, Наименование;. Каждая переменная сразу доступна для присваивания значения.
Имена переменных могут содержать русские и латинские буквы, цифры и знак подчёркивания, но не должны начинаться с цифры. Регистр букв не имеет значения: Сумма и СУММА — одна и та же переменная. Имена не должны совпадать с ключевыми словами языка (Если, Функция, КонецЕсли и т. п.).
Пример минимального кода:
Перем Количество;
Процедура Рассчитать()
Количество = 10;
Сообщить("Количество: " + Количество);
КонецПроцедуры
Обратите внимание: объявление переменной не присваивает ей значение. До первого присваивания переменная содержит Неопределено. Попытка использовать её в арифметике без присваивания приведёт к ошибке преобразования типов.
Локальные переменные процедур и функций
Переменные, объявленные внутри процедуры или функции, называются локальными. Они создаются при входе в метод и уничтожаются при выходе из него. Снаружи метода к ним обратиться нельзя — попытка вызовет ошибку «Переменная не определена».
Функция ВычислитьСкидку(Сумма)
Перем Процент, Результат;
Если Сумма > 10000 Тогда
Процент = 10;
Иначе
Процент = 5;
КонецЕсли;
Результат = Сумма * Процент / 100;
Возврат Результат;
КонецФункции
Локальные переменные — основной инструмент промежуточных вычислений. Используйте их для всего, что не нужно за пределами метода: счётчиков циклов, временных строк, промежуточных сумм. Это снижает риск случайного изменения данных из другого кода.
Параметры процедуры и функции фактически тоже являются локальными переменными: внутри метода им можно присваивать новые значения, если параметр не объявлен с модификатором Знач — тогда изменение параметра не затронет переданную переменную снаружи.
Глобальные переменные модуля и экспорт
Переменные, объявленные в разделе описания переменных модуля (до первой процедуры или функции), видны во всех методах этого модуля. Такие переменные удобны для хранения состояния, которое разделяют несколько процедур, — например, кэша настроек или признака инициализации.
Ключевое слово Экспорт после имени делает переменную доступной из других модулей конфигурации:
// Модуль общего назначения
Перем ТекущийПользователь Экспорт;
Перем СчетчикОпераций; // доступна только внутри этого модуля
Обращение к экспортной переменной извне выполняется через имя модуля: ОбщегоНазначения.ТекущийПользователь. Злоупотреблять экспортом не стоит: каждая экспортная переменная — это точка связанности модулей, которая усложняет сопровождение конфигурации.
Срок жизни переменных зависит от типа модуля. В общих модулях с признаком «Сервер» переменные живут в рамках вызова сервера, в модулях форм — пока открыта форма. Полагаться на долговременное хранение данных в переменных модуля нельзя: при перезапуске сеанса или повторном вызове сервера значения могут быть потеряны.
Типы значений и присваивание
1С — язык с динамической типизацией: одна и та же переменная в разные моменты может хранить число, строку, дату, ссылку на объект или значение Неопределено. Тип проверяется в момент выполнения операции, поэтому ошибки типов выявляются не при сохранении модуля, а при работе кода.
Основные примитивные типы:
- Число —
Цена = 1250.50;, разделитель дробной части — точка; - Строка —
Имя = "Контрагент";, кавычки внутри строки удваиваются; - Булево —
Активен = Истина;; - Дата —
ДатаДок = '20260115';, литерал даты в одинарных кавычках в формате ГГГГММДД; - Неопределено — признак отсутствия значения.
Для проверки типа значения используются функции ТипЗнч() и Тип():
Если ТипЗнч(Значение) = Тип("Число") Тогда
// безопасно выполнять арифметику
КонецЕсли;
Явное преобразование выполняют функции Число(), Строка(), Дата(). Они полезны при обработке данных из внешних источников, где тип значения заранее не гарантирован.
Перем Значение;
Значение = "123";
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Значение = Число(Значение);
КонецЕсли;Переменные в модулях формы и реквизиты формы
В управляемых формах есть важное ограничение: переменные модуля формы не сохраняются между серверными вызовами. Форма при каждом обращении к серверу может быть пересоздана, и значения переменных модуля обнулятся. Это частая причина «пропадающих» данных в управляемых приложениях.
Для хранения данных между вызовами используйте реквизиты формы. Они создаются в редакторе формы (панель «Реквизиты») и доступны в коде через обращение по имени: ЭтаФорма.ИмяРеквизита или просто по имени в модуле формы. Реквизиты с признаком «Ключевой» влияют на уникальность формы.
Практическое правило: переменные модуля формы — только для данных, нужных в пределах одного вызова; реквизиты формы — для всего, что должно переживать серверные вызовы и отображаться пользователю.
Где объявлять переменную
Именование и проверка кода
Единый стиль имён упрощает чтение конфигурации. Распространённая практика — именовать переменные существительными, отражающими содержимое: СуммаДокумента, ТаблицаТоваров, КоличествоСтрок. Избегайте однобуквенных имён вне коротких циклов и сокращений, понятных только автору.
Проверить корректность объявлений помогает встроенная проверка модулей конфигуратора: меню «Конфигурация — Проверка конфигурации» с включённой проверкой модулей выявит обращения к необъявленным переменным и неиспользуемые объявления. Регулярный запуск этой проверки — простой способ отловить опечатки до выполнения кода.
Дополнительную защиту от опечаток даёт явное объявление всех переменных: если переменная объявлена через Перем, а в коде встретилось имя с ошибкой, проверка конфигурации сразу укажет на проблему. При неявном создании переменных опечатка молча порождает новую пустую переменную, и логика расчёта искажается без видимой ошибки.
Как проверить результат
Модуль сохраняется без синтаксических ошибок
Сообщение «Переменная не определена» или ошибка ожидания символа «;»
После присваивания отображается ожидаемый тип и значение
Значение «Неопределено» в точке, где переменная уже должна быть заполнена
Нет предупреждений о неиспользуемых и необъявленных переменных
Предупреждения об обращении к необъявленным идентификаторам
Частые ошибки и их последствия
Ошибка «Переменная не определена» возникает при обращении к имени, которое не объявлено ни в текущем методе, ни в модуле. Причины: опечатка, объявление переменной в другой процедуре, пропущенный оператор Перем. Лечится проверкой области видимости и точного написания имени.
Ошибка преобразования значения к типу возникает, когда переменная содержит Неопределено или значение несовместимого типа. Типичный сценарий — присваивание внутри условия Если, которое не выполнилось. Защита — инициализировать переменные значением по умолчанию сразу после объявления: Итог = 0;.
Конфликт имён случается, когда локальная переменная совпадает по имени с переменной модуля: локальная «перекрывает» модульную внутри метода, и обращения идут не к той переменной. Избегайте одинаковых имён на разных уровнях видимости.
Что важно запомнить
Переменные объявляются оператором Перем, тип задаётся присваиванием. Локальные переменные живут внутри метода, переменные модуля — во всех его процедурах, Экспорт открывает доступ извне. В управляемых формах для хранения между вызовами используйте реквизиты формы, а все переменные объявляйте явно и инициализируйте начальными значениями.
Частые вопросы
Можно ли в 1С использовать переменную без объявления через Перем?
Технически да: при первом присваивании необъявленному имени переменная создаётся неявно. Однако это плохая практика — опечатка в имени создаст новую переменную вместо ошибки, а область видимости такой переменной неочевидна. Явное объявление через Перем считается стандартом разработки.
Чем переменная отличается от реквизита объекта?
Переменная существует только в памяти во время выполнения кода и исчезает после завершения. Реквизит справочника, документа или формы — это данные, которые хранятся в базе или в состоянии формы и переживают завершение процедуры. Для промежуточных вычислений используйте переменные, для сохраняемых данных — реквизиты.
Как объявить массив в 1С?
Массив — это обычная переменная, которой присвоен объект типа Массив: Перем Список; Список = Новый Массив;. Отдельного оператора для массивов нет. Аналогично создаются структуры (Новый Структура), таблицы значений и списки значений.
Почему переменная общего модуля «обнуляется»?
Общие модули с серверным вызовом не гарантируют сохранение состояния между вызовами: сервер может переиспользовать или пересоздавать контекст. Для данных, привязанных к пользователю, применяйте параметры сеанса, для постоянных данных — регистры сведений или константы.
Как передать переменную между процедурами одного модуля?
Два способа: передать значение как параметр вызова (Рассчитать(Сумма)) или объявить переменную в разделе описания переменных модуля. Первый способ предпочтительнее — он делает зависимости между методами явными и упрощает тестирование.
Есть ли в 1С константы вместо переменных?
На уровне языка отдельного модификатора константности для переменных нет. Неизменяемые значения принято хранить в константах конфигурации (объект метаданных «Константа») либо возвращать из функций общего модуля с повторным использованием значений.