Разработка и Конфигурация · 11 мин
Как задать переменные в 1С
Как задать переменные в 1С: объявление через Перем, присваивание значений, типы данных, область видимости, экспортные переменные и типичные ошибки начинающих.
Переменная в 1С — это именованная область памяти, в которой хранится значение определённого типа: число, строка, дата, ссылка на объект базы данных или результат вычисления. Переменные используются в каждом модуле: от простого расчёта суммы документа до сложных алгоритмов обмена данными. Понимание того, как правильно объявить переменную, задать ей значение и ограничить область видимости, — базовый навык любого разработчика на встроенном языке 1С.
Встроенный язык 1С относится к языкам с динамической типизацией: тип переменной определяется значением, которое ей присвоено, и может меняться в процессе выполнения кода. Это упрощает написание процедур, но требует внимательности — ошибка с типом проявится только в момент выполнения, а не при компиляции модуля.
Ниже разобраны все способы задания переменных: явное объявление через ключевое слово Перем, неявное создание при первом присваивании, экспортные переменные, переменные форм и модуля объекта, а также типичные ошибки, которые приводят к падению кода или трудноуловимым дефектам в расчётах.
Как объявить переменную через Перем
Самый надёжный способ задать переменную — явное объявление с помощью ключевого слова Перем. Объявление размещается в начале процедуры или функции, до первого исполняемого оператора. Синтаксис прост: после слова Перем указывается имя переменной, оператор завершается точкой с запятой.
Процедура РассчитатьСкидку()
Перем СуммаДокумента;
Перем ПроцентСкидки, ИтоговаяСумма;
СуммаДокумента = 10000;
ПроцентСкидки = 5;
ИтоговаяСумма = СуммаДокумента * (1 - ПроцентСкидки / 100);
КонецПроцедуры
Несколько переменных допускается объявлять в одной строке через запятую, как показано выше. Имена переменных могут содержать русские и латинские буквы, цифры и знак подчёркивания, но не должны начинаться с цифры и совпадать с ключевыми словами языка (Процедура, Если, Для и т. п.). Регистр букв значения не имеет: Сумма и СУММА — одна и та же переменная.
Явное объявление считается хорошей практикой, потому что делает структуру процедуры прозрачной: сразу видно, с какими данными она работает. Кроме того, объявленная, но ещё не заполненная переменная имеет значение Неопределено, что позволяет проверить её состояние до использования.
Неявное создание переменной при присваивании
Встроенный язык 1С позволяет задать переменную без объявления: достаточно присвоить значение новому имени, и платформа создаст переменную автоматически. Такой подход встречается в коротких процедурах и обработчиках событий форм.
Количество = 10; // число
Наименование = "Товар А"; // строка
ДатаОтгрузки = '20260115'; // дата
Активен = Истина; // булево
Тип переменной определяется литералом присваиваемого значения. Числа пишутся без кавычек, строки — в двойных кавычках, даты — в одинарных кавычках в формате ГГГГММДД. Булевы значения задаются словами Истина и Ложь. Ссылочные значения получают через методы объектов, например Справочники.Номенклатура.НайтиПоКоду("000001").
Неявное создание удобно, но таит риск: опечатка в имени переменной при присваивании создаст новую переменную вместо изменения существующей. Например, если в коде есть ИтогСумма, а ниже написать ИтогСуммы = 500;, ошибки при компиляции не будет — просто расчёт пойдёт не туда. В длинных процедурах такие дефекты ищутся часами.
Область видимости: где переменная будет доступна
Место объявления определяет, откуда переменная доступна. Переменная, заданная внутри процедуры или функции, называется локальной: она существует только во время выполнения этой процедуры и недоступна снаружи. После завершения процедуры память освобождается.
Переменная, объявленная в разделе описания переменных модуля (до первой процедуры), называется переменной модуля. Она доступна всем процедурам и функциям этого модуля и хранит значение, пока существует сам объект — например, пока открыта форма или существует экземпляр объекта документа.
Перем СчетчикОбращений; // переменная модуля
Процедура УвеличитьСчетчик()
СчетчикОбращений = СчетчикОбращений + 1;
КонецПроцедуры
Добавление ключевого слова Экспорт после имени делает переменную модуля доступной из других модулей через точку: МойМодуль.СчетчикОбращений. Экспортные переменные следует использовать осмотрительно — прямой доступ к внутреннему состоянию модуля извне усложняет сопровождение и нарушает инкапсуляцию. В большинстве случаев вместо экспортной переменной лучше написать функцию, возвращающую нужное значение.
Сравнение вариантов объявления
Базовый вариант для промежуточных вычислений. Живёт только внутри процедуры, не конфликтует с другими модулями
Подходит для данных, общих для всех процедур модуля. Хранится, пока существует объект; требует аккуратности с инициализацией
Доступна из других модулей. Оправдана редко — обычно лучше экспортная функция, возвращающая значение
Для данных, привязанных к форме и отображаемых пользователю. Создаётся в конфигураторе или программно через ИзменитьРеквизиты
Как задать тип данных переменной
Явного указания типа при объявлении в 1С нет — тип появляется в момент присваивания. Разработчик управляет типом через значение: числовые литералы создают Число, строки в кавычках — Строку, одинарные кавычки с датой — Дату. Специальное значение Неопределено означает отсутствие значения и часто используется как начальное состояние.
Для проверки текущего типа применяется функция ТипЗнч(Переменная) в сочетании с Тип("Строка") и подобными конструкциями. Это необходимо в универсальных процедурах, куда могут попасть значения разных типов:
Если ТипЗнч(Значение) = Тип("Число") Тогда
Результат = Значение * Коэффициент;
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
Результат = Число(Значение);
КонецЕсли;
Преобразование типов выполняется встроенными функциями: Число(), Строка(), Дата(), Булево(). Учтите, что преобразование не всегда безопасно: попытка перевести в число строку «две тысячи» вызовет ошибку. Перед преобразованием строки в число полезно проверить её содержимое или обернуть вызов в попытку-исключение.
Перем Значение;
Значение = "123,45";
Попытка
ЧисловоеЗначение = Число(Значение);
Исключение
ЧисловоеЗначение = 0;
КонецПопытки;Переменные в формах и объектах конфигурации
В управляемых формах роль долгоживущих переменных выполняют реквизиты формы. Они создаются в конфигураторе через палитру реквизитов формы или программно методом ИзменитьРеквизиты() при создании формы на сервере. Реквизит формы сохраняет значение между вызовами сервера, чего обычная переменная модуля формы в тонком клиенте не гарантирует.
Переменные модуля формы, объявленные через Перем в разделе описания, имеют ограничение: при серверных вызовах форма может пересоздаваться, и значения таких переменных теряются. Поэтому данные, которые должны переживать серверные вызовы, хранят именно в реквизитах формы, а не в переменных модуля.
В модулях объектов (документов, справочников) переменные модуля живут, пока существует объект в памяти. Их используют для кэширования промежуточных результатов внутри одного сеанса работы с объектом, но не для хранения данных между сеансами — для этого существуют реквизиты объекта, записываемые в базу данных.
Проверка работы с переменными и отладка
Убедиться, что переменная задана корректно, проще всего в отладчике конфигуратора. Установите точку останова на строке после присваивания, запустите отладку (клавиша F5) и посмотрите значение в табло или через «Вычислить выражение» (Shift+F9). Там же виден и текущий тип значения.
Для быстрой диагностики без отладчика используют Сообщить() — вывод значения в окно сообщений. В серверном коде на тонком клиенте сообщения появятся после завершения серверного вызова. Это грубый, но рабочий способ проверить, доходит ли выполнение до нужной строки и какое значение там находится.
Как проверить результат
В отладчике видно значение и ожидаемый тип
Значение Неопределено или ошибка «Переменная не определена»
ТипЗнч возвращает ожидаемый тип, арифметика выполняется
Ошибка преобразования типа при вычислении
Переменная доступна во всех нужных процедурах модуля
Ошибка компиляции «Переменная не определена» в соседней процедуре
Данные хранятся в реквизите формы и сохраняются
После серверного вызова переменная модуля формы пуста
Давайте переменным говорящие имена: СуммаБезНДС вместо С1, ДатаНачалаПериода вместо Д1. В 1С длинные русские имена — норма, а не дурной тон: код читают чаще, чем пишут, и через полгода смысл однобуквенной переменной не вспомнит даже автор.
Частые вопросы по переменным в 1С
Прежде чем перейти к ответам, зафиксируйте главное: объявляйте переменные явно, выбирайте область видимости осознанно и проверяйте типы в местах, где данные приходят извне — из пользовательского ввода, файлов обмена или запросов к базе.
Чем отличается Перем от присваивания без объявления?
Результат одинаков — переменная создаётся в обоих случаях. Разница в читаемости и защите от опечаток: явное объявление через Перем фиксирует намерение и упрощает поиск всех переменных процедуры, а при неявном создании ошибка в имени незаметно порождает новую переменную.
Как сделать переменную доступной из другого модуля?
Объявите её в разделе переменных общего модуля с ключевым словом Экспорт: Перем ТекущийКурс Экспорт;. Обращение — через имя модуля: ОбщийМодуль.ТекущийКурс. Однако предпочтительнее экспортная функция, возвращающая значение: она позволяет контролировать чтение и менять внутреннюю реализацию без правки вызывающего кода.
Почему возникает ошибка «Переменная не определена»?
Три типовые причины: переменная читается до первого присваивания; переменная объявлена в другой процедуре, а используется в текущей; опечатка в имени. Отладчик покажет точную строку — проверьте, что выше по коду есть присваивание и что имя написано идентично в обоих местах.
Можно ли задать тип переменной заранее, как в других языках?
Нет, строгой типизации при объявлении во встроенном языке нет. Тип определяется присвоенным значением и может меняться. Приблизиться к контролю типов помогают проверки через ТипЗнч() и комментарии с ожидаемым типом рядом с объявлением — это принятая практика в типовых конфигурациях.
Какое значение у объявленной, но пустой переменной?
Значение Неопределено. Его можно проверить сравнением: Если Переменная = Неопределено Тогда .... Это удобно для инициализации по требованию: при первом обращении проверяете на Неопределено и заполняете, при последующих — используете готовое значение.
Где хранить значение, нужное между серверными вызовами формы?
В реквизите формы, а не в переменной модуля. Переменные модуля управляемой формы не гарантированно сохраняются между вызовами, потому что контекст формы может пересоздаваться. Реквизит формы сериализуется платформой и надёжно переживает серверные обращения.
Что важно запомнить
Переменная в 1С задаётся через Перем или первым присваиванием, тип определяется значением, а доступность — местом объявления. Локальные переменные живут внутри процедуры, переменные модуля — в пределах модуля, Экспорт открывает доступ извне. Для данных формы, переживающих серверные вызовы, используйте реквизиты формы, а корректность значений и типов проверяйте в отладчике.