К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Разбираем, как получить значение константы в запросе 1С: обращение к таблице констант, параметры, функции, типичные ошибки и примеры кода на встроенном языке.

Константы в 1С хранят глобальные настройки конфигурации: валюту учёта, наименование организации, признаки использования функциональных опций. В отличие от справочников и документов, константа не является самостоятельной таблицей с произвольным именем в языке запросов — все константы физически хранятся в единой таблице Константы, и это определяет основной способ обращения к ним в запросе.

Задача «получить значение константы в запросе» возникает при построении отчётов на СКД, в динамических списках и при выборках, где значение константы нужно соединить с другими данными или вывести как поле результата. Существует несколько рабочих подходов: прямое обращение к виртуальной таблице констант, передача значения через параметр и использование выражений в схеме компоновки данных.

Выбор способа зависит от контекста. Если запрос выполняется программно и значение можно вычислить заранее, проще передать его параметром. Если запрос используется в отчёте СКД или динамическом списке, где нет возможности вмешаться в код, потребуется обращение к таблице Константы или настройка вычисляемых полей.

Как устроено хранение констант и почему это важно

Все константы конфигурации физически размещаются в одной служебной таблице. В языке запросов она доступна под именем Константы, а каждая константа становится полем этой таблицы с именем, заданным в конфигураторе. Таблица всегда содержит ровно одну строку, поэтому соединение с ней не размножает записи основной выборки.

Именно однострочная структура делает обращение к константам безопасным для производительности: левое соединение с таблицей Константы добавляет к каждой строке результата одно и то же значение без дублирования данных. Это принципиальное отличие от соединения со справочниками, где нужно следить за кратностью связи.

Прямое обращение к таблице Константы в запросе

Основной синтаксис выглядит так: в секции ИЗ указывается таблица Константы, а в списке полей — имя нужной константы через точку. Запрос вернёт одну строку с текущим значением.

ВЫБРАТЬ

Константы.ВалютаРегламентированногоУчета КАК Валюта,

Константы.НаименованиеОрганизации КАК Наименование

ИЗ

Константы КАК Константы

Если константа имеет составной тип, платформа вернёт фактически хранящееся значение без дополнительного приведения. Для констант-ссылок можно обращаться к реквизитам через точку, как с обычными ссылочными полями: Константы.ОсновнаяОрганизация.ИНН. Платформа автоматически построит соединение с таблицей справочника.

Такой запрос удобно выполнять в консоли запросов для быстрой проверки значений без перехода в режим предприятия. Это рабочий приём при отладке: одна консольная выборка показывает все нужные настройки сразу.

bsl
ВЫБРАТЬ Константы.ВалютаУчета КАК Валюта ИЗ Константы КАК Константы

Получение константы через соединение с основной выборкой

Чаще всего константа нужна не сама по себе, а как дополнительное поле в выборке документов или справочников — например, чтобы сравнить валюту документа с валютой учёта. Для этого таблица Константы присоединяется левым соединением без условия связи либо с условием ИСТИНА.

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

Реализация.Валюта КАК ВалютаДокумента,

Константы.ВалютаРегламентированногоУчета КАК ВалютаУчета,

ВЫБОР

КОГДА Реализация.Валюта = Константы.ВалютаРегламентированногоУчета

ТОГДА ИСТИНА

ИНАЧЕ ЛОЖЬ

КОНЕЦ КАК ВалютаСовпадает

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ЛЕВОЕ СОЕДИНЕНИЕ Константы КАК Константы

ПО (ИСТИНА)

Условие ПО (ИСТИНА) допустимо, потому что таблица констант содержит одну строку — декартово произведение вырождается в простое добавление колонки. Если бы в таблице было несколько строк, такое соединение привело бы к размножению записей и искажению итогов.

Полученное поле можно использовать в секции ГДЕ, ИТОГИ и в выражениях ВЫБОР. Это позволяет фильтровать документы по соответствию настройке прямо на уровне запроса, не выгружая данные в код для построчного сравнения.

Передача значения константы через параметр запроса

Когда запрос выполняется программно, значение константы часто проще получить в коде встроенного языка и передать в запрос параметром. Метод Константы.ИмяКонстанты.Получить() возвращает текущее значение, а Запрос.УстановитьПараметр() подставляет его в текст.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка КАК Документ

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Валюта = &ВалютаУчета";

Запрос.УстановитьПараметр("ВалютаУчета",

Константы.ВалютаРегламентированногоУчета.Получить());

Результат = Запрос.Выполнить().Выгрузить();

Параметрический вариант выигрывает в читаемости и производительности: оптимизатор СУБД работает с конкретным значением, а не с соединением, и может эффективнее использовать индексы. Также параметр легче отлаживать — его значение видно до выполнения запроса.

Ограничение подхода очевидно: он недоступен там, где текст запроса нельзя сопровождать кодом, — в динамических списках с флагом «произвольный запрос», в наборах данных СКД без программной обработки. В этих случаях остаётся обращение к таблице Константы.

Сравнение способов

Таблица Константы в запросе

Подходит для СКД, динамических списков и консоли запросов. Ограничение — скрытые соединения при разыменовании ссылок.

Параметр запроса

Подходит при программном выполнении. Быстрее и прозрачнее, но требует кода и недоступен в декларативных настройках.

Вычисляемое поле СКД

Подходит для отчётов, где значение нужно только вывести. Не участвует в фильтрации на уровне запроса.

Константы в отчётах на СКД и динамических списках

В схеме компоновки данных обращение к константе выполняется тем же синтаксисом таблицы Константы в тексте набора данных. Соединение с основной таблицей настраивается на закладке «Связи наборов данных» либо прямо в тексте запроса, если набор один.

Если значение константы нужно только показать в отчёте, а не фильтровать по нему, альтернатива — вычисляемое поле с выражением на языке выражений СКД. Однако вычисляемые поля не могут напрямую вызывать методы встроенного языка, поэтому для получения константы всё равно потребуется либо набор данных с таблицей констант, либо параметр, заполняемый в обработчике ПриКомпоновкеРезультата.

В динамических списках с произвольным запросом таблица Константы доступна без ограничений. Учитывайте, что изменение константы пользователем не обновит уже открытый список автоматически — потребуется обновление формы или повторное выполнение запроса.

Проверка результата и типичные ошибки

После написания запроса проверьте его в консоли запросов на копии базы или в тестовом контуре. Признак корректной работы — одна строка с актуальным значением при прямой выборке, либо одинаковое значение колонки константы во всех строках соединённой выборки. Если колонка пустая, хотя константа заполнена, проверьте точность имени поля: язык запросов не подскажет опечатку до выполнения.

Отдельный случай — константа с незаполненным значением. Для ссылочных типов запрос вернёт пустую ссылку, для строк — пустую строку, для чисел — ноль. Значение NULL появится только в соединениях при особых условиях, поэтому проверки вида ЕСТЬ NULL к полю константы обычно избыточны, но и не вредят.

Типичные ошибки
01
Обращение к константе как к отдельной таблице «Константа.ИмяКонстанты» — такой синтаксис не поддерживается, запрос завершится ошибкой.
02
Опечатка в имени поля таблицы Константы — ошибка проявится только при выполнении, а не при написании текста.
03
Соединение с таблицей Константы по условию на равенство полей основной таблицы — лишняя логика, которая может отсечь строки при пустых значениях.
04
Использование соединения вместо параметра в пакетных запросах — лишние операции в каждом запросе пакета.
05
Ожидание NULL для незаполненной константы — ссылочные константы возвращают пустую ссылку, а не NULL.
Контрольные точки

Как проверить результат

Прямая выборка из таблицы Константы
Норма

Одна строка с текущим значением константы

Тревожный признак

Пусто или ошибка «поле не найдено» — проверьте имя константы в конфигураторе

Соединение с выборкой документов
Норма

Во всех строках одинаковое значение колонки константы

Тревожный признак

Количество строк выросло или колонка пуста — ошибка в условии соединения

Параметр запроса
Норма

Значение параметра совпадает с Константы.Имя.Получить() в отладчике

Тревожный признак

Параметр пуст — константа не заполнена или перепутано имя

Частые вопросы о константах в запросах 1С

Можно ли обратиться к константе как к отдельной таблице «Константа.Имя»?

Нет. В языке запросов константы не образуют отдельных таблиц, в отличие от справочников и документов. Доступ возможен только через единую таблицу Константы, где каждая константа — поле. Попытка написать ИЗ Константа.ВалютаУчета приведёт к ошибке построения запроса.

Что быстрее: соединение с таблицей Константы или параметр?

Параметр обычно эффективнее, потому что оптимизатор СУБД получает конкретное значение и строит план под него. Соединение с однострочной таблицей тоже дёшево, но добавляет операцию в план. В разовых запросах разница незаметна, в массовых и пакетных — предпочтительнее параметр.

Как получить значение константы в запросе, если она имеет составной тип?

Поле вернёт фактически хранящееся значение. Если нужно отфильтровать только определённый тип, используйте оператор ВЫРАЗИТЬ(Константы.Поле КАК Справочник.НужныйТип) или проверку ТИПЗНАЧЕНИЯ() в секции условий.

Можно ли изменить значение константы через запрос?

Нет. Язык запросов 1С предназначен только для чтения данных. Изменение константы выполняется программно методом Константы.ИмяКонстанты.Установить(НовоеЗначение) или через менеджер константы в транзакции с контролем прав доступа.

Почему в отчёте СКД поле константы пустое, хотя она заполнена?

Чаще всего связь наборов данных настроена некорректно или поле не добавлено в ресурсы и выбранные поля. Проверьте текст набора данных в консоли СКД, убедитесь, что поле присутствует в выборке, и проверьте настройки связи по выражению-источнику.

Итог

Что важно запомнить

В запросе константа доступна как поле единой однострочной таблицы «Константы». При программном выполнении предпочтительнее передавать значение параметром через Константы.Имя.Получить(). Для СКД и динамических списков используйте соединение с таблицей Константы по условию ИСТИНА и проверяйте результат в консоли запросов.