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

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

Как объявлять переменные в 1С

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

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

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

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

Синтаксис оператора Перем

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

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

Перем Контрагент, ДатаОплаты, Комментарий;

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

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

bsl
Перем СуммаДокумента;
СуммаДокумента = 0;
СуммаДокумента = СуммаДокумента + 1500.50;

Неявное объявление через присваивание

Если присвоить значение имени, которое ранее не объявлялось, платформа создаст переменную автоматически:

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

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

Главный риск неявного объявления — опечатки. Если в коде есть переменная ИтоговаяСумма, а дальше по ошибке написано ИтоговаяСуммма = 0;, платформа молча создаст новую переменную, и логика расчёта нарушится без сообщения об ошибке. Конфигуратор умеет находить часть таких проблем при проверке модулей, но полагаться только на него не стоит.

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

Область видимости: модуль, процедура, экспорт

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

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

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

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

Где объявлять переменные в разных модулях

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

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

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

Перем Значение;

Значение = 42; // Число

Значение = "Текст"; // теперь Строка

Значение = ТекущаяДатаСеанса(); // теперь Дата

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

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

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

Имя переменной
Норма

Имя уникально в области видимости, отражает смысл, начинается с буквы

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

Имя совпадает с именем метода платформы или содержит опечатку

Значение перед использованием
Норма

Переменная инициализирована до первого чтения

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

Переменная равна Неопределено в момент арифметической операции

Область видимости
Норма

Переменная объявлена в процедуре, если нужна только там

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

Локальная по смыслу переменная вынесена в раздел объявлений модуля

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

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

Имя не должно совпадать с зарезервированными словами языка (Если, Тогда, Процедура и другими). Также не стоит называть переменные именами глобальных методов платформы — например, ТекущаяДата в старых версиях или имена функций общих модулей: обращение к методу будет перекрыто переменной.

На практике удобны простые соглашения: имена отражают содержимое (ТаблицаТоваров, КоличествоСтрок), булевы переменные формулируются как утверждение (ЕстьОшибки, ЭтоНовый), а временные переменные в коротких фрагментах допускают краткие имена.

Практический порядок объявления в модуле

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

Порядок действий
  1. 1
    Определите, где нужна переменная: только внутри процедуры или во всём модуле
  2. 2
    Для локальной переменной объявите её оператором Перем в начале процедуры
  3. 3
    Для переменной модуля добавьте Перем в раздел объявлений до первой процедуры; Экспорт — только если доступ нужен извне
  4. 4
    Сразу инициализируйте переменную осмысленным значением, чтобы избежать Неопределено
  5. 5
    Выполните проверку модуля в конфигураторе (CTRL+F7 в редакторе модуля) и убедитесь в отсутствии предупреждений о неиспользуемых переменных

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

Директивы компиляции (&НаКлиенте, &НаСервере) влияют и на переменные: в модулях форм переменные, объявленные вне директив, компилируются в обоих контекстах, что иногда приводит к ошибкам при использовании типов, недоступных на тонком клиенте.
ПЗ
Практическое замечание

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

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

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

Чем отличается Неопределено от Null?

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

Нужно ли объявлять переменные цикла, например счётчик в Для?

Нет, переменная цикла создаётся автоматически конструкцией Для Сч = 1 По 10 Цикл. Явное объявление через Перем не требуется, хотя и не запрещено.

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

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

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

Через параметры при вызове и возвращаемые значения функций. Если нужно вернуть несколько значений, используйте структуру (Новый Структура) — это чище, чем заводить переменные модуля ради обмена данными между процедурами.

Итог

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

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