Разработка и Конфигурация · 10 мин
Как получить значение константы в запросе 1С
Разбираем, как получить значение константы в запросе 1С: обращение к таблице констант, параметры, функции, типичные ошибки и примеры кода на встроенном языке.
Константы в 1С хранят глобальные настройки конфигурации: валюту учёта, наименование организации, признаки использования функциональных опций. В отличие от справочников и документов, константа не является самостоятельной таблицей с произвольным именем в языке запросов — все константы физически хранятся в единой таблице Константы, и это определяет основной способ обращения к ним в запросе.
Задача «получить значение константы в запросе» возникает при построении отчётов на СКД, в динамических списках и при выборках, где значение константы нужно соединить с другими данными или вывести как поле результата. Существует несколько рабочих подходов: прямое обращение к виртуальной таблице констант, передача значения через параметр и использование выражений в схеме компоновки данных.
Выбор способа зависит от контекста. Если запрос выполняется программно и значение можно вычислить заранее, проще передать его параметром. Если запрос используется в отчёте СКД или динамическом списке, где нет возможности вмешаться в код, потребуется обращение к таблице Константы или настройка вычисляемых полей.
Как устроено хранение констант и почему это важно
Все константы конфигурации физически размещаются в одной служебной таблице. В языке запросов она доступна под именем Константы, а каждая константа становится полем этой таблицы с именем, заданным в конфигураторе. Таблица всегда содержит ровно одну строку, поэтому соединение с ней не размножает записи основной выборки.
Именно однострочная структура делает обращение к константам безопасным для производительности: левое соединение с таблицей Константы добавляет к каждой строке результата одно и то же значение без дублирования данных. Это принципиальное отличие от соединения со справочниками, где нужно следить за кратностью связи.
Прямое обращение к таблице Константы в запросе
Основной синтаксис выглядит так: в секции ИЗ указывается таблица Константы, а в списке полей — имя нужной константы через точку. Запрос вернёт одну строку с текущим значением.
ВЫБРАТЬ
Константы.ВалютаРегламентированногоУчета КАК Валюта,
Константы.НаименованиеОрганизации КАК Наименование
ИЗ
Константы КАК Константы
Если константа имеет составной тип, платформа вернёт фактически хранящееся значение без дополнительного приведения. Для констант-ссылок можно обращаться к реквизитам через точку, как с обычными ссылочными полями: Константы.ОсновнаяОрганизация.ИНН. Платформа автоматически построит соединение с таблицей справочника.
Такой запрос удобно выполнять в консоли запросов для быстрой проверки значений без перехода в режим предприятия. Это рабочий приём при отладке: одна консольная выборка показывает все нужные настройки сразу.
ВЫБРАТЬ Константы.ВалютаУчета КАК Валюта ИЗ Константы КАК КонстантыПолучение константы через соединение с основной выборкой
Чаще всего константа нужна не сама по себе, а как дополнительное поле в выборке документов или справочников — например, чтобы сравнить валюту документа с валютой учёта. Для этого таблица Константы присоединяется левым соединением без условия связи либо с условием ИСТИНА.
ВЫБРАТЬ
Реализация.Ссылка КАК Документ,
Реализация.Валюта КАК ВалютаДокумента,
Константы.ВалютаРегламентированногоУчета КАК ВалютаУчета,
ВЫБОР
КОГДА Реализация.Валюта = Константы.ВалютаРегламентированногоУчета
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ВалютаСовпадает
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Константы КАК Константы
ПО (ИСТИНА)
Условие ПО (ИСТИНА) допустимо, потому что таблица констант содержит одну строку — декартово произведение вырождается в простое добавление колонки. Если бы в таблице было несколько строк, такое соединение привело бы к размножению записей и искажению итогов.
Полученное поле можно использовать в секции ГДЕ, ИТОГИ и в выражениях ВЫБОР. Это позволяет фильтровать документы по соответствию настройке прямо на уровне запроса, не выгружая данные в код для построчного сравнения.
Передача значения константы через параметр запроса
Когда запрос выполняется программно, значение константы часто проще получить в коде встроенного языка и передать в запрос параметром. Метод Константы.ИмяКонстанты.Получить() возвращает текущее значение, а Запрос.УстановитьПараметр() подставляет его в текст.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Валюта = &ВалютаУчета";
Запрос.УстановитьПараметр("ВалютаУчета",
Константы.ВалютаРегламентированногоУчета.Получить());
Результат = Запрос.Выполнить().Выгрузить();
Параметрический вариант выигрывает в читаемости и производительности: оптимизатор СУБД работает с конкретным значением, а не с соединением, и может эффективнее использовать индексы. Также параметр легче отлаживать — его значение видно до выполнения запроса.
Ограничение подхода очевидно: он недоступен там, где текст запроса нельзя сопровождать кодом, — в динамических списках с флагом «произвольный запрос», в наборах данных СКД без программной обработки. В этих случаях остаётся обращение к таблице Константы.
Сравнение способов
Подходит для СКД, динамических списков и консоли запросов. Ограничение — скрытые соединения при разыменовании ссылок.
Подходит при программном выполнении. Быстрее и прозрачнее, но требует кода и недоступен в декларативных настройках.
Подходит для отчётов, где значение нужно только вывести. Не участвует в фильтрации на уровне запроса.
Константы в отчётах на СКД и динамических списках
В схеме компоновки данных обращение к константе выполняется тем же синтаксисом таблицы Константы в тексте набора данных. Соединение с основной таблицей настраивается на закладке «Связи наборов данных» либо прямо в тексте запроса, если набор один.
Если значение константы нужно только показать в отчёте, а не фильтровать по нему, альтернатива — вычисляемое поле с выражением на языке выражений СКД. Однако вычисляемые поля не могут напрямую вызывать методы встроенного языка, поэтому для получения константы всё равно потребуется либо набор данных с таблицей констант, либо параметр, заполняемый в обработчике ПриКомпоновкеРезультата.
В динамических списках с произвольным запросом таблица Константы доступна без ограничений. Учитывайте, что изменение константы пользователем не обновит уже открытый список автоматически — потребуется обновление формы или повторное выполнение запроса.
Проверка результата и типичные ошибки
После написания запроса проверьте его в консоли запросов на копии базы или в тестовом контуре. Признак корректной работы — одна строка с актуальным значением при прямой выборке, либо одинаковое значение колонки константы во всех строках соединённой выборки. Если колонка пустая, хотя константа заполнена, проверьте точность имени поля: язык запросов не подскажет опечатку до выполнения.
Отдельный случай — константа с незаполненным значением. Для ссылочных типов запрос вернёт пустую ссылку, для строк — пустую строку, для чисел — ноль. Значение NULL появится только в соединениях при особых условиях, поэтому проверки вида ЕСТЬ NULL к полю константы обычно избыточны, но и не вредят.
Как проверить результат
Одна строка с текущим значением константы
Пусто или ошибка «поле не найдено» — проверьте имя константы в конфигураторе
Во всех строках одинаковое значение колонки константы
Количество строк выросло или колонка пуста — ошибка в условии соединения
Значение параметра совпадает с Константы.Имя.Получить() в отладчике
Параметр пуст — константа не заполнена или перепутано имя
Частые вопросы о константах в запросах 1С
Можно ли обратиться к константе как к отдельной таблице «Константа.Имя»?
Нет. В языке запросов константы не образуют отдельных таблиц, в отличие от справочников и документов. Доступ возможен только через единую таблицу Константы, где каждая константа — поле. Попытка написать ИЗ Константа.ВалютаУчета приведёт к ошибке построения запроса.
Что быстрее: соединение с таблицей Константы или параметр?
Параметр обычно эффективнее, потому что оптимизатор СУБД получает конкретное значение и строит план под него. Соединение с однострочной таблицей тоже дёшево, но добавляет операцию в план. В разовых запросах разница незаметна, в массовых и пакетных — предпочтительнее параметр.
Как получить значение константы в запросе, если она имеет составной тип?
Поле вернёт фактически хранящееся значение. Если нужно отфильтровать только определённый тип, используйте оператор ВЫРАЗИТЬ(Константы.Поле КАК Справочник.НужныйТип) или проверку ТИПЗНАЧЕНИЯ() в секции условий.
Можно ли изменить значение константы через запрос?
Нет. Язык запросов 1С предназначен только для чтения данных. Изменение константы выполняется программно методом Константы.ИмяКонстанты.Установить(НовоеЗначение) или через менеджер константы в транзакции с контролем прав доступа.
Почему в отчёте СКД поле константы пустое, хотя она заполнена?
Чаще всего связь наборов данных настроена некорректно или поле не добавлено в ресурсы и выбранные поля. Проверьте текст набора данных в консоли СКД, убедитесь, что поле присутствует в выборке, и проверьте настройки связи по выражению-источнику.
Что важно запомнить
В запросе константа доступна как поле единой однострочной таблицы «Константы». При программном выполнении предпочтительнее передавать значение параметром через Константы.Имя.Получить(). Для СКД и динамических списков используйте соединение с таблицей Константы по условию ИСТИНА и проверяйте результат в консоли запросов.