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