Разработка и Конфигурация · 11 мин
Переменная в 1С: что это и как с ней работать
Что такое переменная в 1С: объявление, типы значений, область видимости, примеры кода на встроенном языке. Типичные ошибки и проверка результата.
Переменная в 1С — это именованная область памяти, в которой программа временно хранит значение во время выполнения кода. Значение может быть числом, строкой, датой, булевым значением, ссылкой на объект базы данных (например, на элемент справочника или документ) или более сложной структурой вроде массива. Переменная существует только пока выполняется код: после завершения процедуры или закрытия сеанса её содержимое теряется.
Встроенный язык 1С относится к языкам с динамической типизацией. Это значит, что тип переменной не фиксируется при объявлении: одна и та же переменная может сначала хранить строку, а затем — число. Тип определяется тем значением, которое присвоено последним. Такая гибкость упрощает написание кода, но требует внимательности: операция сложения строки и числа приведёт к ошибке выполнения.
Переменные используются повсеместно: для хранения промежуточных результатов расчётов, передачи данных между строками кода, накопления итогов в циклах, сохранения ссылок на найденные объекты. Понимание того, как объявлять переменные, где они видны и как проверять их значения в отладчике, — базовый навык для любого, кто пишет или дорабатывает код в 1С.
Как объявить переменную
Явное объявление выполняется ключевым словом Перем (английский синтаксис — Var). После слова указывается имя переменной, несколько имён перечисляются через запятую, оператор завершается точкой с запятой:
Перем СуммаДокумента;
Перем ИмяКлиента, НомерЗаказа;
Явное объявление не обязательно: переменная создаётся автоматически при первом присвоении ей значения. Однако на практике рекомендуется объявлять переменные явно в начале процедуры — это делает код читаемым и помогает избежать ошибок с опечатками в именах. Конфигуратор умеет проверять использование необъявленных переменных при синтаксическом контроле, если включить соответствующую настройку.
Имя переменной должно начинаться с буквы или знака подчёркивания и может содержать буквы, цифры и подчёркивания. Имена нечувствительны к регистру: Сумма и сумма — одна и та же переменная. Допускаются имена как на русском, так и на английском языке, но смешивать языки в одном имени не стоит.
Перем СуммаДокумента; // явное объявление
СуммаДокумента = 1500.50; // присвоение значения
ИмяКлиента = "ООО Ромашка"; // неявное создание при присвоенииКакие значения может хранить переменная
Переменная принимает тип того значения, которое ей присвоено. Основные примитивные типы — число, строка, дата и булево (Истина/Ложь). Кроме них переменная может содержать ссылку на объект базы данных, объект типа «Структура», «Массив», «ТаблицаЗначений», результат запроса и многие другие типы платформы. Специальное значение Неопределено означает отсутствие значения.
Узнать текущий тип значения переменной можно функцией ТипЗнч(), а сравнить с нужным типом — через функцию Тип(). Это стандартный приём защитного программирования, когда код должен вести себя по-разному в зависимости от переданных данных:
Если ТипЗнч(Параметр) = Тип("Строка") Тогда
Сообщить("Передана строка: " + Параметр);
КонецЕсли;
Важно помнить о неявном преобразовании типов, а точнее — о его отсутствии во многих операциях. Сложение строки и числа вызовет ошибку, поэтому перед арифметическими операциями значения приводят явно функциями Число(), Строка(), Дата(). Конкатенация строк со значениями других типов, наоборот, выполняется автоматически.
Область видимости: где переменная доступна
Место объявления определяет, откуда к переменной можно обратиться. Различают три уровня: локальные переменные процедуры или функции, переменные модуля и глобальные переменные, объявленные в модуле управляемого приложения или обычного приложения с директивой Экспорт.
Переменная, объявленная внутри процедуры, существует только во время её выполнения и недоступна снаружи. Переменная, объявленная в разделе описания переменных модуля (до первой процедуры), видна всем процедурам этого модуля и сохраняет значение между их вызовами. Экспортные переменные модуля доступны из других модулей через имя модуля, но злоупотреблять ими не стоит: это затрудняет сопровождение и может приводить к трудно отслеживаемым ошибкам.
| Место объявления | Кто видит переменную | Время жизни |
|---|---|---|
| Внутри процедуры или функции | Только эта процедура | До конца выполнения процедуры |
| Начало модуля (без Экспорт) | Все процедуры этого модуля | Пока существует контекст модуля |
| Начало модуля с Экспорт | Другие модули через имя модуля | Пока существует контекст модуля |
Отдельный случай — переменные в форме. В управляемой форме данные между вызовами сервера принято хранить не в переменных модуля, а в реквизитах формы, поскольку состояние модуля формы не гарантированно сохраняется между серверными вызовами.
Практический пример: переменные в процедуре
Типовой сценарий — расчёт с накоплением результата в цикле. Переменная-накопитель объявляется до цикла, на каждой итерации к ней добавляется значение, после цикла результат используется дальше:
Процедура РассчитатьИтог()
Перем ИтоговаяСумма;
ИтоговаяСумма = 0;
Для Каждого СтрокаТовара Из Товары Цикл
ИтоговаяСумма = ИтоговаяСумма + СтрокаТовара.Сумма;
КонецЦикла;
Сообщить("Итого: " + ИтоговаяСумма);
КонецПроцедуры
Здесь переменная ИтоговаяСумма — локальная: после завершения процедуры её значение исчезает. Если результат нужен вызывающему коду, процедуру превращают в функцию с возвратом значения через оператор Возврат. Передача результата через переменную модуля — устаревший приём, который усложняет отладку.
Переменные также применяют для хранения ссылок на найденные объекты, чтобы не выполнять поиск повторно. Например, результат метода НайтиПоКоду() сохраняют в переменную и дальше работают уже с ней, проверив предварительно, что ссылка не пустая.
- 1Объявите переменную через Перем в начале процедуры или модуля
- 2Присвойте начальное значение до первого использования
- 3Используйте переменную в вычислениях, при необходимости проверяя тип через ТипЗнч()
- 4Верните результат через Возврат, если он нужен вызывающему коду
- 5Проверьте значения в отладчике: точка останова, команда «Вычислить выражение»
Как проверить значение переменной в отладчике
Отладчик конфигуратора — основной инструмент проверки того, что хранит переменная в конкретный момент. Установите точку останова на нужной строке (клавиша F9), запустите конфигурацию в режиме отладки и дождитесь остановки выполнения. После этого доступны несколько способов посмотреть значение.
Самый быстрый — навести курсор мыши на имя переменной: подсказка покажет текущее значение. Для сложных выражений используется окно «Вычислить выражение» (Shift+F9), а для постоянного наблюдения за несколькими переменными — «Табло» (Ctrl+Alt+W), куда переменные добавляются один раз и обновляются на каждом шаге.
Для значений составных типов (таблица значений, массив, структура) в отладчике доступен просмотр содержимого в отдельном окне. Это позволяет убедиться, что цикл заполнил коллекцию ожидаемым числом элементов, прежде чем искать ошибку в логике обработки.
Как проверить результат
Соответствует ожидаемому типу и содержимому
Неопределено или значение другого типа
Код компилируется без ошибки «Переменная не определена»
Синтаксический контроль сообщает о необъявленной переменной
Возврат возвращает вычисленное значение
Возвращается Неопределено из-за пропущенного оператора Возврат
Типичные ошибки при работе с переменными
Самая частая ошибка начинающих — использование переменной до присвоения ей значения. Неинициализированная переменная содержит Неопределено, и попытка сложить его с числом или обратиться к свойству приводит к аварийному завершению кода. Правило простое: сначала присвоение, потом использование.
Вторая группа ошибок связана с областью видимости: переменная объявлена в одной процедуре, а используется в другой, либо имя локальной переменной совпадает с именем переменной модуля и «перекрывает» её. В последнем случае код работает не так, как ожидалось, хотя синтаксически всё корректно.
Третья типичная ситуация — неявная смена типа в середине кода: переменная сначала хранила число, затем ей присвоили строку, и последующая арифметика сломалась. Динамическая типизация не прощает невнимательности, поэтому одну переменную стоит использовать для одного смыслового значения и одного типа.
Частые вопросы о переменных в 1С
Обязательно ли объявлять переменную через «Перем»?
Нет, переменная создаётся автоматически при первом присвоении. Но явное объявление улучшает читаемость кода и позволяет синтаксическому контролю конфигуратора находить опечатки в именах. В прикладных решениях, которые планируется сопровождать, явное объявление считается хорошей практикой.
Чем переменная отличается от константы в 1С?
Это разные сущности. Переменная — элемент встроенного языка, живёт только во время выполнения кода. Константа в 1С — объект конфигурации, значение которого хранится в базе данных и сохраняется между сеансами. Константы меняются пользователем или кодом, но не пропадают при завершении процедуры.
Как узнать тип значения переменной?
Функцией ТипЗнч(Переменная), которая возвращает объект типа «Тип». Для сравнения используют конструкцию ТипЗнч(Значение) = Тип("Строка"). В отладчике тип виден в подсказке при наведении курсора и в окне «Вычислить выражение».
Можно ли передать переменную из одной процедуры в другую?
Да, через параметры процедуры или функции. Параметры, объявленные со словом «Знач», передаются по значению (копия), без него — по ссылке, и изменения внутри вызванной процедуры отразятся на исходной переменной. Для возврата одного результата предпочтительнее функция с оператором Возврат.
Что такое экспортная переменная и когда её использовать?
Переменная модуля, объявленная с директивой Экспорт, доступна из других модулей конфигурации. Применять её стоит редко — для данных, действительно нужных нескольким модулям, например кэша настроек сеанса. В большинстве случаев передача значений через параметры и возвращаемые значения функций безопаснее.
Почему переменная в управляемой форме теряет значение?
В управляемых формах контекст модуля не гарантированно сохраняется между серверными вызовами, поэтому переменные модуля формы могут обнуляться. Данные, которые должны жить дольше одного вызова, хранят в реквизитах формы — они сериализуются платформой автоматически.
Что важно запомнить
Переменная в 1С — временное именованное хранилище значения на время выполнения кода. Объявляется через Перем или создаётся при первом присвоении, тип определяется значением автоматически. Область видимости задаётся местом объявления: процедура, модуль или экспорт. Всегда присваивайте значение до использования и проверяйте содержимое в отладчике.