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