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