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

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

Что такое переменная в программировании 1С

Переменная в 1С: что это, как объявить и присвоить значение, типы данных, область видимости, типичные ошибки новичков и примеры кода на встроенном языке.

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

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

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

Как объявить переменную и присвоить ей значение

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

Перем СуммаИтога;

СуммаИтога = 0;

Для Каждого СтрокаТовара Из Товары Цикл

СуммаИтога = СуммаИтога + СтрокаТовара.Сумма;

КонецЦикла;

Встроенный язык допускает и неявное объявление: если вы просто пишете КоличествоДней = 30; без предварительного Перем, переменная будет создана автоматически в момент первого присваивания. Это удобно в коротких фрагментах кода, но в длинных процедурах повышает риск опечаток: если вы ошибётесь в имени, платформа молча создаст новую переменную вместо того, чтобы сообщить об ошибке.

Через запятую можно объявить сразу несколько переменных: Перем Сумма, Количество, СредняяЦена;. При объявлении переменной можно добавить признак Экспорт — тогда она станет доступна из других модулей (подробнее об этом ниже, в разделе про область видимости).

Как начать работать с переменной
  1. 1
    Откройте нужный модуль в конфигураторе: модуль формы, модуль объекта или общий модуль
  2. 2
    Объявите переменную через Перем в начале процедуры или модуля с понятным именем
  3. 3
    Присвойте начальное значение оператором = до первого использования в расчётах
  4. 4
    Проверьте результат через Сообщить() или точку останова в отладчике

Какие типы значений может хранить переменная

Переменная в 1С может содержать значение любого типа, существующего в платформе. Чаще всего в прикладном коде встречаются примитивные типы и ссылки на объекты базы данных:

  • Число — суммы, количества, коэффициенты: Цена = 1250.50;
  • Строка — наименования, комментарии, тексты сообщений: Комментарий = "Оплата по счёту";
  • Дата — периоды отчётов, даты документов: ДатаНачала = '20260101';
  • Булево — признаки и флаги: ЕстьОшибки = Ложь;
  • Ссылки — указатели на элементы справочников и документы: Контрагент = Документ.Контрагент;
  • Коллекции — массивы, структуры, соответствия, таблицы значений для наборов данных.

Особое значение — Неопределено. Оно означает, что переменной не присвоено никакого осмысленного значения. Функции платформы часто возвращают Неопределено, когда результат отсутствует, поэтому перед использованием такого значения стоит делать проверку: Если Результат = Неопределено Тогда ... КонецЕсли;.

Область видимости: где переменная «живёт» и откуда доступна

Область видимости определяет, из каких мест программы можно обратиться к переменной. В 1С различают три основных уровня, и понимание разницы между ними избавляет от большинства ошибок «переменная не определена».

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

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

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

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

Экспортные переменные

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

Где объявлять переменную

Локальная (внутри процедуры)

Подходит для всех промежуточных расчётов. Ограничение: недоступна за пределами процедуры

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

Подходит, когда значение нужно нескольким процедурам одного модуля. Ограничение: усложняет отладку, сохраняет состояние между вызовами

Экспортная переменная

Подходит редко, когда значение нужно извне модуля. Ограничение: любой код может её изменить, лучше заменить функцией

Примеры из практики: где переменные используются чаще всего

В обработчиках документов переменные накапливают итоги и флаги проверок. Типичный пример — контроль остатков перед проведением расходной накладной:

Процедура ПередЗаписью(Отказ, РежимЗаписи)

Перем НедостаточноТовара;

НедостаточноТовара = Ложь;

Для Каждого СтрокаТовара Из Товары Цикл

Остаток = ПолучитьОстаток(СтрокаТовара.Номенклатура);

Если Остаток < СтрокаТовара.Количество Тогда

НедостаточноТовара = Истина;

Сообщить("Недостаточно: " + СтрокаТовара.Номенклатура);

КонецЕсли;

КонецЦикла;

Если НедостаточноТовара Тогда

Отказ = Истина;

КонецЕсли;

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

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

Отдельный распространённый сценарий — переменная как контейнер для коллекции. Например, структура удобна для передачи набора параметров между процедурами: ПараметрыОтбора = Новый Структура("Склад, Номенклатура", Склад, Товар);. Это читаемее, чем перечисление пяти-шести отдельных параметров в вызове.

При отладке в конфигураторе поставьте точку останова на строке с присваиванием и добавьте переменную в окно «Выражения» (Ctrl+Alt+W). Так вы увидите текущее значение и тип на каждом шаге выполнения — это быстрее, чем расставлять Сообщить() по коду.
ПЗ
Практическое замечание

Типичные ошибки при работе с переменными

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

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

Ещё одна частая ситуация — попытка обратиться к локальной переменной из другой процедуры. Платформа выдаёт ошибку «Переменная не определена», и правильное решение здесь — не выносить переменную в модуль «на всякий случай», а передать значение через параметр процедуры или вернуть его из функции.

Как проверить, что переменная работает правильно

Самый быстрый способ убедиться, что переменная получает ожидаемое значение, — отладчик конфигуратора. Запустите отладку (клавиша F5), поставьте точку останова (F9) на нужной строке и пошагово выполняйте код (F10/F11), наблюдая значения в табло или окне выражений.

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

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

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

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

Соответствует ожидаемому типу и содержимому на каждом шаге

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

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

Тип через ТипЗнч()
Норма

Возвращает ожидаемый тип, например Число или ДокументСсылка

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

Тип Строка там, где ожидалась дата или ссылка

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

Конфигуратор не сообщает о неопределённых переменных

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

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

Частые вопросы о переменных в 1С

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

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

Чем переменная отличается от реквизита объекта?

Реквизит — это поле данных, которое хранится в информационной базе и описано в конфигурации (например, реквизит «Сумма» документа). Переменная существует только в памяти во время выполнения кода и после завершения процедуры исчезает. Чтобы сохранить значение переменной, его нужно записать в реквизит, регистр или другой объект базы.

Обязательно ли писать Перем перед использованием?

Нет, платформа создаст переменную при первом присваивании. Но явное объявление считается хорошей практикой: оно делает код понятнее и позволяет синтаксическому контролю находить опечатки в именах до запуска.

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

Через параметры при вызове: РассчитатьИтог(СуммаДокумента);. Если процедура должна изменить значение, параметр объявляется со словом Знач (передача копии) или без него (передача по ссылке, изменения вернутся в вызывающий код). Для возврата одного результата удобнее функция с оператором Возврат.

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

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

Можно ли хранить в переменной результат запроса?

Да, типичный приём: Результат = Запрос.Выполнить();, затем получение выборки через Результат.Выбрать() или выгрузку в таблицу значений через Результат.Выгрузить(). Переменная при этом хранит объект соответствующего типа, и работа с данными идёт через его методы.

Итог

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

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