Константы в платформе 1С:Предприятие 8 предназначены для хранения единичных значений, которые не зависят от периода времени и общих для всей информационной базы (например, основная валюта, наименование организации, настройки учета и т․д․)․ Часто возникает необходимость получить значение константы не через программный код (метод Получить), а прямо внутри текста запроса к базе данных․ В этой статье подробно разберем все способы реализации этой задачи․
Основной синтаксис: виртуальная таблица «Константы»
В языке запросов 1С существует виртуальная таблица Константы, которая позволяет читать значения констант․ Обращение к ней осуществляется так же, как к любой другой таблице запроса․
Синтаксис в тексте запроса:
ВЫБРАТЬ
Константы․<ИмяКонстанты> КАК <Псевдоним>
ИЗ
Константы․<ИмяКонстанты> Важные нюансы:
- Имя константы указывается именно так, как оно задано в дереве метаданных (в конфигураторе), без префикса «Константы․» в части
ИЗ(хотя платформа часто понимает и с префиксом, стандарт, просто имя)․ - В части
ВЫБРАТЬполе называется Значение (или можно использовать само имя константы как поле, но явное указаниеКонстанты․ИмяКонстанты․Значениеили простоЗначениепри джойне предпочтительнее для ясности)․ - Таблица
Константы․ИмяКонстантывсегда содержит ровно одну строку (или ноль, если константа не установлена, но платформа обычно создает запись со значением по умолчанию или NULL)․
Примеры использования
Пример 1: Простое получение значения одной константы
Пусть у нас есть константа ВалютаРегламентированногоУчета (тип: СправочникСсылка․Валюты)․
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
| Константы․ВалютаРегламентированногоУчета․Значение КАК ВалютаРеглУчета
|ИЗ
| Константы․ВалютаРегламентированногоУчета";
Результат = Запрос․Выполнить;
Выборка = Результат․Выбрать;
Если Выборка․Следующий Тогда
Сообщить("Валюта регл․ учета: " + Выборка․ВалютаРеглУчета);
КонецЕсли; Пример 2: Получение нескольких констант за один запрос
Для оптимизации производительности лучше получить все нужные константы в одном запросе, используя соединение (JOIN) или перечисление в секции FROM ( декартово произведение, так как каждая таблица констант, одна строка)․
Запрос․Текст =
"ВЫБРАТЬ
| Константы․НаименованиеОрганизации․Значение КАК НаимОрг,
| Константы․Директор․Значение КАК Директор,
| Константы․ГлавныйБухгалтер․Значение КАК ГлБух
|ИЗ
| Константы․НаименованиеОрганизации,
| Константы․Директор,
| Константы․ГлавныйБухгалтер"; Примечание: Поскольку каждая виртуальная таблица константы возвращает ровно 1 строку, их перечисление через запятую в секции ИЗ ( декартово произведение) не приведет к размножению строк и работает очень быстро․
Пример 3: Использование константы в условии отбора (ГДЕ)
Частая задача, отобрать документы или справочники, где реквизит совпадает со значением константы․
Запрос․Текст =
"ВЫБРАТЬ
| Номенклатура․Ссылка,
| Номенклатура․Наименование
|ИЗ
| Справочник․Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура․ВидНоменклатуры = Константы․ВидНоменклатурыУслуги․Значение"; Пример 4: Константа в параметрах запроса (альтернативный способ)
Иногда удобнее передать значение константы в запрос как параметр, особенно если запрос сложный и константа используется в нескольких местах․ Это также позволяет избежать лишних обращений к системной таблице констант внутри СУБД․
// На стороне клиента или сервера (вне запроса)
ЗначениеКонстанты = Константы․МояКонстанта․Получить;
Запрос = Новый Запрос;
Запрос․Текст =
"ВЫБРАТЬ
| Товары․Наименование
|ИЗ
| Справочник․Номенклатура КАК Товары
|ГДЕ
| Товары․Категория = &ПараметрКатегории";
Запрос․УстановитьПараметр("ПараметрКатегории", ЗначениеКонстанты); Особенности типов данных и значений
- Простые типы (Число, Строка, Дата, Булево, Перечисление): Возвращаются как есть․
- Ссылочные типы (Справочники, Документы, Планы видов характеристик и т․д․): Возвращаются как значение типа Ссылка (Ref)․ В запросе с ними можно делать соединения (JOIN) с соответствующими таблицами справочников/документов․
- NULL: Если константа не имела значения по умолчанию и в нее никогда не записывали, в запросе вернется
NULL․ При сравнении с NULL в 1С используется конструкцияЕСТЬ NULLилиНЕ ЕСТЬ NULL․ Оператор= NULLне сработает (вернет UNKNOWN)․
Программное получение vs Запрос: что выбрать?
| Критерий | Константы․Имя․Получить (Код) | Запрос (Константы․Имя) |
|---|---|---|
| Производительность (одиночное чтение) | Очень высокая (кэшируется платформой) | Высокая, но есть накладные расходы на выполнение запроса |
| Чтение пачкой (много констант) | Требует цикла или множественных вызовов | Оптимально — один запрос на все константы |
| Использование в условиях отбора (ГДЕ/СОЕДИНЕНИЕ) | Нельзя использовать напрямую в SQL | Единственный способ использовать на уровне СУБД |
| Доступность на клиенте | Требует вызова сервера (если нет кэша) | Требует выполнения запроса на сервере |
Резюме:
- Если нужно просто прочитать значение для логики программы (условия, заполнение реквизитов формы) — используйте
Константы․ИмяКонстанты․Получить․ Это быстрее и читаемее․ - Если значение нужно использовать внутри другого запроса (в
ГДЕ,СОЕДИНЕНИЕ,ВЫБРАТЬ) — вставляйте виртуальную таблицу константы прямо в текст запроса․ - Если нужно прочитать 5-10 констант сразу для отчета — сделайте один запрос к виртуальной таблице
Константы․
Распространенные ошибки
- Ошибка в имени константы․ В запросе должно использоваться точное метаданное имя (например,
ВалютаРегламентированногоУчета), а не синоним или представление․ Проверяйте в дереве конфигурации․ - Попытка записи через запрос․ Виртуальная таблица
Константы доступна только для чтения (SELECT)․ Запись (INSERT/UPDATE) не поддерживается․ Для записи используйте только менеджер константы:Константы․Имя․Установить(Значение)․ - Игнорирование NULL․ Если константа не заполнена, сравнение
ГДЕ Поле = Константы․Конст․Значениене отберет записи, где Поле тоже NULL․ ИспользуйтеЕСТЬNULL(Константы․Конст․Значение, ЗНАЧЕНИЕ(Справочник․Тип․ПустаяСсылка))или проверкуЕСТЬ NULL․ - Использование в клиентском запросе без &НаСервере․ Выполнение запроса к БД возможно только на сервере․ Код с
Запрос․Выполнитьдолжен выполняться в процедуре с директивой&НаСервереили&НаСервереБезКонтекста․
Динамическое получение имени константы (метаданные)
Иногда имя константы известно только во время выполнения (хранится в строке)․ В тексте запроса имя константы должно быть статичным․ В таком случае есть два пути:
- Получить значение в коде и передать параметром (рекомендуется, см․ Пример 4)․
- Сформировать текст запроса динамически (менее безопасно, риск инъекций, сложнее поддержка)․
ИмяКонстантыСтрокой = "ВалютаРегламентированногоУчета";
// Способ 1: Через параметр (БЕЗОПАСНО)
Значение = Константы[ИмяКонстантыСтрокой]․Получить; // Доступ по строке к менеджеру
Запрос․УстановитьПараметр("Вал", Значение);
// Способ 2: Динамический текст (ЕСЛИ ОЧЕНЬ НУЖНО В ТЕКСТЕ ЗАПРОСА)
// Нужно быть уверенным, что ИмяКонстантыСтрокой безопасно (проверено по метаданным)
Если Метаданные․Константы․НайтиПоИмени(ИмяКонстантыСтрокой) <> Неопределено Тогда
Запрос․Текст = "ВЫБРАТЬ Константы․" + ИмяКонстантыСтрокой + "․Значение ИЗ Константы․" + ИмяКонстантыСтрокой;
КонецЕсли; Получение значения константы в запросе 1С — это стандартная и полностью поддерживаемая платформой операция․ Ключевой момент — использование виртуальной таблицы Константы․<ИмяКонстанты> в секции ИЗ и обращение к полю Значение․
Правильный выбор между программным доступом (Получить) и запросом зависит от контекста: для бизнес-логики на сервере лучше код, для выборок и отчетов — запрос․ Соблюдение этих правил позволит писать производительный и понятный код на платформе 1С:Предприятие 8․3․