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

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

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

Переменная в 1С:Предприятие — это контейнер для хранения данных, который имеет:

  • 🔤 Имя — уникальный идентификатор (например, СуммаДокумента или КоличествоТоваров).
  • 📦 Тип данных — число, строка, дата, справочник, документ и т.д.
  • 💾 Значение — конкретные данные, записанные в переменную (например, 1000 или "Привет, мир!").
  • 🌍 Область видимости — где переменная доступна (внутри процедуры, модуля или всей сессии).

Простейший пример объявления переменной:

Перем МояПеременная;

Здесь Перем — ключевое слово для создания переменной, а МояПеременная — её имя. Но это только вершина айсберга. В реальных задачах переменные взаимодействуют с контекстом выполнения, могут быть экспортными (доступными извне модуля) или динамическими (создаваться "на лету").

📊 Как часто вы используете переменные в 1С?
Постоянно, в каждом скрипте
Только для сложных расчётов
Редеко, предпочитаю прямые обращения
Не знаю, что это такое

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

МойЧисло = "123"; // Строка автоматически станет числом 123

МойЧисло = "Привет"; // Здесь будет ошибка: невозможно преобразовать строку в число

Виды переменных в 1С: глобальные, локальные, динамические

В 1С:Предприятие 8.3

переменные делятся на три основных типа по области видимости. Их правильное использование определяет стабильность и производительность вашего кода.

Тип переменной Область видимости Синтаксис объявления Пример использования
Локальная Только внутри процедуры/функции Перем ИмяПеременной; (внутри метода) Хранение промежуточных расчётов в обработчике события
Модульная В пределах одного модуля (формы, объекта, менеджера) Перем ИмяПеременной Экспорт; (в начале модуля) Сохранение настроек формы между вызовами
Глобальная Во всей сессии пользователя Перем ИмяПеременной; (в общем модуле с флагом "Глобальный") Хранение данных о текущем пользователе для всех обработок
Динамическая Создаётся и уничтожается "на лету" Без объявления, через присваивание: ИмяПеременной = Значение; Временные расчёты в цикле Для Каждого

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

  • 🐞 Опечатки в имени переменной приведут к созданию новой (вместо ошибки).
  • 🗑️ Они не очищаются сборщиком мусора, пока существуют ссылки.
  • 🔍 Их сложно отладить — они не видны в окне переменных отладчика.
💡

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

⚠️ Внимание: Глобальные переменные в общих модулях с флагом "Глобальный" сохраняют значение до конца сессии пользователя. Если не очищать их вручную (например, через ОчиститьЗначение()), они могут привести к утечкам памяти при длительной работе.

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

Объявление переменной в 1С зависит от её типа и области видимости. Рассмотрим основные способы:

1. Локальные переменные

Объявляются внутри процедур или функций. Доступны только в рамках текущего метода.

Процедура РассчитатьСумму()

Перем Сумма, Количество; // Объявление двух переменных

Сумма = 0;

Количество = 10;

// ... дальнейший код

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

2. Модульные переменные

Объявляются в начале модуля (до первых процедур). Могут быть экспортными (доступными из других модулей) или нет.

Перем МояЭкспортнаяПеременная Экспорт; // Доступна извне через точку

Перем ЛокальнаяПеременнаяМодуля; // Только внутри этого модуля

3. Глобальные переменные

Создаются в общих модулях с установленным флагом "Глобальный". Доступны во всей конфигурации.

// В общем модуле "ГлобальныеПеременные" с флагом "Глобальный"

Перем ТекущийПользователь;

Использование:

ГлобальныеПеременные.ТекущийПользователь = Пользователи.ТекущийПользователь();

4. Динамические переменные

Создаются автоматически при первом присваивании. Не рекомендуются для производственного кода.

МойДинамическийМассив = Новый Массив(); // Переменная создана "на лету"

МойДинамическийМассив.Добавить("Элемент1");

Используйте осмысленные имена (не П1, а ПроцентНДС)

Объявляйте переменные в начале процедуры/модуля

Для глобальных переменных создавайте отдельные общие модули

Избегайте динамических переменных в критичном коде

Указывайте тип данных при объявлении (если известно)

-->

В 1С:Предприятие 8.3.20+ появилась возможность указывать тип переменной при объявлении (аналог type hinting в других языках):

Перем МояСтрока Тип Строка;

Это помогает отловить ошибки ещё на этапе написания кода, так как платформа будет ругаться на присваивание несовместимых типов.

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

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

  1. Локальная область — внутри одной процедуры/функции. Переменная уничтожается после завершения метода.
  2. Модульная область — в пределах одного модуля (формы, документа, справочника). Доступна всем процедурам модуля.
  3. Глобальная область — во всей сессии пользователя. Требует объявления в общем модуле с флагом "Глобальный".
  4. Динамическая область — зависит от контекста выполнения. Может "просачиваться" в родительские процедуры, если не объявлена явно.

Пример конфликта областей видимости:

Перем МояПеременная; // Модульная переменная

Процедура Тест()

Перем МояПеременная; // Локальная переменная (перекрывает модульную)

МояПеременная = 10; // Изменится только локальная

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

⚠️ Внимание: Если в процедуре не объявлена локальная переменная, а используется имя, совпадающее с модульной, то изменяться будет модульная переменная. Это частая причина багов!

Для явного указания области видимости используйте:

  • 🔹 ЭтотОбъект.ИмяПеременной — для обращения к переменной текущего объекта (формы, документа).
  • 🔹 ГлобальныйКонтекст.ИмяПеременной — для глобальных переменных (устаревший синтаксис, но ещё встречается в legacy-коде).
Что произойдёт, если не объявить переменную явно?

Если переменная не объявлена ключевым словом Перем, то:

1. При первом присваивании 1С создаст её как динамическую в текущем контексте.

2. Если имя совпадёт с существующей модульной переменной — будет использована она (что часто приводит к ошибкам).

3. В строгом режиме (СтрогийКонтрольТипов) необъявленные переменные вызовут ошибку компиляции.

Типы данных переменных в 1С

Переменные в 1С могут хранить данные любых поддерживаемых платформой типов. Основные категории:

Категория Примеры типов Особенности хранения
Простые Число, Строка, Дата, Булево Хранятся "по значению" (копируются при присваивании)
Ссылочные СправочникСсылка, ДокументСсылка, ПеречислениеСсылка Хранят ссылку на объект в базе (не копируют данные)
Коллекции Массив, Структура, Соответствие, СписокЗначений Динамические контейнеры для групп данных
Объектные ОбъектМенеджер, ОбъектДокумента, ОбъектСправочника Представляют собой экземпляры метаданных
Специальные Null, Неопределено, Исключение Используются для управления потоком выполнения

Присваивание переменных разных типов работает по правилам неявного преобразования:

МоеЧисло = 100;          // Число

МоеЧисло = "200"; // Автоматически преобразуется в число 200

МоеЧисло = "Привет"; // Ошибка: невозможно преобразовать строку в число

МояСтрока = "100" + 50; // Результат: "10050" (число преобразуется в строку)

МояСтрока = 100 + "50"; // Результат: 150 (строка преобразуется в число)

Для явного преобразования типов используйте функции:

  • 🔢 Число(Значение) — преобразует в число.
  • 📜 Строка(Значение) — преобразует в строку.
  • 🗓️ Дата(Значение) — преобразует в дату.
  • Булево(Значение) — преобразует в Истина/Ложь.
💡

Всегда проверяйте типы данных перед критическими операциями (например, перед записью в базу). Используйте функцию ТипЗнч(Значение) для диагностики.

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

Разберём реальные сценарии, где переменные незаменимы:

1. Расчёт в документе

Сохранение промежуточных результатов при проведении:

Процедура ОбработкаПроведения(Отказ, Режим)

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

СуммаНДС = 0;

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

СуммаНДС = СуммаНДС + Строка.Сумма * 0.2; // Расчёт НДС 20%

КонецЦикла;

ИтоговаяСумма = CalculateTotal() + СуммаНДС;

// ... дальнейшая логика

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

2. Хранение настроек формы

Модульные переменные для сохранения состояния между открытиями:

Перем ПоследнийВыбранныйКонтрагент;

Процедура ПриОткрытии()

Если ЗначениеЗаполнено(ПоследнийВыбранныйКонтрагент) Тогда

ЭлементыФормы.Контрагент.Значение = ПоследнийВыбранныйКонтрагент;

КонецЕсли;

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

Процедура КонтрагентПриИзменении(Элемент)

ПоследнийВыбранныйКонтрагент = Элемент.Значение;

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

3. Глобальный кэш данных

Общий модуль для хранения часто используемых данных:

// В общем модуле "ГлобальныйКэш" (флаг "Глобальный")

Перем КэшКурсовВалют;

Функция ПолучитьКурсВалюты(Валюта, ДатаКурса)

Если КэшКурсовВалют = Неопределено Тогда

КэшКурсовВалют = Новый Соответствие;

КонецЕсли;

КлючКэша = Валюта.УникальныйИдентификатор() + "|" + Формат(ДатаКурса, "ДЛФ=DT");

Если НЕ КэшКурсовВалют.СодержитКлюч(КлючКэша) Тогда

КэшКурсовВалют.Вставить(КлючКэша, ПолучитьКурсИзБазы(Валюта, ДатаКурса));

КонецЕсли;

Возврат КэшКурсовВалют[КлючКэша];

КонецФункции

⚠️ Внимание: При использовании глобальных переменных для кэширования всегда предусматривайте механизм очистки. Например, сбрасывайте кэш при изменении курсов валют или по таймеру. Иначе пользователи будут работать с устаревшими данными.

4. Динамическое создание переменных (продвинутый сценарий)

Иногда требуется создавать переменные "на лету" по именам из базы. Это опасно, но возможно:

ИмяПеременной = "ДинамическаяПеременная_" + Формат(ТекущаяДата(), "ДДММГГ");

Выполнить("Перем " + ИмяПеременной + ";"); // Создаём переменную

Выполнить(ИмяПеременной + " = Новый Массив();"); // Присваиваем значение

Такой код используется в метапрограммировании, но требует крайней осторожности!

Ошибки при работе с переменными и как их избежать

Даже опытные разработчики 1С сталкиваются с проблемами, связанными с переменными. Вот самые распространённые:

1. Утечки памяти

Глобальные переменные и коллекции (массивы, соответствия) могут "накапливать мусор", если не очищаются:

// Плохо: массив растёт бесконечно

Перем ЛогСобытий;

Процедура ДобавитьВЛог(Событие)

Если ЛогСобытий = Неопределено Тогда

ЛогСобытий = Новый Массив();

КонецЕсли;

ЛогСобытий.Добавить(Событие); // Память будет расти до перезапуска сессии

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

Решение: Ограничивайте размер коллекций или используйте слабые ссылки (СлабыйМассив в новых версиях платформы).

2. Конфликты имён

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

Перем Сумма; // Модульная переменная

Процедура Рассчитать()

Сумма = 100; // Изменится модульная переменная

Перем Сумма; // Теперь это локальная переменная

Сумма = 200; // Модульная осталась 100, локальная стала 200

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

Решение: Используйте уникальные префиксы для переменных (например, мСумма для модульных, лСумма для локальных).

3. Неявные преобразования типов

1С автоматически преобразует типы, что иногда приводит к ошибкам:

ДатаДокумента = "31.02.2023"; // Ошибки не будет, но дата станет 03.03.2023!

Сумма = "1 000"; // Строка с пробелом не преобразуется в число

Решение: Всегда проверяйте типы с помощью ТипЗнч() перед критическими операциями.

4. Динамические переменные

Опечатка в имени динамической переменной создаёт новую, вместо ошибки:

МойМассив = Новый Массив();

МойМасив.Добавить("Элемент"); // Опечатка! Создана новая переменная "МойМасив"

Решение: Включите строгий контроль типов в настройках конфигурации или используйте статический анализ кода (например, 1С:Сканер кода).

💡

90% ошибок с переменными в 1С связаны с неявными преобразованиями типов и конфликтами областей видимости. Всегда объявляйте переменные явно и проверяйте их типы!

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

Можно ли в 1С создать переменную с именем на кириллице?

Да, в 1С разрешены имена переменных на русском языке (например, Перем МояПеременная;). Однако это не рекомендуется для производственного кода, так как:

  • 🔹 Усложняет поддержку кода международными командами.
  • 🔹 Может вызывать проблемы при интеграции с внешними системами.
  • 🔹 Некоторые инструменты анализа кода некорректно обрабатывают кириллические имена.

Лучше придерживаться латиницы и нотации CamelCase (например, myVariable или documentSum).

Как узнать, объявлена ли переменная в текущем контексте?

Для проверки существования переменной используйте функцию ЗначениеЗаполнено() или конструкцию Попытка...Исключение:

Если НЕ ЗначениеЗаполнено(Перем МояПеременная) Тогда

Сообщить("Переменная не объявлена или равна Неопределено");

КонецЕсли;

Для динамических переменных:

Попытка

Тест = МояДинамическаяПеременная;

Исключение

Сообщить("Переменная не существует!");

КонецПопытки;

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

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

Характеристика Переменная Реквизит
Хранение В оперативной памяти В базе данных
Область видимости Зависит от объявления (локальная/глобальная) Привязан к объекту метаданных (документ, справочник)
Время жизни До конца сессии или процедуры Сохраняется между сессиями
Использование Для временных расчётов Для постоянных данных (например, "Наименование" справочника)

Пример: в документе "РеализацияТоваров" СуммаДокумента может быть как реквизитом (сохраняется в базе), так и переменной (рассчитывается "на лету").

Как передать переменную между клиентом и сервером в 1С?

Переменные существуют только в текущем контексте (клиент или сервер). Для передачи данных:

  1. Клиент → Сервер: Используйте параметры вызова серверных методов:
    Результат = СервернаяПроцедураНаСервере(МояПеременная);
  2. Сервер → Клиент: Возвращайте значение через Возврат:
    Функция ПолучитьДанные()
    

    Возврат МояСервернаяПеременная;

    КонецФункции

  3. Общий контекст: Используйте реквизиты форм или глобальные переменные (не рекомендуется для больших данных).

Пример полного цикла:

// На клиенте

Процедура КнопкаНажатие()

ЛокальнаяПеременная = 100;

Сервер.ОбработатьДанные(ЛокальнаяПеременная);

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

// На сервере

Процедура ОбработатьДанные(ЗначениеСКлиента)

СервернаяПеременная = ЗначениеСКлиента * 2;

Возврат СервернаяПеременная; // Вернёт 200 на клиент

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

Можно ли в 1С создать константу (неизменяемую переменную)?

В классическом понимании констант (как в других языках) в 1С нет, но есть обходные пути:

  1. Объект "Константа": Создайте константу в дереве метаданных (хранится в базе, изменяется только через интерфейс).
    Значение = Константы.МойПараметр.Получить();
  2. Переменная в общем модуле: Объявите переменную с комментарием и не изменяйте её в коде:
    //  КОНСТАНТА: не изменять! 
    

    Перем МойФиксированныйПараметр = 100;

  3. Функция-геттер: Верните фиксированное значение через функцию без параметров:
    Функция ПолучитьКонстанту()
    

    Возврат 3.14; // "Захардкоженое" значение

    КонецФункции

⚠️ Внимание: В 1С:Предприятие 8.3.22+ появилась директива #Область Константы, которая позволяет объявлять неизменяемые переменные на уровне модуля. Однако это не полноценные константы — их значение можно изменить через отладчик.