Константы в 1С 8.3: создание, настройка и использование в коде

· 9 мин

Содержание

Константа добавляется в конфигураторе 1С 8.3 в ветке Общие → Константы: правый клик по ветке → Добавить. У нового объекта задают имя, синоним и тип данных, после чего обновляют конфигурацию базы. Значение в константу пишут уже в режиме 1С:Предприятие — вручную через форму или из встроенного языка методом Установить().

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

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

Когда заводить константу, а когда взять другой объект

Константа оправдана, когда значение одно на всю базу и не зависит ни от даты, ни от объекта:

  • ⚙️ Настройки учёта: признак «вести партионный учёт», «использовать несколько складов».
  • 🏢 Реквизиты по умолчанию: основная организация, основной склад, основная ставка НДС для подстановки в новые документы.
  • 🔖 Служебные метки: версия загруженного классификатора адресов, дата последнего обмена, номер последнего обработанного пакета.

Когда константа — неправильный выбор:

  • Значение должно храниться в разрезе организаций, складов, пользователей — это регистр сведений с нужными измерениями, а не одна константа на всех.
  • Значение меняется во времени и важна история (ставка рефинансирования, курс) — периодический регистр сведений.
  • Нужен список однотипных значений — справочник.

Практичный ориентир: если вы ловите себя на мысли «заведу константу СтавкаНДСМосква и СтавкаНДСПитер» — вам нужен регистр сведений с измерением, а не несколько похожих констант.

Когда объект выбран верно, перейдём к созданию.

Где лежат константы и как добавить новую

Откройте конфигуратор, разверните дерево конфигурации. Ветка Общие → Константы — верхнего уровня, она есть в любой конфигурации.

  1. Правый клик по ветке Константы → Добавить (или клавиша Insert, или кнопка добавления на панели дерева).
  2. В палитре свойств заполните Имя — это идентификатор для кода. Только латиница и цифры, без пробелов, первый символ — буква или подчёркивание. Пример: СтавкаНДСПоУмолчанию.
  3. Заполните Синоним — то, что пользователь увидит на форме. Здесь уже можно писать по-русски с пробелами: «Ставка НДС по умолчанию».
  4. При необходимости добавьте Комментарий — он виден только разработчику в дереве.

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

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

Добавление константы: порядок действий
Выполнено: 0 / 6

Как выбрать тип данных и параметры хранения

Тип задаётся в свойстве Тип палитры свойств — там же, где имя. Нажмите кнопку выбора и отметьте нужный тип.

Доступны:

  • 🔢 Примитивные типы: Число, Строка, Дата, Булево.
  • 📘 Ссылочные типы: ссылка на элемент справочника, документ, перечисление, план видов характеристик и т. д.
  • 🧩 Составной тип: отметьте несколько типов сразу — тогда константа сможет хранить значение любого из них (например, Число или Строка).

Параметры хранения зависят от выбранного типа:

ТипЧто настраивается
ЧислоДлина (всего цифр) и точность (цифр после запятой); признак неотрицательности
СтрокаДлина и переменная/фиксированная длина; при длине 0 — неограниченная строка
ДатаСостав: Дата, Время или Дата и время
СсылочныйКонкретный справочник/документ или «любая ссылка» выбранного вида

Если константа уже заполнена в рабочей базе, а вы сузили тип (например, уменьшили длину строки или сменили Число на Булево), при обновлении структуры текущее значение может быть приведено к новому типу или очищено. Перед сменой типа заполненной константы сделайте резервную копию базы.

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

Как задать и изменить значение константы

У константы в конфигураторе нет свойства «значение по умолчанию» — пока значение не записано, метод чтения вернёт пустое значение типа (0 для числа, пустую строку, Ложь для булева, пустую ссылку). Значение задают в режиме 1С:Предприятие.

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

Способ 2 — из встроенного языка. Самый универсальный путь, работает всегда:

// Записать значение
Константы.СтавкаНДСПоУмолчанию.Установить(20);

// Прочитать текущее значение
ТекущаяСтавка = Константы.СтавкаНДСПоУмолчанию.Получить();

Запись и чтение константы выполняются на сервере. Если вы в модуле формы на клиенте — вынесите обращение в серверную процедуру (&НаСервере), иначе получите ошибку о недоступности менеджера константы на клиенте.

Способ 3 — создать основную форму константы или вывести константу на общую форму настроек, чтобы администратор менял значение без помощи программиста. Основная форма назначается на закладке Формы палитры свойств константы.

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

Если НЕ ЗначениеЗаполнено(Константы.СтавкаНДСПоУмолчанию.Получить()) Тогда
    Константы.СтавкаНДСПоУмолчанию.Установить(20);
КонецЕсли;

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

Чтение и запись константы в коде

Обращение к константе идёт через глобальное свойство Константы и имя объекта:

МенеджерКонстанты = Константы.НазваниеОрганизации;
Значение = МенеджерКонстанты.Получить();
МенеджерКонстанты.Установить("ООО Ромашка");

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

Набор = Константы.СоздатьНабор("СтавкаНДСПоУмолчанию, НазваниеОрганизации");
Набор.Прочитать();
Набор.СтавкаНДСПоУмолчанию = 20;
Набор.НазваниеОрганизации = "ООО Ромашка";
Набор.Записать();

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

У константы есть событие записи. Если нужно что-то пересчитать при изменении значения, подпишитесь на него через Подписку на событие (ветка Общие → Подписки на событие), источник — набор констант, событие ПриЗаписи. Так, при смене признака «вести учёт по складам» можно автоматически пересчитать зависимые настройки или вывести предупреждение.

Запись константы под обычным пользователем требует права Изменение (см. ниже). Если это служебная операция обновления, которую должен выполнить любой пользователь, оберните запись в УстановитьПривилегированныйРежим(Истина) и не забудьте снять режим после.

Как обратиться к константе в запросе

В языке запросов для каждой константы автоматически доступна таблица Константа.<ИмяКонстанты> с единственным полем Значение:

ВЫБРАТЬ
    СтавкаНДСПоУмолчанию.Значение КАК Ставка
ИЗ
    Константа.СтавкаНДСПоУмолчанию КАК СтавкаНДСПоУмолчанию

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

ВЫБРАТЬ
    Номенклатура.Наименование,
    СтавкаПоУмолчанию.Значение КАК СтавкаНДС
ИЗ
    Справочник.Номенклатура КАК Номенклатура,
    Константа.СтавкаНДСПоУмолчанию КАК СтавкаПоУмолчанию

Соединение с таблицей из одной строки работает как подстановка значения в каждую строку результата. Отбор и соединения с константой прописывать не нужно — строка всегда одна.

Таблицу Константа.<Имя> можно использовать и как источник в системе компоновки данных, и внутри запроса для подстановки значения в отбор. Чтение одной константы — это одна строка, и в запросе обращаться к ней можно спокойно. А вот вызывать Получить() в цикле на тысячи итераций не нужно — прочитайте значение один раз в переменную до цикла, а внутри цикла используйте переменную.

Права доступа к константе: роли и чтение/изменение

Права на константу настраиваются в ролях (ветка Общие → Роли). Откройте роль, найдите константу в списке объектов — у неё только два права:

  • Чтение — пользователь с этой ролью может прочитать значение (в том числе через запрос).
  • Изменение — может записать новое значение.

Записей у константы нет, поэтому прав «Добавление» и «Удаление», как у справочников, здесь не бывает. Ограничений на уровне записей (RLS) к константам тоже не применяют — ограничивать нечего, значение одно.

Типичная раскладка:

  1. Роль администратора или настройщика — Чтение + Изменение.
  2. Роль рядового пользователя — только Чтение, если значение влияет на его работу (ставка, признак учёта).
  3. Если константа чисто служебная (версия классификатора, внутренний флаг), рядовому пользователю прав можно не давать вовсе — обращение выполняйте в привилегированном режиме.

После правки прав обновите конфигурацию базы (F7) и переоткройте сеанс пользователя — права применяются при входе.

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

Частые ошибки при работе с константами

Диагностика: выберите симптом

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

Частые вопросы

Чем константа отличается от реквизита справочника или регистра сведений?
Константа хранит одно значение на всю базу и не привязана к объекту или периоду. Если нужно хранить значение в разрезе организаций, складов или дат — это уже регистр сведений, а не константа.
Можно ли задать значение константы по умолчанию прямо в конфигураторе?
Нет, свойства «значение по умолчанию» у константы нет. До первой записи чтение возвращает пустое значение типа. Начальное значение обычно задают при первом запуске базы в коде или через форму настроек.
Как записать несколько констант в одной транзакции?
Создайте набор: Константы.СоздатьНабор("Имя1, Имя2"), прочитайте, присвойте значения свойствам набора и вызовите Записать(). Это одна транзакция и меньше событий, чем поштучный Установить().
Применяется ли к константам ограничение доступа на уровне записей (RLS)?
Нет. У константы одно значение и нет записей, ограничивать нечего. Доступ регулируется только правами Чтение и Изменение в роли.
Как узнать, что значение константы изменилось, и выполнить действие?
Подпишитесь на событие ПриЗаписи набора констант через ветку Общие → Подписки на событие, указав источником набор нужной константы.