Как устроены константы 1С и где они пригодятся разработчику

· 9 мин

Содержание

Константа в 1С 8.3 хранит одно значение на всю информационную базу: основную валюту, флаг «Вести учёт по складам», адрес сервиса, дату запрета изменения. Создают её в конфигураторе в ветке Константы, читают из серверного кода через Константы.ИмяКонстанты.Получить(), а пользователю показывают на общей форме констант.

Типичная ситуация: заказчик просит «галочку», которая включает новый механизм для всей базы, а не для одного пользователя. Заводить ради неё справочник или регистр — избыточно. Это ровно та задача, под которую придуманы константы: одно значение, одна таблица, простые права.

Зачем нужны константы и как они хранятся

Константа — объект метаданных без табличных частей и без истории. У неё одно текущее значение, общее для всех пользователей и сеансов.

Где их обычно применяют:

  • ⚙️ флаги включения механизмов («Использовать характеристики», «Вести учёт по договорам»);
  • 💱 значения по умолчанию для всей базы: основная валюта, основная организация, единица измерения;
  • 🔗 технические настройки: адрес веб-сервиса, имя каталога обмена, таймауты;
  • 🧩 хранилище для функциональных опций (тип Булево или ссылка);
  • 📅 разовые даты, например дата начала использования механизма.

В базе данных каждая константа лежит в отдельной таблице (в SQL это таблицы вида _Const<номер>). Поэтому запись одной константы не блокирует остальные. Но две транзакции, которые одновременно пишут одну и ту же константу, будут ждать друг друга.

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

ЗадачаЧем решатьПочему не константа
Значение меняется во времени и нужна историяПериодический регистр сведенийУ константы нет периода, старое значение теряется
Значение своё у каждой организацииРегистр сведений с измерением «Организация»Константа одна на базу
Значение своё у каждого пользователяХранилище настроек или регистр сведенийКонстанта общая для всех
Счётчик, который увеличивают многие пользователиНумератор документа или регистрЧастая запись одной константы вызывает ожидания на блокировках

Если сомневаетесь, понадобится ли когда-нибудь история значения, сразу делайте периодический регистр сведений. Переделывать константу в регистр потом дороже: придётся переписывать все места чтения.

Как создать константу в конфигураторе

Порядок действий в конфигураторе платформы 8.3:

  1. Откройте дерево конфигурации (Конфигурация → Открыть конфигурацию).
  2. Найдите ветку Константы, щёлкните по ней правой кнопкой и выберите Добавить.
  3. На вкладке основных свойств заполните Имя (латиница или кириллица без пробелов, например ИспользоватьСкладскойУчет) и Синоним — его увидит пользователь.
  4. Выберите Тип значения (подробно ниже).
  5. Включите константу в нужные подсистемы, если она должна быть видна в командном интерфейсе раздела.
  6. Добавьте права в ролях (см. следующий раздел).
  7. Сохраните конфигурацию и обновите конфигурацию базы данных (F7). Платформа создаст для константы новую таблицу.

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

Константа в типовой конфигурации: через расширение

В типовую БП 3.0 или ЗУП 3.1 новую константу лучше не добавлять напрямую. Для этого придётся включить возможность изменения конфигурации, и каждое следующее обновление превратится в сравнение и объединение.

Рабочий приём — расширение конфигурации :

  1. Создайте расширение (Конфигурация → Расширения конфигурации → Добавить).
  2. В дереве расширения добавьте собственную константу в ветку Константы. Имя начните с префикса расширения, например мр_ИспользоватьАвтозагрузку, чтобы не пересечься с будущими объектами типовой.
  3. Заимствуйте роль, которой нужно право на константу, и отметьте права в ней.
  4. Сохраните расширение и обновите конфигурацию базы данных.

Типовая конфигурация при этом остаётся на поддержке, обновления ставятся штатно.

Какой тип значения выбрать

ТипПример константыНа что обратить внимание
БулевоИспользоватьВалютныйУчетПодходит как хранилище функциональной опции
ЧислоКоличествоДнейХраненияЛоговЗадайте длину и точность, иначе дробные значения обрежутся
СтрокаАдресСервисаОбменаМожно указать неограниченную длину для длинных URL и JSON
ДатаДатаНачалаУчетаПоПартиямВыберите состав даты: только дата или дата и время
СправочникСсылка.*ОсновнаяВалютаСсылка на элемент справочника, удобно для значений по умолчанию
ПеречислениеСсылка.*СпособОценкиЗапасовФиксированный набор вариантов
ХранилищеЗначенияНастройкиИнтеграцииСтруктура или файл целиком; нельзя отобрать в запросе
Составной—Используйте редко: усложняет код и проверки

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

Модуль менеджера значения

У константы есть Модуль менеджера значения. В нём пишут обработчики событий записи:

  • ПередЗаписью(Отказ) — проверка нового значения, его можно отклонить;
  • ПриЗаписи(Отказ) — действия после записи в транзакции, например запись в журнал.

Внутри модуля текущее (новое) значение доступно через свойство Значение.

Процедура ПередЗаписью(Отказ)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	Если Значение < 0 Тогда
		ОбщегоНазначения.СообщитьПользователю("Срок хранения не может быть отрицательным.");
		Отказ = Истина;
	КонецЕсли;

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

Проверка ОбменДанными.Загрузка нужна, чтобы при загрузке данных обменом не срабатывала прикладная логика. ОбщегоНазначения.СообщитьПользователю есть в конфигурациях на БСП; в своей конфигурации без БСП используйте объект СообщениеПользователю.

Права доступа к константам

Права на константу задаются в каждой роли отдельно. Откройте роль, найдите в дереве ветку Константы и отметьте нужные флажки.

ПравоЧто даёт
ЧтениеПолучать значение программно и в запросах
ИзменениеЗаписывать значение программно
ПросмотрВидеть значение в интерфейсе (на формах)
РедактированиеМенять значение в интерфейсе

Просмотр и Редактирование — интерактивные права, они опираются на Чтение и Изменение. Если дать Редактирование без Изменения, пользователь увидит поле, но при записи получит ошибку прав.

Практическая схема для прикладной конфигурации:

  • 👤 рядовым ролям — только Чтение, чтобы код мог взять значение;
  • 🛠 роли администратора — все четыре права;
  • 🔒 технические константы (пароли сервисов, токены) — без прав у рядовых ролей вообще.

Чтение без прав: привилегированный режим

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

Функция АдресСервиса() Экспорт

	УстановитьПривилегированныйРежим(Истина);
	Адрес = Константы.АдресСервисаОбмена.Получить();
	УстановитьПривилегированныйРежим(Ложь);

	Возврат Адрес;

КонецФункции

Пароли в обычной строковой константе видит любой, у кого есть право Чтение и консоль запросов. В конфигурациях на БСП для секретов есть безопасное хранилище данных; в своей конфигурации храните секреты в константе без прав у пользовательских ролей.

Работа с константами в программном коде

Менеджер Константы доступен только на сервере (и в толстом клиенте). В модуле управляемой формы на клиенте его нет — нужен серверный вызов.

Чтение и запись одного значения

// Чтение
ОсновнаяВалюта = Константы.ОсновнаяВалюта.Получить();

// Запись (выполняется сразу, в своей транзакции)
Константы.ИспользоватьСкладскойУчет.Установить(Истина);

Установить() записывает значение и вызывает обработчики модуля менеджера значения. Отдельно вызывать Записать() не нужно.

Как получить значение на клиенте

Из клиентской процедуры формы значение берут через серверную функцию без контекста — она не передаёт данные формы на сервер и работает быстрее:

&НаСервереБезКонтекста
Функция ПолучитьОсновнуюВалюту()
	Возврат Константы.ОсновнаяВалюта.Получить();
КонецФункции

&НаКлиенте
Процедура ЗаполнитьВалюту()
	Валюта = ПолучитьОсновнуюВалюту();
КонецПроцедуры

Если значение нужно форме сразу, прочитайте его в ПриСозданииНаСервере и положите в реквизит формы — лишнего серверного вызова не будет.

Менеджер значения: проверка перед записью

Если нужно прочитать, изменить и записать с обработкой отказа, работайте через менеджер значения:

МенеджерЗначения = Константы.КоличествоДнейХраненияЛогов.СоздатьМенеджерЗначения();
МенеджерЗначения.Прочитать();
МенеджерЗначения.Значение = 90;
МенеджерЗначения.Записать();

Набор констант: несколько значений за раз

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

Набор = Константы.СоздатьНабор("ОсновнаяВалюта, ИспользоватьВалютныйУчет");
Набор.Прочитать();
Набор.ИспользоватьВалютныйУчет = Истина;
Набор.Записать();

Константы в запросе

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

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Цены.Номенклатура,
|	Цены.Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены,
|	Константы КАК Константы
|ГДЕ
|	Цены.Валюта = Константы.ОсновнаяВалюта";

Константы типа ХранилищеЗначения в запросе не сравнить и не отобрать — их читают только через Получить().

Кеширование значения на сеанс

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

// Общий модуль РаботаСНастройкамиПовтИсп
Функция ОсновнаяВалюта() Экспорт
	Возврат Константы.ОсновнаяВалюта.Получить();
КонецФункции

После изменения такой константы в текущем сеансе вызовите ОбновитьПовторноИспользуемыеЗначения(). В других сеансах кеш обновится сам, но не мгновенно, а через некоторое время или после перезапуска.

Как вывести константы пользователю

У пользователя константы редактируются на формах. Есть три рабочих способа.

Общая форма констант

Создайте в ветке Общие → Общие формы форму, а основным реквизитом сделайте реквизит типа КонстантыНабор. Перетащите нужные константы из реквизита на форму. При нажатии «Записать и закрыть» набор запишется целиком.

В свойствах конфигурации укажите эту форму в поле Основная форма констант. Тогда она откроется командой из меню Все функции → Константы.

Форма настроек раздела

Так сделаны типовые конфигурации: константы раскиданы по формам настроек (Администрирование → Параметры учета, Администрирование → Общие настройки в БП 3.0). Каждая форма содержит только константы своего раздела. Удобнее для пользователя, но требует своей формы на каждый раздел.

Быстрый доступ для администратора

В режиме «Предприятие» список всех констант открывается через Главное меню (≡) → Все функции → Константы. Если пункта «Все функции» нет, включите его: Главное меню → Сервис → Параметры → флажок «Отображать команду “Все функции”».

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

Константа и функциональная опция

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

  1. В ветке Общие → Функциональные опции создайте опцию.
  2. В свойстве Хранение выберите константу типа Булево.
  3. В составе опции отметьте реквизиты, команды и объекты, которые она управляет.

В коде значение проверяют через ПолучитьФункциональнуюОпцию("ИспользоватьСкладскойУчет"). После записи константы вызовите ОбновитьИнтерфейс() на клиенте, иначе пользователь увидит изменения только после перезапуска.

Ошибки при работе с константами и как их исправить

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

Ещё несколько ошибок, которые всплывают при доработке:

  • 🔄 Смена типа существующей константы. При обновлении базы платформа попытается преобразовать значение. Строку «abc» в число не превратить, значение обнулится. Перед сменой типа сохраните старое значение во временную константу или выгрузите его.
  • 🧾 Число без точности. Константу Число(10, 0) нельзя использовать под процент 12,5 — дробная часть пропадёт.
  • 📦 Объект в константе для обмена. В правилах обмена константы нужно перечислить явно, иначе значение в приёмнике останется пустым.
  • 🗑 Удаление константы, на которую ссылается функциональная опция. Конфигуратор не даст сохранить конфигурацию ; сначала смените хранение опции.

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

Можно ли хранить в константе таблицу значений?
Да, если тип константы — ХранилищеЗначения. Записывают Новый ХранилищеЗначения(Таблица), читают через Получить().Получить(). В запросе такое значение не использовать.
Чем константа отличается от параметра сеанса?
Константа хранится в базе и одна для всех. Параметр сеанса живёт только в памяти текущего сеанса, его заполняют при старте и он пропадает при выходе.
Можно ли узнать, кто изменил константу?
Да, смотрите журнал регистрации: событие изменения данных с объектом метаданных этой константы. Для подробной истории значений используйте периодический регистр сведений.
Сколько констант можно создать в конфигурации?
Жёсткого практического лимита нет: в типовых конфигурациях их сотни. Но каждая константа — отдельная таблица, поэтому десятки однотипных значений удобнее держать в регистре сведений.
Как задать значение константы при первом запуске базы?
Заполните её в коде начального заполнения или обработчике обновления конфигурации: проверьте, что значение пустое, и запишите его через Установить().