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

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

Как обращаться к константе в 1С

Как обращаться к константе в 1С: синтаксис Константы.ИмяКонстанты, менеджеры значений, работа в формах и запросах, типичные ошибки и примеры кода.

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

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

Ниже разобраны все основные способы обращения к константе: через менеджер констант, через набор констант, в запросах и в формах, а также типичные ошибки, которые приводят к падению кода или неочевидному поведению.

Что такое константа в 1С и когда её использовать

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

Типичные применения: наименование и реквизиты собственной организации, текущая валюта регламентированного учёта, флаги включения подсистем («Вести складской учёт», «Использовать серии номенклатуры»), параметры интеграций — адреса веб-сервисов, токены. Хороший признак того, что нужна константа: значение одно на всю базу и меняется редко, вручную администратором или при настройке.

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

Чтение значения константы

Самый распространённый способ — метод Получить() менеджера константы. Он возвращает текущее значение, приведённое к типу, указанному в конфигураторе:

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

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

ИспользоватьСерии = Константы.ИспользоватьСерииНоменклатуры.Получить();

Если константа имеет составной тип и значение не заполнено, Получить() вернёт значение по умолчанию для типа (пустая строка, ноль, пустая ссылка, Неопределено), а не ошибку. Поэтому перед использованием результата в логике полезно проверять заполненность через ЗначениеЗаполнено() — иначе алгоритм молча отработает на пустых данных.

Чтение константы — дешёвая операция, но в массовых циклах всё же лучше прочитать значение один раз в переменную до цикла. Каждый вызов Получить() на сервере в файловой базе не критичен, однако в клиент-серверном варианте лишние серверные вызовы из клиентского кода заметно замедляют работу.

bsl
ВалютаУчета = Константы.ВалютаРегламентированногоУчета.Получить();
Если НЕ ЗначениеЗаполнено(ВалютаУчета) Тогда
    ВызватьИсключение "Не заполнена константа 'Валюта регламентированного учета'";
КонецЕсли;

Запись значения константы

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

Константы.НаименованиеОрганизации.Установить("ООО «Пример»");

Константы.ИспользоватьСерииНоменклатуры.Установить(Истина);

Если передать значение несовместимого типа — например, строку в константу типа «СправочникСсылка.Валюты» — платформа выдаст ошибку несоответствия типов при выполнении. При составном типе значение должно входить в перечень допустимых типов, заданных в конфигураторе.

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

Работа с несколькими константами: набор констант

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

Набор = Константы.СоздатьНабор("АдресСервиса, ТокенДоступа, ТаймаутСоединения");

Набор.Прочитать();

Адрес = Набор.АдресСервиса;

Набор.ТаймаутСоединения = 60;

Набор.Записать();

Метод Записать() набора сохраняет все входящие в него константы в одной транзакции — это защищает от ситуации, когда часть настроек записалась, а часть нет из-за ошибки посередине. Именно поэтому для взаимосвязанных настроек набор предпочтительнее серии вызовов Установить().

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

Обращение к константе в запросе

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

ВЫБРАТЬ

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

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

ИЗ

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

Чаще константу в запросе используют для соединения с другими таблицами — например, чтобы отобрать документы только в валюте учёта, не передавая её параметром из кода. Это удобно, но в больших запросах соединение с таблицей Константы добавляет лишнее соединение; если значение известно заранее, передача параметром (&Валюта) обычно читабельнее и быстрее.

Учтите ограничение: в запросе константа доступна только для чтения. Записать значение через запрос нельзя — для этого существуют только Установить() и набор констант.

Способы обращения к константе

Константы.Имя.Получить() / Установить()

Подходит для одиночного чтения или записи. Простой синтаксис, но каждая запись — отдельная операция.

Набор констант

Для группы связанных констант. Запись в одной транзакции, удобен в формах настроек.

Запрос (таблица Константы)

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

Константы в формах и на клиенте

В управляемой форме константу выводят через реквизит формы с типом, совпадающим с типом константы. При создании формы на сервере значение читают через Получить() и помещают в реквизит, а при записи — сохраняют через Установить(). Для форм настроек удобнее весь набор констант сделать реквизитом формы типа «КонстантыНабор» — тогда чтение и запись выполняются стандартными методами формы.

Важное ограничение: в клиентском контексте тонкого и веб-клиента прямое обращение Константы.Имя.Получить() недоступно — менеджеры объектов работают только на сервере. Из клиентского кода нужно вызывать серверную процедуру (с директивой &НаСервере или через серверный общий модуль), которая вернёт значение. Попытка обратиться к менеджеру констант на клиенте приведёт к ошибке компиляции или выполнения.

Если значение константы нужно на клиенте часто (например, признак функциональности), оптимально прочитать его один раз при открытии формы и хранить в реквизите или параметре формы, а не дёргать сервер при каждом обращении.

Как вывести константу на форму настроек
  1. 1
    Создайте форму и добавьте реквизит типа КонстантыНабор с нужными константами
  2. 2
    В обработчике ПриСозданииНаСервере вызовите чтение набора
  3. 3
    Разместите элементы формы, связанные с полями набора
  4. 4
    В команде записи вызовите Записать() у набора и проверьте сохранение повторным открытием

Функциональные опции и права доступа к константам

Многие константы в типовых конфигурациях являются значениями функциональных опций — от них зависит видимость элементов интерфейса и доступность подсистем. Меняя такую константу программно, вы фактически включаете или отключаете функциональность, поэтому изменение стоит журналировать и выполнять осознанно, а не «на всякий случай» в обработчиках.

На константы распространяются права доступа: чтение, изменение, а также ограничение на уровне записей (RLS) к ним не применяется. Если у пользователя нет права на изменение константы, вызов Установить() под его сеансом завершится ошибкой нарушения прав. В фоновых заданиях и привилегированных модулях код выполняется без проверки прав — это способ обойти ограничение, но использовать его нужно осознанно, понимая, что запись произойдёт даже у пользователя без полномочий.

Типичные ошибки при работе с константами
01
Обращение к константе на клиенте — менеджеры доступны только на сервере, код падает с ошибкой
02
Использование константы для исторических данных — старые значения теряются, нужен периодический регистр сведений
03
Запись константы в цикле или при каждом проведении — лишняя нагрузка и блокировки таблицы констант
04
Отсутствие проверки заполненности после Получить() — алгоритм молча работает с пустым значением
05
Попытка записать константу через запрос — в языке запросов константы доступны только для чтения

Проверка результата и отладка

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

Если код «не видит» константу, проверьте три вещи: правильность имени (оно должно совпадать с именем в конфигураторе, а не с синонимом), контекст выполнения (сервер или клиент) и наличие самой константы в конфигурации после обновления — при переименовании объекта старый код перестаёт компилироваться.

Контрольные точки

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

Чтение после записи
Норма

Получить() возвращает установленное значение

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

Возвращается старое или пустое значение — запись не выполнилась

Контекст выполнения
Норма

Обращение к менеджеру в серверном коде

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

Ошибка при вызове из клиентской процедуры

Тип значения
Норма

Тип соответствует типу константы в конфигураторе

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

Ошибка несоответствия типов при Установить()

Часто задаваемые вопросы

Можно ли обратиться к константе по имени, хранящемуся в строке?

Да, менеджер констант поддерживает обращение через квадратные скобки: Константы["ИмяКонстанты"].Получить(). Это удобно для универсальных обработок, где имя константы приходит параметром. Перед обращением стоит проверить существование объекта метаданных через Метаданные.Константы.Найти(Имя), иначе при неверном имени будет ошибка.

Чем константа отличается от параметра сеанса?

Константа хранится постоянно в базе и одна для всех пользователей. Параметр сеанса существует только в рамках сеанса конкретного пользователя, устанавливается при его старте и не сохраняется между сеансами. Для общих настроек системы — константа, для данных текущего пользователя (например, его подразделение) — параметр сеанса.

Почему Получить() возвращает пустое значение, хотя константа заполнена в форме?

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

Как безопасно изменить несколько констант одновременно?

Используйте Константы.СоздатьНабор() с перечнем имён, измените значения как свойства набора и вызовите Записать() — все константы сохранятся в одной транзакции. Альтернатива — обернуть серию Установить() в явную транзакцию через НачатьТранзакцию() и ЗафиксироватьТранзакцию().

Видна ли константа всем пользователям базы?

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

Итог

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

Чтение константы — Константы.Имя.Получить(), запись — Константы.Имя.Установить(Значение); обе операции работают только на сервере. Для группы констант используйте набор, в запросах — виртуальную таблицу Константы (только чтение). Проверяйте заполненность после чтения и не храните в константах данные с историей.