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

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

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

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

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

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

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

Базовый синтаксис объявления переменной

Классическая форма объявления выглядит так: Перем ИмяПеременной;. Несколько переменных можно перечислить через запятую в одной строке: Перем Сумма, Количество, Скидка;. Точка с запятой в конце обязательна — это разделитель операторов встроенного языка.

Имя переменной может содержать русские и латинские буквы, цифры и знак подчёркивания, но не может начинаться с цифры. Регистр букв значения не имеет: Сумма и СУММА — одна и та же переменная. Нельзя использовать ключевые слова языка (Если, Функция, Цикл и подобные) в качестве имён.

Пример простого кода с объявлением и присваиванием:

Перем СуммаЗаказа;

СуммаЗаказа = 15000;

СуммаЗаказа = СуммаЗаказа * 1.2; // добавили наценку 20%

Сообщить("Итоговая сумма: " + СуммаЗаказа);

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

Локальные переменные в процедурах и функциях

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

Функция РассчитатьИтог(Цена, Количество)

СуммаБезСкидки = Цена * Количество; // локальная переменная

Если СуммаБезСкидки > 10000 Тогда

Скидка = СуммаБезСкидки * 0.05;

Иначе

Скидка = 0;

КонецЕсли;

Возврат СуммаБезСкидки - Скидка;

КонецФункции

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

Переменные модуля: когда нужны и как объявить

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

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

Перем КэшНастроек Экспорт;

Процедура Инициализировать()

ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

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

Ключевое слово Экспорт после имени делает переменную доступной из других модулей — например, переменная общего модуля с Экспорт доступна из любого места конфигурации через точку: ОбщегоНазначения.КэшНастроек. Без Экспорт переменная видна только внутри своего модуля.

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

Глобальные данные: параметры сеанса вместо «глобальных переменных»

В 1С нет классических глобальных переменных, доступных везде без ограничений. Если значение должно храниться в течение всего сеанса пользователя и быть доступным в любом модуле, правильный инструмент — параметры сеанса. Они настраиваются в конфигураторе: ветка «Общие» → «Параметры сеанса», где задаётся имя и тип.

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

ПараметрыСеанса.ТекущийМагазин = ВыбранныйМагазин;

Магазин = ПараметрыСеанса.ТекущийМагазин;

Инициализацию параметров сеанса обычно выполняют в обработчике УстановкаПараметровСеанса модуля сеанса. Пока параметру не присвоено значение, обращение к нему возвращает Неопределено — учитывайте это в проверках.

Сравнение вариантов

Локальная переменная

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

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

Нужна, когда значение используют несколько процедур одного модуля. Живёт, пока существует объект (форма, обработка).

Параметр сеанса

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

Константа

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

Типы значений и нестрогая типизация

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

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

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

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

Такая свобода удобна, но опасна: если дальше по коду ожидалось число, а пришла строка, операция сложения вызовет ошибку. Для проверки типа используют функцию ТипЗнч() совместно с Тип():

Если ТипЗнч(Значение) = Тип("Число") Тогда

Итог = Итог + Значение;

КонецЕсли;

Для сложных данных вместо множества отдельных переменных удобнее использовать структуру: Данные = Новый Структура("Сумма, Количество", 0, 0);. Обращение к полям — через точку: Данные.Сумма. Это делает код компактнее и снижает количество переменных с похожими именами.

Именование переменных: правила читаемости

Имя должно отражать содержимое: СуммаДокумента, КоличествоСтрок, ДатаНачала. Однобуквенные имена допустимы только для счётчиков коротких циклов (Инд, К). Сокращения вроде Знч1, Тмп затрудняют сопровождение кода, особенно когда к нему возвращаются через несколько месяцев.

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

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

Проверка и отладка переменных

Быстрый способ проверить значение переменной — вывести его через Сообщить() или СообщитьПользователю(). Для сложных типов (структуры, таблицы значений) удобнее отладчик: установите точку останова на нужной строке, запустите сеанс в режиме отладки и посмотрите значения в окне «Локальные переменные» или через «Вычислить выражение» (Shift+F9).

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

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

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

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

Тип и значение соответствуют ожиданиям на нужной строке кода

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

Неопределено или значение другого типа — присваивание не выполнилось

Повторный вызов процедуры
Норма

Локальная переменная начинает «с чистого листа»

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

Старое значение сохранилось — переменная объявлена на уровне модуля

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

Конфигуратор не выдаёт предупреждений о неиспользуемых переменных

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

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

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

Можно ли объявить переменную внутри условия или цикла?

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

Чем переменная отличается от константы в 1С?

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

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

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

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

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

Есть ли ограничения на длину имени переменной?

Жёсткого практического ограничения, о котором стоит беспокоиться в повседневной работе, нет — имена разумной длины обрабатываются корректно. Реальное ограничение другое: слишком длинные имена ухудшают читаемость. Ориентируйтесь на 2–4 осмысленных слова в имени.

Итог

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

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