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