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