Работа с константами в 1С:Предприятие — одна из базовых задач, с которой сталкиваются разработчики при написании запросов. Константы хранят глобальные настройки системы (например, название организации, курс валюты или адрес склада), и их корректное извлечение напрямую влияет на логику работы отчетов, обработок и других механизмов. Однако синтаксис запросов к константам имеет свои особенности, которые часто вызывают вопросы у новичков.
В этой статье мы разберем все способы получения констант в запросах 1С 8.3 и 1С 8.2, включая работу с виртуальными таблицами, прямые обращения через точку и использование функций. Особое внимание уделим типичным ошибкам, которые приводят к пустым результатам или падению производительности. Если вы когда-либо получали сообщение "Поле не найдено (Константа)" — этот материал поможет разобраться в причинах и исправить код.
Несмотря на кажущуюся простоту, работа с константами в запросах требует понимания их внутренней структуры. Например, константы могут быть как простыми (строка, число), так и составными (объект с реквизитами). Это влияет на способ их извлечения. Кроме того, в разных версиях платформы 1С синтаксис может незначительно отличаться, что важно учитывать при переносе кода между конфигурациями.
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);
Попытка использовать ОБНОВИТЬ или ДЛЯ ИЗМЕНЕНИЯ в запросе к виртуальной таблице Константа приведет к ошибке.
Как получить значение константы в запросе к внешней базе?
При работе с распределенными базами или внешними источниками данных виртуальные таблицы констант недоступны. В этом случае:
- Получите значение константы в основной базе через
Константы.Имя.Получить(). - Передайте его как параметр во внешний запрос.
Пример:
КурсДоллара = Константы.КурсДоллара.Получить();
ВнешнийЗапрос = Новый Запрос("ВЫБРАТЬ Сумма / &Курс КАК СуммаВДолларах ИЗ Документ");
ВнешнийЗапрос.УстановитьПараметр("Курс", КурсДоллара);