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