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