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

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

Что такое константы в 1С и как с ними работать

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

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

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

Константы занимают промежуточное место между «зашитыми» в код значениями и полноценными справочниками. Если значение одно и меняется редко — используют константу. Если значений несколько, они появляются в ходе работы и участвуют в документах — нужен справочник или перечисление.

Зачем нужны константы и когда их применяют

Основная задача константы — вынести из программного кода параметры, которые должны настраиваться без изменения конфигурации. Если ставка НДС или наименование организации «зашиты» прямо в модуле, любое изменение потребует правки конфигурации, обновления и риска ошибок. Константа же меняется пользователем в режиме «Предприятие» через обычную форму.

Типичные сценарии использования констант:

  • хранение основных реквизитов организации: наименование, ИНН, префикс информационной базы;
  • параметры учётной политики: валюта регламентированного учёта, ставка налога по умолчанию;
  • флаги-переключатели функциональности: «Вести учёт по складам», «Использовать серии номенклатуры»;
  • граничные даты: дата запрета изменения данных прошлых периодов;
  • служебные значения, которые нужны коду: путь к каталогу обмена, номер текущей версии настроек.

Константа не подходит, если значений несколько или они связаны с другими объектами. Например, список складов — это справочник, а не набор констант «Склад1», «Склад2». Попытка размножать константы под списочные данные — признак ошибки проектирования.

Типы значений констант

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

  • Число — с указанием длины и точности (например, ставка, коэффициент);
  • Строка — фиксированной или неограниченной длины (наименование, путь);
  • Булево — флаги включения/отключения механизмов;
  • Дата — границы периодов, даты запрета;
  • Ссылки — на справочники, документы, перечисления, планы счетов и другие объекты;
  • ХранилищеЗначения — для произвольных данных, например картинки или сериализованной структуры.

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

Тип константы после внедрения менять следует осторожно. Сужение типа (например, уменьшение длины строки или удаление одного из типов составного) при обновлении конфигурации может привести к потере данных, если хранящееся значение не укладывается в новые ограничения.

Как создать константу в конфигураторе

Создание константы выполняется в конфигураторе и не требует написания кода. Порядок действий:

Создание константы
  1. 1
    Откройте конфигурацию и в дереве объектов найдите ветку «Общие» → «Константы».
  2. 2
    Добавьте новую константу и задайте имя на русском языке без пробелов, например «ВалютаУчета».
  3. 3
    В палитре свойств выберите тип значения: примитивный тип или ссылку на объект.
  4. 4
    Заполните синоним — именно его увидит пользователь в интерфейсе.
  5. 5
    Настройте права: на закладке «Права» определите, какие роли могут читать и изменять константу.
  6. 6
    Обновите конфигурацию базы данных (F7), чтобы константа появилась в информационной базе.

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

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

Как обратиться к константе из кода

Для работы с константами в коде служит глобальный контекст Константы. Чтение и запись выглядят предельно просто:

// Чтение значения

ТекущаяВалюта = Константы.ВалютаУчета.Получить();

// Запись значения

Константы.ВалютаУчета.Установить(НоваяВалюта);

Метод Получить() возвращает текущее значение из базы, метод Установить() — сохраняет новое. Также доступен объект КонстантаМенеджер через свойство Константы.ВалютаУчета, но в подавляющем большинстве случаев достаточно этих двух методов.

Для пакетной работы с несколькими константами существует объект КонстантыНабор (менеджер Константы.СоздатьНабор()), позволяющий прочитать или записать группу констант одной транзакцией. Это актуально для форм настроек, где пользователь меняет сразу несколько параметров.

На клиенте (в тонком и веб-клиенте) прямая запись констант недоступна — запись выполняется в серверной процедуре. Чтение на клиенте возможно, но каждое обращение к Константы.Имя.Получить() в клиентском коде вызывает обращение к серверу, поэтому часто используемые значения лучше получить один раз на сервере и передать на клиент.

bsl
&НаСервере
Функция ПолучитьНастройки()
    Результат = Новый Структура;
    Результат.Вставить("Валюта", Константы.ВалютаУчета.Получить());
    Результат.Вставить("СтавкаНДС", Константы.ОсновнаяСтавкаНДС.Получить());
    Возврат Результат;
КонецФункции

Константы, перечисления и справочники: что выбрать

Частая проблема начинающих разработчиков — выбор неподходящего объекта для хранения данных. Различия принципиальны:

ОбъектЧто хранитКогда применять
КонстантаОдно значение на всю базуНастройка, параметр, флаг, единственное значение
ПеречислениеФиксированный список значений, заданный в конфигуратореЗакрытый набор вариантов, который не меняет пользователь (виды операций, статусы)
СправочникСписок элементов, создаваемых пользователемДанные, которые пополняются в работе: контрагенты, склады, валюты

Если параметр может принимать несколько значений за период и важна история его изменения (например, учётная политика по годам), константа не подойдёт вовсе — нужен регистр сведений с периодичностью. Константа хранит только текущее значение, история изменений в ней не сохраняется.

Маршрут решения

Как выбрать объект

Значение одно, меняется редко, история не нужнаИспользуйте константу
Набор значений фиксирован и известен на этапе разработкиИспользуйте перечисление
Значения добавляет пользователь в процессе работыИспользуйте справочник
Нужна история изменения параметра по датамИспользуйте периодический регистр сведений

Особенности, ограничения и риски

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

Права на константы настраиваются отдельно для каждой роли: право «Чтение» и право «Изменение». Пользователь без права изменения увидит значение, но не сможет его сохранить. Если код записывает константу от имени пользователя без нужных прав, возникнет ошибка нарушения прав доступа — в таких случаях используют УстановитьПривилегированныйРежим(Истина) с осознанием последствий для безопасности.

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

Типичные ошибки
01
Использование константы как счётчика или оперативного параметра — конфликты блокировок при параллельной работе.
02
Заведение серии констант «Склад1», «Склад2» вместо справочника — невозможность расширить список без доработки конфигурации.
03
Чтение константы в цикле на клиенте — многократные серверные вызовы и замедление работы.
04
Хранение в константе периодического параметра (ставки, курса) — потеря истории и ошибки в отчётах за прошлые периоды.
05
Отсутствие настройки прав — либо все могут менять критичную настройку, либо никто не может её прочитать.

Проверка результата и практические рекомендации

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

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

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

Чтение значения из кода
Норма

Получить() возвращает заданное значение в любом сеансе

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

Возвращается пустое значение или значение по умолчанию

Поведение при незаполненной константе
Норма

Код проверяет значение на пустоту и сообщает пользователю о необходимости настройки

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

Ошибка исполнения или нулевые результаты в расчётах

Права пользователей
Норма

Рядовой пользователь читает настройку, меняет её только администратор

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

Настройку может изменить любой или не может никто

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

Удобный приём: для булевых констант-переключателей функциональности делайте проверку через функциональные опции. Это позволяет автоматически скрывать из интерфейса элементы, связанные с отключённым механизмом, без лишнего кода на формах.
ПЗ
Практическое замечание

Часто задаваемые вопросы

Чем константа в конфигурации отличается от константы в коде?

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

Сохраняется ли история изменений константы?

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

Может ли пользователь изменить константу без конфигуратора?

Да, и это основное назначение констант. Значение редактируется в режиме «Предприятие» через форму настроек при наличии у пользователя права «Изменение» на соответствующую константу.

Сколько констант можно создать в конфигурации?

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

Почему Константы.Имя.Получить() возвращает пустое значение?

Наиболее частые причины: значение просто не задано ни разу, либо код выполняется в контексте, где недоступно чтение (ограничение прав). Незаполненная константа возвращает значение по умолчанию для своего типа — пустую строку, ноль, дату 01.01.0001 или пустую ссылку.

Можно ли использовать константу в запросе?

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

Итог

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

Константа — объект метаданных для хранения одного редко меняющегося значения, общего для всей базы. Создаётся в конфигураторе, читается и пишется через Константы.Имя.Получить() и Установить(). Не подходит для списков, счётчиков и параметров с историей — для этого есть справочники и регистры сведений. Перед изменением типа или удалением константы делайте резервную копию.