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