Работа с константами в 1С:Предприятие — одна из базовых задач, с которой сталкиваются разработчики при написании запросов. Константы хранят глобальные настройки системы (например, название организации, курс валюты или адрес склада), и их корректное извлечение напрямую влияет на логику работы отчетов, обработок и других механизмов. Однако синтаксис запросов к константам имеет свои особенности, которые часто вызывают вопросы у новичков.

В этой статье мы разберем все способы получения констант в запросах 1С 8.3 и 1С 8.2, включая работу с виртуальными таблицами, прямые обращения через точку и использование функций. Особое внимание уделим типичным ошибкам, которые приводят к пустым результатам или падению производительности. Если вы когда-либо получали сообщение "Поле не найдено (Константа)" — этот материал поможет разобраться в причинах и исправить код.

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

📊 С какой версией 1С вы работаете чаще?
1С 8.3 (управляемые формы)
1С 8.2 (обычные формы)
1С 7.7
Не знаю/Не помню

1. Что такое константы в 1С и зачем их получать в запросах

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

  • 📌 Название организации — для печати в документах;
  • 💰 Курс доллара — для пересчета валют;
  • 📍 Адрес главного склада — для логистических расчетов;
  • 🔄 Период блокировки редактирования — для контроля доступа.

В отличие от переменных, константы хранятся в базе данных и доступны всем пользователям. Их значения можно изменить только через специальный интерфейс (обычно в разделе "Администрирование" или "Настройки").

Запросы к константам нужны в следующих случаях:

  • 📊 Формирование отчетов — когда нужно подставить актуальное значение (например, текущий курс валюты) в расчет;
  • 🔍 Фильтрация данных — например, выбрать документы только текущей организации;
  • 🤖 Автоматизация процессов — когда логика работы обработки зависит от глобальных настроек.

Если попытаться получить константу напрямую через точку (например, Константы.НазваниеОрганизации) в теле запроса, платформа выдаст ошибку. Для корректной работы необходимо использовать специальные конструкции, о которых пойдет речь далее.

💡

Перед работой с константами в запросе проверьте их наличие в конфигураторе: откройте ветку Общие → Константы и убедитесь, что нужный объект существует.

2. Способы получения констант в запросах 1С

В 1С 8.3 и 1С 8.2 есть три основных способа извлечения констант в запросах. Каждый из них имеет свои плюсы и минусы, а также ограничения по производительности.

2.1. Использование виртуальной таблицы Константа

Самый универсальный и рекомендуемый способ — обращение к виртуальной таблице Константа. Она позволяет получить значение константы прямо в тексте запроса без дополнительных обращений к базе.

Синтаксис:

ВЫБРАТЬ

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

ИЗ

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

Примеры использования:

  • 🔹 Для простой константы (строка, число):
    ВЫБРАТЬ
    

    Константа.Значение КАК КурсДоллара

    ИЗ

    Константа.КурсДоллара КАК Константа

  • 🔹 Для составной константы (объект с реквизитами):
    ВЫБРАТЬ
    

    Константа.Значение.Наименование КАК НазваниеОрг,

    Константа.Значение.ИНН КАК ИННОрг

    ИЗ

    Константа.Организация КАК Константа

Преимущества метода:

  • ✅ Работает в любых версиях платформы;
  • ✅ Поддерживает составные константы;
  • ✅ Минимальная нагрузка на производительность.
Что делать, если виртуальная таблица не работает?

Если при обращении к виртуальной таблице Константа вы получаете ошибку "Объект не найден", проверьте:

1. Правильность написания имени константы (регистр не важен, но опечатки критичны).

2. Наличие константы в конфигурации (возможно, она была удалена или переименована).

3. Права доступа текущего пользователя к чтению констант.

2.2. Прямое обращение через точку (только вне запроса)

Важно понимать, что внутри текста запроса нельзя использовать конструкцию вида Константы.Название.Получить(). Однако вне запроса (например, в модуле обработки) это допустимо:

ЗначениеКонстанты = Константы.НазваниеОрганизации.Получить();

Если нужно передать значение константы в запрос как параметр, используйте следующий подход:

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

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

"ВЫБРАТЬ

| Документ.Сумма * &КурсДоллара КАК СуммаВВалюте

|ИЗ

| Документ.ПоступлениеТоваров КАК Документ";

Запрос.УстановитьПараметр("КурсДоллара", Константы.КурсДоллара.Получить());

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

Ограничения метода:

  • ❌ Не работает внутри текста запроса;
  • ❌ Требует дополнительных действий для передачи значения;
  • ❌ Может привести к ошибкам, если константа не существует.

2.3. Использование функции ЗначениеЗаполнено()

Если константа может быть не заполнена, используйте функцию ЗначениеЗаполнено() для проверки:

ВЫБРАТЬ

ЕСТЬNULL(Константа.Значение, "") КАК НазваниеОрганизации

ИЗ

Константа.Организация КАК Константа

ГДЕ

ЗначениеЗаполнено(Константа.Значение)

Это актуально для констант, которые не обязательны для заполнения (например, Логотип организации или Дополнительный телефон).

Убедитесь, что константа существует в конфигурации|Проверьте права доступа пользователя|Используйте виртуальную таблицу для запросов|Для составных констант укажите нужные реквизиты-->

3. Работа со составными константами

Составные константы (например, Организация или ОсновнойСклад) хранят не одно значение, а объект с набором реквизитов. Чтобы извлечь конкретное поле, используйте точечную нотацию:

ВЫБРАТЬ

Константа.Значение.Наименование КАК Название,

Константа.Значение.ИНН КАК ИНН,

Константа.Значение.КПП КАК КПП

ИЗ

Константа.Организация КАК Константа

Если нужно получить ссылку на объект (например, для дальнейшей работы с ним в коде), используйте конструкцию:

ВЫБРАТЬ

Константа.Значение.Ссылка КАК СсылкаНаОрганизацию

ИЗ

Константа.Организация КАК Константа

Типичная ошибка: попытка получить несуществующий реквизит составной константы. Например, если в константе Организация нет поля ОГРН, запрос завершится с ошибкой. Всегда сверяйтесь со структурой константы в конфигураторе!

Пример корректного запроса для составной константы ОсновнойСклад:

ВЫБРАТЬ

Константа.Значение.Наименование КАК НазваниеСклада,

Константа.Значение.Адрес КАК АдресСклада,

Константа.Значение.Ссылка КАК СсылкаНаСклад

ИЗ

Константа.ОсновнойСклад КАК Константа

💡

Для составных констант всегда указывайте конкретные реквизиты (Наименование, ИНН, Ссылка и т.д.). Извлечение всего объекта целиком в запросе невозможно.

4. Производительность: что быстрее?

При работе с константами в запросах важно учитывать их влияние на производительность. Ниже представлена сравнительная таблица методов:

Метод Скорость выполнения Поддержка составных констант Применимость
Виртуальная таблица Константа ⚡ Очень быстро ✅ Да Любые запросы
Параметр запроса (УстановитьПараметр) ⚡ Быстро ✅ Да Только если значение известно заранее
Прямое обращение (Константы.Имя.Получить()) 🐢 Медленно (дополнительный запрос к базе) ✅ Да Только вне текста запроса
Глобальный контекст (переменная модуля) ⚡ Быстро ❌ Нет (только простые значения) Если значение константы не меняется

Для максимальной производительности рекомендуется:

  • 🔹 Использовать виртуальные таблицы для одноразовых запросов;
  • 🔹 Передавать значение константы как параметр, если оно используется многократно;
  • 🔹 Избегать прямых обращений к Константы.Имя.Получить() внутри циклов.

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

5. Типичные ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с ошибками при работе с константами в запросах. Рассмотрим наиболее распространенные случаи:

5.1. Ошибка: "Поле не найдено (Константа)"

Причина: неверное имя константы или опечатка. Например, в конфигурации есть константа ОсновнаяОрганизация, а в запросе указано Организация.

Решение: проверьте точное имя константы в конфигураторе (раздел Общие → Константы).

5.2. Ошибка: "Недопустимое использование виртуальной таблицы"

Причина: попытка использовать виртуальную таблицу Константа в контексте, где она не поддерживается (например, в запросе к регистру накопления с отбором по периоду).

Решение: извлеките значение константы заранее и передайте его как параметр:

КурсДоллара = Константы.КурсДоллара.Получить();

Запрос.УстановитьПараметр("Курс", КурсДоллара);

5.3. Пустой результат при выборке составной константы

Причина: запрашиваемый реквизит не существует в структуре константы. Например, попытка получить Константа.Значение.ОГРН, когда в константе Организация этого поля нет.

Решение: проверьте структуру константы в конфигураторе или используйте ЕСТЬNULL для подстраховки:

ВЫБРАТЬ

ЕСТЬNULL(Константа.Значение.ОГРН, "") КАК ОГРН

ИЗ

Константа.Организация КАК Константа

5.4. Ошибка прав доступа

Причина: у текущего пользователя нет прав на чтение константы. Это актуально для констант с ограниченным доступом (например, Пароль администратора).

Решение: проверьте права роли пользователя в конфигураторе (раздел Администрирование → Пользователи).

Как отладить запрос с константой?

Если запрос с константой возвращает неожиданный результат:

1. Выполните запрос без отборов, чтобы убедиться в наличии данных.

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

3. Используйте конструктор запросов в конфигураторе для визуальной проверки синтаксиса.

6. Практические примеры использования

Рассмотрим реальные сценарии, где получение констант в запросах необходимо.

6.1. Отчет по продажам с учетом текущего курса валюты

Задача: сформировать отчет по продажам в долларах, используя актуальный курс из константы.

Решение:

ВЫБРАТЬ

Документ.Контрагент КАК Контрагент,

Документ.Сумма / Константа.Значение КАК СуммаВДолларах

ИЗ

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

Константа.КурсДоллара КАК Константа

ГДЕ

Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

6.2. Фильтрация документов по текущей организации

Задача: выбрать документы только для организации, указанной в константе ТекущаяОрганизация.

Решение:

ВЫБРАТЬ

Документ.Номер,

Документ.Дата,

Документ.Сумма

ИЗ

Документ.ПоступлениеТоваров КАК Документ

ГДЕ

Документ.Организация = Константа.Значение.Ссылка

И Документ.Дата МЕЖДУ &Начало И &Конец

Здесь Константа.Значение.Ссылка возвращает ссылку на объект Организация, по которой происходит сравнение.

6.3. Получение адреса главного склада для печати

Задача: добавить адрес склада из константы в печатную форму документа.

Решение:

ВЫБРАТЬ

Константа.Значение.Адрес КАК АдресСклада,

Константа.Значение.Телефон КАК ТелефонСклада

ИЗ

Константа.ОсновнойСклад КАК Константа

Результат запроса можно передать в макет печатной формы.

💡

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

7. Альтернативные подходы: когда констант недостаточно

Иногда константы не подходят для хранения данных. Рассмотрим альтернативы:

7.1. Параметры сеанса

Если значение должно быть уникальным для каждого пользователя (например, Текущий склад пользователя), используйте параметры сеанса:

ПараметрыСеанса.ТекущийСклад = Склад.НайтиПоНаименованию("Склад №1");

7.2. Регистры сведений

Для хранения исторических данных (например, курсы валют по датам) лучше подходит регистр сведений:

ВЫБРАТЬ

КурсВалют.Курс КАК КурсДоллара

ИЗ

РегистрСведений.КурсыВалют КАК КурсВалют

ГДЕ

КурсВалют.Валюта = &ВалютаДоллар

И КурсВалют.Период = &ТекущаяДата

7.3. Переменные модуля

Если значение константы редко меняется (например, версия программы), его можно кэшировать в переменной модуля:

Перем ВерсияПрограммы;

Процедура ПриНачалеРаботыСистемы()

ВерсияПрограммы = Константы.ВерсияПрограммы.Получить();

КонецПроцедуры

Это ускорит доступ к значению, так как не потребуется обращаться к базе при каждом запросе.

📊 Какой метод хранения глобальных настроек вы используете чаще?
Константы
Регистры сведений
Параметры сеанса
Переменные модуля

8. Советы по оптимизации и безопасности

При работе с константами в запросах следуйте этим рекомендациям:

  • 🔒 Ограничивайте права доступа к константам с конфиденциальными данными (например, ПарольЭлектроннойПочты). Настройте роли так, чтобы только администраторы могли их изменять.
  • 📈 Кэшируйте значения часто используемых констант в переменных модуля, чтобы сократить количество обращений к базе.
  • 🔍 Используйте отладчик для проверки значений констант перед использованием в запросах. Это поможет избежать ошибок из-за неверных данных.
  • 📝 Документируйте назначение каждой константы в конфигурации (через комментарии или описание). Это упростит поддержку кода другим разработчикам.

Если константа используется в регламентных заданиях или фоновых процессах, убедитесь, что ее значение не меняется во время выполнения задачи. Например, если курс валюты обновляется ночью, а отчет формируется днем, используйте фиксированное значение на момент запуска:

КурсДоллара = Константы.КурсДоллара.Получить();

// Далее в коде используем переменную КурсДоллара, а не обращаемся к константе повторно

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

💡

Для констант, которые меняются реже чем раз в день (например, реквизиты организации), настройте автоматическое резервное копирование их значений. Это поможет быстро восстановить данные при сбое.

⚠️ Внимание: В некоторых конфигурациях (например, 1С:ERP или 1С:Управление холдингом) константы могут быть заменены на регистры сведений или планы обмена. Всегда сверяйтесь с документацией конкретной конфигурации перед написанием кода.

FAQ: Частые вопросы по работе с константами в запросах

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

Да, но для каждой константы нужно использовать отдельную виртуальную таблицу. Пример:

ВЫБРАТЬ

Орг.Значение.Наименование КАК Организация,

Курс.Значение КАК КурсДоллара

ИЗ

Константа.Организация КАК Орг,

Константа.КурсДоллара КАК Курс

Обратите внимание, что это приведет к декартову произведению (все комбинации значений). Если константы не связаны, лучше получить их в отдельных запросах.

Как получить значение константы в запросе с объединением (UNION)?

В каждом подзапросе UNION нужно повторно обращаться к виртуальной таблице константы. Пример:

ВЫБРАТЬ

Документ.Номер,

Константа.Значение КАК Курс

ИЗ

Документ.Поступление КАК Документ,

Константа.КурсДоллара КАК Константа

ОБЪЕДИНИТЬ

ВЫБРАТЬ

Документ.Номер,

Константа.Значение КАК Курс

ИЗ

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

Константа.КурсДоллара КАК Константа

Это неоптимально с точки зрения производительности. В таких случаях лучше извлечь значение константы заранее и передать его как параметр.

Почему запрос с константой работает медленно?

Частые причины:

  • 🔹 Константа является составной и имеет много реквизитов. Укажите только нужные поля.
  • 🔹 В запросе используется ДЛЯ ИЗМЕНЕНИЯ — это блокирует таблицы и замедляет выполнение.
  • 🔹 Константа хранит большой объект (например, двоичные данные). Попробуйте оптимизировать структуру.

Для диагностики используйте план выполнения запроса в конфигураторе.

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

Нет, константы предназначены только для чтения в запросах. Для изменения значения используйте метод Установить():

Константы.КурсДоллара.Установить(75.50);

Попытка использовать ОБНОВИТЬ или ДЛЯ ИЗМЕНЕНИЯ в запросе к виртуальной таблице Константа приведет к ошибке.

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

При работе с распределенными базами или внешними источниками данных виртуальные таблицы констант недоступны. В этом случае:

  1. Получите значение константы в основной базе через Константы.Имя.Получить().
  2. Передайте его как параметр во внешний запрос.

Пример:

КурсДоллара = Константы.КурсДоллара.Получить();

ВнешнийЗапрос = Новый Запрос("ВЫБРАТЬ Сумма / &Курс КАК СуммаВДолларах ИЗ Документ");

ВнешнийЗапрос.УстановитьПараметр("Курс", КурсДоллара);