Разработка и Конфигурация · 10 мин
Как хранятся константы в 1С
Разбираем, как константы 1С хранятся в конфигурации и таблицах СУБД, где найти значения, как менять их безопасно и какие ошибки чаще всего встречаются.
Константа в 1С — это объект конфигурации, предназначенный для хранения одного значения, которое не меняется при каждом документе или операции: название организации, валюта учёта, признак использования подсистемы, параметры обмена. В отличие от регистров и справочников, константа не привязана к периоду или ссылочному объекту — у неё всегда ровно одно актуальное значение на всю информационную базу.
Физически значения констант хранятся в базе данных в служебных таблицах, а логически — в дереве конфигурации в разделе «Константы». Понимание того, где именно лежит значение и как платформа к нему обращается, важно при разработке, переносе данных, отладке обменов и ручном исправлении ошибок учёта.
Материал рассчитан на разработчиков, администраторов и продвинутых пользователей: разберём структуру хранения в файловом и клиент-серверном вариантах, способы чтения и записи из кода, типовые функциональные опции, а также риски прямого редактирования таблиц СУБД.
Что такое константа и чем она отличается от других объектов
Константа — примитивный по структуре объект метаданных. У неё есть имя, тип значения (строка, число, булево, дата, ссылка на справочник или перечисление) и одно текущее значение. Никаких табличных частей, движений, истории изменений в стандартном механизме нет: новое значение просто перезаписывает старое.
Ключевые отличия от смежных объектов: справочник хранит множество элементов с реквизитами, регистр сведений — набор записей с измерениями и, возможно, периодичностью, а константа — всегда одну запись. Если нужно хранить параметр, меняющийся во времени (например, курс валюты или историю ставок), константа не подходит — используется периодический регистр сведений.
Типичные примеры из типовых конфигураций: «Валюта регламентированного учёта», «Название организации», функциональные опции вида «Использовать характеристики номенклатуры». Через константы также часто хранят технические настройки: токены доступа к API, пути к каталогам обмена, признаки включённого логирования.
Где физически лежат значения констант
В файловом варианте вся база — это файл 1Cv8.1CD, и значения констант находятся внутри него в служебных таблицах внутреннего формата платформы. Прямого доступа к ним штатными средствами нет: данные читаются только через платформу.
В клиент-серверном варианте (MS SQL, PostgreSQL, Oracle, IBM DB2) платформа создаёт в базе данных служебные таблицы. Исторически значения констант размещаются в специальной таблице хранения констант, где каждой константе соответствует запись или поле; точные имена таблиц зависят от версии платформы и не являются документированным интерфейсом. Узнать сопоставление объектов метаданных и таблиц СУБД можно через функцию «ПолучитьСтруктуруХраненияБазыДанных()» в конфигураторе или коде.
Практический вывод: при переносе базы выгрузкой/загрузкой (.dt) константы переносятся автоматически вместе со всеми данными. При переносе средствами СУБД (бэкап/восстановление) — тоже, поскольку копируются все таблицы целиком.
Как увидеть и изменить константу в конфигураторе и в режиме предприятия
В конфигураторе константы находятся в дереве метаданных: ветка «Общие» → «Константы» (в старых конфигурациях — просто «Константы»). Здесь задаются имя, тип, длина, значение по умолчанию при первой записи не создаётся — значение появляется только после сохранения в режиме предприятия или из кода.
В пользовательском режиме доступ к константам обычно спрятан внутрь форм настроек: «Администрирование», «Настройки программы», панели функциональных опций. Пользователь меняет поле на форме, а обработчик записи формы сохраняет значение в константу. Прямого стандартного списка всех констант в интерфейсе предприятия нет — разработчик сам решает, какие из них вывести пользователю.
Для отладки удобно использовать консоль кода или внешнюю обработку «консоль запросов/кода», где можно прочитать и записать любую константу. Это безопаснее, чем правка таблиц СУБД, потому что платформа выполняет контроль типов и блокировки.
- 1Откройте конфигуратор, ветка «Общие» → «Константы», найдите нужную по имени или синониму.
- 2Проверьте тип значения и где константа используется (правый клик → «Поиск ссылок в объекте»).
- 3В режиме предприятия найдите форму настройки, связанную с константой, или используйте консоль кода.
- 4Измените значение и проверьте поведение механизмов, которые её читают.
Чтение и запись констант из встроенного языка
В коде работа идёт через менеджер констант. Чтение: Константы.ВалютаУчета.Получить(). Запись: Константы.ВалютаУчета.Установить(НовоеЗначение). Также доступен объект КонстантыМенеджер и набор значений КонстантыНабор для групповой записи нескольких констант в одной транзакции.
Метод Установить() сразу фиксирует значение в базе (в рамках текущей транзакции, если вызов внутри неё). При записи платформа проверяет соответствие типа: попытка записать строку в числовую константу вызовет исключение. Право на изменение проверяется по ролям — у пользователя без права «Изменение» на константу запись завершится ошибкой доступа.
// Чтение и запись константы
ТекущееЗначение = Константы.КаталогОбмена.Получить();
Если ПустаяСтрока(ТекущееЗначение) Тогда
Константы.КаталогОбмена.Установить("C:\\Exchange");
КонецЕсли;Для группового изменения используйте набор: создайте Константы.СоздатьНабор("Константа1, Константа2"), заполните значения и вызовите Записать(). Это удобно в обработчиках первоначального заполнения и при миграциях настроек между версиями конфигурации.
Функциональные опции и хранение настроек в типовых конфигурациях
В современных типовых решениях многие «переключатели» в интерфейсе — это функциональные опции, привязанные к константам типа «Булево». Пока опция выключена, связанные объекты (документы, отчёты, команды) скрыты из интерфейса. Значение такой опции физически хранится именно в константе.
Часть настроек в типовых хранится не в константах, а в регистрах сведений или в справочнике «Настройки», либо сериализуется в хранилище значения. Поэтому при поиске «где лежит эта настройка» проверяйте не только ветку констант, но и регистры сведений с именем, похожим на название подсистемы, а также общие модули работы с настройками.
Где хранить параметр
Одно значение на всю базу, без истории: валюта учёта, признак включения подсистемы. Не подходит для параметров, меняющихся во времени.
Значение с историей по датам: курсы валют, ставки, изменяющиеся условия. Требует запросов с отбором по периоду.
Сложные структурированные настройки, списки параметров, сериализованные объекты. Сложнее в поддержке, но гибче.
Риски прямого редактирования таблиц СУБД
Иногда администраторы пытаются поправить значение константы напрямую запросом к базе SQL. Это опасная практика: платформа кэширует метаданные и данные, формат хранения недокументирован, а ручная правка может привести к рассогласованию кэша, ошибкам при обновлении конфигурации и невозможности получить поддержку. Кроме того, при активных сеансах пользователей прямое изменение обходит механизмы блокировок.
Безопасный порядок действий при «застрявшем» значении: сделать резервную копию, завершить сеансы пользователей, изменить константу через код или интерфейс, проверить работу зависимых механизмов. Если константа недоступна из-за прав — выдать нужную роль, а не обходить механизм прав.
Типичные ошибки и проверка результата
После изменения константы проверьте, что читающие её механизмы получили новое значение: перезапустите фоновые задания, если они кэшировали параметр при старте, и убедитесь, что у пользователей без полных прав поведение соответствует ожиданиям. Для функциональных опций может потребоваться обновление интерфейса или перезаход в сеанс.
Как проверить результат
Константы.Имя.Получить() возвращает новое значение в любом сеансе
В разных сеансах читаются разные значения — вероятен кэш или незавершённая транзакция
После включения появились связанные команды и документы
Интерфейс не изменился — нужен перезапуск сеанса или обновление интерфейса
Пользователь с профилем настройки меняет значение без ошибок
Ошибка доступа при записи — не хватает права «Изменение» на константу
FAQ
Сохраняется ли история изменений константы?
Нет, штатный механизм констант хранит только текущее значение: при записи старое перезаписывается. Если нужна история, используйте периодический регистр сведений или журналируйте изменения самостоятельно через подписки на события.
Можно ли хранить в константе пароль или токен?
Технически можно, но небезопасно: значение доступно всем, кто может выполнить код или открыть консоль. Для секретов лучше использовать защищённые механизмы хранения, внешние хранилища секретов или хотя бы ограничить права и не выводить значение в интерфейс.
Переносятся ли константы при выгрузке базы в .dt?
Да, выгрузка информационной базы включает все данные, включая значения констант. При загрузке .dt значения полностью заменяются теми, что были на момент выгрузки.
Почему после изменения константы в коде пользователи видят старое значение?
Чаще всего причина в кэше: сеанс или фоновое задание прочитали значение раньше и держат его в памяти. Помогает повторное чтение через Константы.Имя.Получить(), перезапуск фонового задания или повторный вход пользователя.
Чем константа отличается от параметра сеанса?
Константа хранится постоянно в базе и общая для всех сеансов. Параметр сеанса существует только в памяти текущего сеанса, инициализируется при его старте и исчезает при завершении — он не сохраняется в базе данных.
Как узнать, в какой таблице SQL лежит конкретная константа?
Используйте функцию ПолучитьСтруктуруХраненияБазыДанных() — она возвращает сопоставление объектов метаданных и таблиц СУБД. Однако использовать эту информацию стоит только для диагностики, а не для прямых запросов на чтение или запись.
Что важно запомнить
Константа — одно значение на всю базу без истории; логически она живёт в дереве конфигурации, физически — в служебных таблицах СУБД. Читайте и меняйте значения через Константы.Имя.Получить()/Установить() или интерфейс настроек, не правьте таблицы базы напрямую, а для параметров с историей используйте периодические регистры сведений.