1с запрос как получить значение константы

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Константы в платформе 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 констант сразу для отчета — сделайте один запрос к виртуальной таблице Константы․

Распространенные ошибки

  1. Ошибка в имени константы․ В запросе должно использоваться точное метаданное имя (например, ВалютаРегламентированногоУчета), а не синоним или представление․ Проверяйте в дереве конфигурации․
  2. Попытка записи через запрос․ Виртуальная таблица Константы доступна только для чтения (SELECT)․ Запись (INSERT/UPDATE) не поддерживается․ Для записи используйте только менеджер константы: Константы․Имя․Установить(Значение)․
  3. Игнорирование NULL․ Если константа не заполнена, сравнение ГДЕ Поле = Константы․Конст․Значение не отберет записи, где Поле тоже NULL․ Используйте ЕСТЬNULL(Константы․Конст․Значение, ЗНАЧЕНИЕ(Справочник․Тип․ПустаяСсылка)) или проверку ЕСТЬ NULL․
  4. Использование в клиентском запросе без &НаСервере․ Выполнение запроса к БД возможно только на сервере․ Код с Запрос․Выполнить должен выполняться в процедуре с директивой &НаСервере или &НаСервереБезКонтекста․

Динамическое получение имени константы (метаданные)

Иногда имя константы известно только во время выполнения (хранится в строке)․ В тексте запроса имя константы должно быть статичным․ В таком случае есть два пути:

  1. Получить значение в коде и передать параметром (рекомендуется, см․ Пример 4)․
  2. Сформировать текст запроса динамически (менее безопасно, риск инъекций, сложнее поддержка)․
ИмяКонстантыСтрокой = "ВалютаРегламентированногоУчета";

// Способ 1: Через параметр (БЕЗОПАСНО)
Значение = Константы[ИмяКонстантыСтрокой]․Получить; // Доступ по строке к менеджеру
Запрос․УстановитьПараметр("Вал", Значение);

// Способ 2: Динамический текст (ЕСЛИ ОЧЕНЬ НУЖНО В ТЕКСТЕ ЗАПРОСА)
// Нужно быть уверенным, что ИмяКонстантыСтрокой безопасно (проверено по метаданным)
Если Метаданные․Константы․НайтиПоИмени(ИмяКонстантыСтрокой) <> Неопределено Тогда
 Запрос․Текст = "ВЫБРАТЬ Константы․" + ИмяКонстантыСтрокой + "․Значение ИЗ Константы․" + ИмяКонстантыСтрокой;
КонецЕсли;

Получение значения константы в запросе 1С — это стандартная и полностью поддерживаемая платформой операция․ Ключевой момент — использование виртуальной таблицы Константы․<ИмяКонстанты> в секции ИЗ и обращение к полю Значение․

Правильный выбор между программным доступом (Получить) и запросом зависит от контекста: для бизнес-логики на сервере лучше код, для выборок и отчетов — запрос․ Соблюдение этих правил позволит писать производительный и понятный код на платформе 1С:Предприятие 8․3․