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

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

Как добавить переменную в 1С

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

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

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

Ниже разобраны основные способы добавления переменной в 1С: локальные переменные в процедуре, переменные модуля, реквизиты формы и объекта, а также правила именования и проверка результата.

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

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

Пример обоих подходов в одной процедуре:

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

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

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

ПроцентСкидки = 5;

Итог = СуммаЗаказа * (100 - ПроцентСкидки) / 100; // переменная создана присваиванием

Сообщить(Итог);

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

Обе переменные живут только внутри процедуры. После выполнения КонецПроцедуры они перестают существовать, и обращение к ним из другого кода вызовет ошибку «Переменная не определена». Это и есть область видимости: локальная переменная доступна только там, где создана.

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

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

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

Перем СчётчикОбращений; // переменная модуля

Процедура ЗарегистрироватьОбращение()

СчётчикОбращений = СчётчикОбращений + 1;

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

Переменная модуля инициализируется значением Неопределено, поэтому перед арифметическими операциями её нужно установить явно, иначе получите ошибку сложения с неопределённым значением. Типичный приём — присваивать начальное значение при первом обращении или в обработчике инициализации формы.

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

Реквизит формы как замена глобальной переменной

В управляемых формах правильный способ «добавить переменную», видимую во всех процедурах формы и переживающую серверные вызовы, — создать реквизит формы. Это делается в конфигураторе без написания кода.

Порядок действий: откройте форму в конфигураторе, перейдите на закладку «Реквизиты» в правой части окна редактора формы, нажмите «Добавить» (или Insert), задайте имя, например ТекущийСклад, и выберите тип — строка, число, ссылка на справочник и т.д. После этого реквизит доступен в коде формы напрямую по имени или через ЭтаФорма.ТекущийСклад.

Как добавить реквизит формы
  1. 1
    Откройте форму объекта в конфигураторе
  2. 2
    Перейдите на закладку «Реквизиты» в окне редактора формы
  3. 3
    Нажмите «Добавить» и задайте имя реквизита
  4. 4
    Выберите тип значения в свойствах реквизита
  5. 5
    Обратитесь к реквизиту в коде: ЭтаФорма.ИмяРеквизита = Значение

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

В отличие от переменной модуля, реквизит формы сериализуется платформой и передаётся между клиентом и сервером. Это даёт надёжность, но создаёт ограничение: в реквизите формы нельзя хранить несериализуемые значения, например объекты типа ТабличныйДокумент или COMОбъект. Для них применяют реквизиты с признаком временного хранения или другие механизмы.

Добавление реквизита объекта в конфигураторе

Если «переменная» должна храниться в базе данных постоянно — например, дополнительное поле у справочника или документа, — нужен не программный приём, а изменение конфигурации: добавление реквизита объекта. Это делается в дереве конфигурации: найдите нужный справочник или документ, откройте ветку «Реквизиты», добавьте новый элемент и укажите тип.

После добавления реквизита потребуется обновить конфигурацию базы данных (F7 или меню «Конфигурация → Обновить конфигурацию базы данных»). Платформа добавит колонку в таблицу базы. Для больших таблиц обновление может занять заметное время и выполняется в монопольном режиме — планируйте его на нерабочие часы.

Обращение к реквизиту объекта в коде выполняется через точку от объекта:

ДокументОбъект.КомментарийКДоставке = "Доставить до обеда";

ДокументОбъект.Записать();

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

Способы хранения значения

Локальная переменная

Значение нужно внутри одной процедуры. Самый быстрый и безопасный вариант, не переживает завершение процедуры.

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

Значение общее для процедур одного модуля. Не подходит для данных между серверными вызовами управляемой формы.

Реквизит формы

Данные живут, пока открыта форма, переживают серверные вызовы. Требует сериализуемого типа.

Реквизит объекта

Значение хранится в базе данных постоянно. Требует изменения конфигурации и обновления базы.

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

Тип переменной в 1С определяется присвоенным значением: число (Количество = 10), строка (Имя = "Склад"), дата (ДатаОтчёта = ТекущаяДатаСеанса()), булево (Флаг = Истина), ссылка на объект базы и другие. Проверить тип в коде можно функцией ТипЗнч(Переменная) в сочетании с Тип("Строка") и т.п.

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

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

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

Проверка результата и отладка

Убедиться, что переменная создана и содержит нужное значение, проще всего через отладчик конфигуратора. Поставьте точку останова (F9) на строке после присваивания, запустите отладку (F5) и посмотрите значение в табло (Shift+F9) или в окне «Локальные переменные». Там же видно тип значения.

Быстрая альтернатива без отладчика — вывод через Сообщить(Переменная). Для сложных типов (массив, структура, ссылка) выводите отдельные поля или используйте ЗначениеВСтрокуВнутр() в тестовых целях. Не оставляйте отладочные сообщения в рабочем коде: в серверных процедурах они невидимы пользователю и только засоряют логику.

Контрольные точки

Как проверить результат

Значение в отладчике
Норма

Переменная видна в табло и содержит ожидаемое значение и тип

Тревожный признак

Переменная равна Неопределено или имеет неожиданный тип

Компиляция модуля
Норма

Проверка модуля (Ctrl+F7) завершается без ошибок

Тревожный признак

Сообщение «Переменная не определена» — нарушена область видимости или опечатка

Поведение формы
Норма

Реквизит формы сохраняет значение после серверного вызова

Тревожный признак

Значение обнуляется — данные хранятся в переменной модуля вместо реквизита

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

Итог

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

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

Частые вопросы

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

Да. В 1С переменная создаётся автоматически при первом присваивании значения. Однако явное объявление через Перем делает код читаемее и защищает от опечаток, особенно в длинных процедурах.

Как сделать переменную доступной во всех модулях конфигурации?

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

Чем переменная отличается от константы в 1С?

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

Почему возникает ошибка «Переменная не определена»?

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

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

Без конфигуратора изменить состав реквизитов формы нельзя. В пользовательском режиме доступны только дополнительные реквизиты и сведения (если механизм включён администратором) и хранение значений в настройках отчётов и обработок. Для полноценной доработки нужны права разработчика и доступ к конфигуратору.

Можно ли в одной переменной хранить значения разных типов?

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