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

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

Что такое переменная в 1С и как с ней работать

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

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

Главная особенность встроенного языка 1С — переменные не требуют обязательного объявления с указанием типа. Достаточно присвоить значение, и переменная появится в памяти. Тип значения определяется в момент присваивания и может меняться в ходе выполнения. Это удобно для быстрой разработки, но требует дисциплины: случайное присвоение значения другого типа — частый источник логических ошибок.

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

Как объявить переменную: оператор Перем и неявное объявление

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

Перем СуммаЗаказа; // явное объявление

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

КоличествоСтрок = 3; // неявное объявление при первом присваивании

Явное объявление через Перем считается хорошей практикой по нескольким причинам. Во-первых, все переменные процедуры видны в одном месте — проще читать и отлаживать код. Во-вторых, снижается риск опечаток: если вы один раз объявили СуммаЗаказа, а потом написали СуммаЗаказ, в режиме строгой проверки конфигуратор сообщит о необъявленной переменной.

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

Какие значения хранятся в переменных

1С — язык с динамической типизацией: одна и та же переменная в разные моменты времени может хранить значения разных типов. Тип определяется последним присвоенным значением.

Чаще всего в переменных встречаются примитивные типы:

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

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

Чтобы узнать фактический тип значения в переменной, используют функцию ТипЗнч(Переменная), а для сравнения с нужным типом — Тип("Строка") и подобные. Это стандартный приём при отладке, когда код ведёт себя неожиданно.

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

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

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

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

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

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

Переменную модуля можно сделать экспортной, добавив ключевое слово Экспорт: Перем ТекущийПользователь Экспорт; — тогда она доступна из других модулей через имя модуля. Экспортные переменные используют редко: они создают жёсткие связи между модулями и усложняют поддержку.

Контекст формы и объекта

В модулях форм и объектов (документов, справочников) доступны реквизиты формы и свойства объекта — по сути, предопределённые переменные контекста. К ним обращаются напрямую по имени: Объект.Номер, ЭтаФорма.Заголовок. Путать их с обычными переменными не стоит: реквизиты объекта сохраняются в базу при записи, а переменные живут только в памяти.

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

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

Подходит для промежуточных расчётов. Уничтожается после завершения, не засоряет модуль. Рекомендуемый вариант по умолчанию.

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

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

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

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

Практический пример: переменные в реальном коде

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

Процедура РассчитатьСуммуДокумента(ДокументОбъект) Экспорт

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

Перем Скидка;

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

Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл

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

КонецЦикла;

Если ИтоговаяСумма > 100000 Тогда

Скидка = ИтоговаяСумма * 0.05;

Иначе

Скидка = 0;

КонецЕсли;

ИтоговаяСумма = ИтоговаяСумма - Скидка;

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

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

Обратите внимание: переменная СтрокаТовара в цикле Для Каждого создаётся самим циклом и на каждой итерации содержит очередную строку табличной части. Объявлять её через Перем не требуется.

bsl
Перем Результат;
Результат = НайтиКлиента(ИНН);
Если Результат = Неопределено Тогда
    Сообщить("Клиент не найден");
Иначе
    Сообщить("Найден: " + Результат.Наименование);
КонецЕсли;

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

Большинство ошибок новичков связано не с синтаксисом, а с логикой использования. Ниже — те, что встречаются чаще всего.

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

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

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

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

Как проверить и отладить значения переменных

Основной инструмент — встроенный отладчик конфигуратора. Установите точку останова (F9 на нужной строке), запустите отладку (F5) и дождитесь остановки выполнения. Дальше доступны три способа посмотреть значение.

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

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

Порядок действий при отладке переменной
  1. 1
    Откройте модуль в конфигураторе и поставьте точку останова на строке, где переменная получает значение
  2. 2
    Запустите отладку и воспроизведите действие, вызывающее код
  3. 3
    Дождитесь остановки и наведите курсор на переменную — проверьте значение и тип
  4. 4
    Добавьте переменную в табло и выполняйте код пошагово (F10), наблюдая изменения
  5. 5
    Сравните фактическое значение с ожидаемым и найдите строку, где происходит расхождение

Когда переменной недостаточно: альтернативы

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

Если нужно передать набор именованных значений между процедурами, используйте структуру (Новый Структура) вместо десятка отдельных переменных. Для списков однотипных данных — массив, для табличных данных с колонками — таблицу значений. Эти коллекции тоже хранятся в переменных, но структурируют данные.

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

Маршрут решения

Как выбрать действие

Значение нужно только внутри одной процедурыИспользуйте локальную переменную
Значение общее для нескольких процедур одного модуляОбъявите переменную в разделе переменных модуля
Значение должно пережить сеанс пользователяИспользуйте константу, регистр сведений или хранилище настроек
Нужно передать несколько связанных значенийСоберите их в структуру и передайте одним параметром
Данные должны быть доступны на клиенте и сервере формыСоздайте реквизит формы, а не переменную модуля формы
Итог

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

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

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

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

Нет, встроенный язык 1С не поддерживает фиксацию типа переменной. Тип всегда определяется текущим значением. Компенсировать это можно проверками через ТипЗнч() и комментариями в коде, где указывают ожидаемый тип.

Чем переменная отличается от параметра процедуры?

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

Почему переменная модуля формы «обнуляется» при работе?

В управляемых формах код выполняется и на клиенте, и на сервере, а контексты между ними не переносятся. Переменные модуля формы теряются при серверных вызовах. Решение — хранить такие данные в реквизитах формы, которые платформа передаёт между контекстами автоматически.

Как удалить переменную или освободить память?

Явной команды удаления переменной нет. Локальные переменные уничтожаются автоматически при завершении процедуры. Для освобождения памяти от большого объекта достаточно присвоить переменной Неопределено — сборщик мусора платформы освободит ресурсы.

Можно ли писать имена переменных латиницей?

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

Что выведет сравнение двух переменных со значением Неопределено?

Сравнение Неопределено = Неопределено вернёт Истина. Но полагаться на это не стоит как на проверку «переменная пустая»: пустая строка, ноль и Неопределено — три разных состояния, и каждое проверяется отдельно.