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

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

Как определить переменную в 1С

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

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

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

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

Как объявить переменную через оператор Перем

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

Перем Сумма;

Перем Контрагент, ДатаДокумента;

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

Перем Результат;

Результат = Сумма * 1.2;

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

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

Имена переменных пишутся на русском или английском языке, без пробелов, начинаются с буквы или символа подчёркивания. Регистр букв не имеет значения: Сумма и сумма — одна и та же переменная.

Неявное определение переменной через присваивание

Если присвоить значение имени, которое ещё не объявлено, платформа создаст переменную автоматически. Такой способ короче, но таит риск: опечатка в имени создаст новую переменную вместо ошибки, и найти её будет сложно.

Количество = 5;        // переменная создана неявно

Количество = Количество + 1;

Количестов = 10; // опечатка: создана новая переменная, ошибки нет

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

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

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

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

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

Процедура ВыполнитьОперацию()

Перем ЛокальноеЗначение; // видна только здесь

СчетчикОпераций = СчетчикОпераций + 1;

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

Сравнение вариантов объявления

Локальная Перем в процедуре

Подходит для промежуточных расчётов. Не засоряет модуль, значение не переживает вызов.

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

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

Переменная модуля с Экспорт

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

Неявное присваивание

Быстро для простых скриптов, но опасно опечатками и не рекомендуется в прикладном коде.

Какие типы значений принимает переменная

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

  • Число — Цена = 150.50;
  • Строка — Наименование = "Товар";
  • Булево — Признак = Истина;
  • Дата — ДатаНачала = '20260101';
  • Неопределено — значение до первого присваивания или явное Переменная = Неопределено;
  • Ссылки на объекты базы, массивы, структуры и другие коллекции.

Проверить фактический тип значения помогает функция ТипЗнч() в связке с Тип(): Если ТипЗнч(Переменная) = Тип("Число") Тогда .... Это полезно, когда переменная заполняется из внешних данных и её тип заранее не гарантирован.

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

Как проверить, что переменная определена корректно

Самый простой способ убедиться, что переменная получила ожидаемое значение, — вывести её через Сообщить() или посмотреть в отладчике конфигуратора. Отладчик показывает имена, типы и текущие значения всех переменных в точке останова.

Для проверки «заполненности» используют сравнение с Неопределено и функцию ЗначениеЗаполнено(). Вторая учитывает не только Неопределено, но и пустые строки, нулевые даты и пустые ссылки.

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

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

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

Переменная видна, тип и значение соответствуют ожиданию

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

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

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

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

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

Ошибка «Переменная не определена» — имя не объявлено и не присвоено

Тип значения
Норма

ТипЗнч возвращает ожидаемый тип

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

Вместо числа — строка или Неопределено

Типичные ошибки при определении переменных

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

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

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

Как выбрать способ определения

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

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

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

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

Какое значение у переменной сразу после Перем?

Значение Неопределено. Перед использованием в расчётах переменной нужно присвоить конкретное значение или проверить её сравнением с Неопределено.

Можно ли задать тип переменной при объявлении?

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

Почему возникает ошибка «Переменная не определена»?

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

Видна ли переменная одной процедуры в другой?

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

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

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

Итог

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

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