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

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

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

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

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

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

Синтаксис объявления через Перем

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

Перем СуммаДокумента;

Перем ИмяКлиента, ДатаЗаказа; // несколько переменных в одной строке

СуммаДокумента = 1500.50;

ИмяКлиента = "ООО Ромашка";

ДатаЗаказа = ТекущаяДата();

В одном операторе Перем допустимо перечислить несколько имён через запятую. Объявление можно размещать в начале модуля, внутри процедуры или функции. Если переменная объявлена внутри процедуры, она локальна и недоступна снаружи.

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

Типы значений переменных

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

Основные типы значений, которые чаще всего присваивают переменным:

  • Число — Количество = 10; или Цена = 99.90;
  • Строка — Наименование = "Стул офисный";
  • Булево — ЕстьОшибки = Истина;
  • Дата — Период = '20260115'; (литерал даты в одинарных кавычках)
  • Неопределено — Результат = Неопределено;
  • Ссылки и объекты — Контрагент = Справочники.Контрагенты.НайтиПоКоду("000001");
  • Коллекции — массивы, структуры, соответствия, таблицы значений.

Проверить фактический тип значения в отладке помогает функция ТипЗнч(Переменная), а сравнить тип с нужным — функция Тип("СтрокаТипа"). Это полезно, когда переменная может содержать значения разных типов в зависимости от логики.

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

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

Если переменная нужна нескольким процедурам модуля, её объявляют в разделе объявления переменных модуля — до первой процедуры:

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

Процедура ПриНачалеРаботы()

ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

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

Ключевое слово Экспорт делает переменную модуля доступной из других модулей (если сам модуль это позволяет). Без Экспорт переменная видна только внутри своего модуля. В управляемых формах для хранения данных между вызовами сервера вместо экспортных переменных правильнее использовать реквизиты формы — переменные модуля формы не сохраняются между серверными вызовами.

Правила именования переменных

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

Практические рекомендации по именам:

  • Используйте осмысленные имена: СуммаНДС вместо А или Пер1.
  • Не называйте переменные именами встроенных функций и методов платформы — это приведёт к конфликтам.
  • Не объявляйте переменную с именем, совпадающим с именем реквизита формы или объекта, если это может вызвать двусмысленность.
  • Для временных счётчиков циклов короткие имена (Инд, К) допустимы, но лучше и их делать говорящими.
Типичные ошибки
01
Использование переменной без инициализации — значение Неопределено попадает в арифметику и вызывает ошибку выполнения
02
Опечатка в имени при неявном объявлении: вместо ошибки создаётся новая пустая переменная, и результат расчёта неверный
03
Пропущенная точка с запятой после Перем — компилятор модуля выдаёт синтаксическую ошибку
04
Объявление экспортной переменной модуля формы вместо реквизита формы — данные обнуляются между серверными вызовами
05
Имя переменной совпадает с именем процедуры модуля — конфликт имён и непредсказуемое поведение

Пошаговый пример: переменная в процедуре

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

Процедура РассчитатьИтог(СуммаЗаказа, ПроцентСкидки)

Перем СуммаСкидки, ИтоговаяСумма;

СуммаСкидки = СуммаЗаказа * ПроцентСкидки / 100;

ИтоговаяСумма = СуммаЗаказа - СуммаСкидки;

Сообщить("Итоговая сумма: " + ИтоговаяСумма);

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

Порядок действий
  1. 1
    Откройте конфигуратор и найдите нужный модуль (модуль формы, объекта, общий модуль)
  2. 2
    Внутри процедуры объявите переменные оператором Перем или сразу присвойте значение
  3. 3
    Присвойте начальные значения до первого использования в вычислениях
  4. 4
    Выполните проверку синтаксиса модуля (Ctrl+F7 в конфигураторе)
  5. 5
    Запустите код в режиме предприятия и проверьте результат через отладчик (F5) или Сообщить

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

Проверка результата и отладка

После написания кода выполните синтаксическую проверку модуля: в конфигураторе это команда «Конфигурация — Проверка конфигурации» или клавиша Ctrl+F7 в окне модуля. Ошибки объявления (дубли имён, пропущенные разделители) обнаруживаются на этом этапе, до запуска.

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

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

Синтаксис модуля
Норма

Проверка (Ctrl+F7) завершается без ошибок

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

Сообщения о синтаксических ошибках со ссылкой на строку

Значение переменной
Норма

В отладчике переменная содержит ожидаемое значение нужного типа

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

Значение Неопределено или тип не соответствует ожиданию

Поведение между вызовами
Норма

Данные формы сохраняются после серверных вызовов

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

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

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

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

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

Да. Достаточно присвоить значение новому имени, например Итог = 100; — переменная создастся автоматически. Однако явное объявление через Перем делает код понятнее и снижает риск незаметных опечаток, поэтому в промышленном коде рекомендуется именно оно.

Как сделать переменную доступной из других модулей?

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

Какой тип имеет переменная сразу после объявления?

Значение Неопределено. Это специальное значение, которое нельзя складывать с числами или строками без предварительной проверки. Перед использованием присвойте переменной конкретное значение или проверяйте её через условие Если Переменная = Неопределено Тогда.

Почему переменная модуля формы обнуляется?

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

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

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

Как быстро узнать тип значения переменной при отладке?

Используйте функцию ТипЗнч(Переменная) в табло отладчика или выведите её через Сообщить. Возвращённое значение можно сравнить с нужным типом через Тип("Число"), Тип("Строка") и аналогичные.

Итог

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

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