Как устроены константы 1С и где они пригодятся разработчику
Содержание
Константа в 1С 8.3 хранит одно значение на всю информационную базу: основную валюту, флаг «Вести учёт по складам», адрес сервиса, дату запрета изменения. Создают её в конфигураторе в ветке Константы, читают из серверного кода через Константы.ИмяКонстанты.Получить(), а пользователю показывают на общей форме констант.
Типичная ситуация: заказчик просит «галочку», которая включает новый механизм для всей базы, а не для одного пользователя. Заводить ради неё справочник или регистр — избыточно. Это ровно та задача, под которую придуманы константы: одно значение, одна таблица, простые права.
Зачем нужны константы и как они хранятся
Константа — объект метаданных без табличных частей и без истории. У неё одно текущее значение, общее для всех пользователей и сеансов.
Где их обычно применяют:
- ⚙️ флаги включения механизмов («Использовать характеристики», «Вести учёт по договорам»);
- 💱 значения по умолчанию для всей базы: основная валюта, основная организация, единица измерения;
- 🔗 технические настройки: адрес веб-сервиса, имя каталога обмена, таймауты;
- 🧩 хранилище для функциональных опций (тип
Булевоили ссылка); - 📅 разовые даты, например дата начала использования механизма.
В базе данных каждая константа лежит в отдельной таблице (в SQL это таблицы вида _Const<номер>). Поэтому запись одной константы не блокирует остальные. Но две транзакции, которые одновременно пишут одну и ту же константу, будут ждать друг друга.
Когда константа — неправильный выбор
| Задача | Чем решать | Почему не константа |
|---|---|---|
| Значение меняется во времени и нужна история | Периодический регистр сведений | У константы нет периода, старое значение теряется |
| Значение своё у каждой организации | Регистр сведений с измерением «Организация» | Константа одна на базу |
| Значение своё у каждого пользователя | Хранилище настроек или регистр сведений | Константа общая для всех |
| Счётчик, который увеличивают многие пользователи | Нумератор документа или регистр | Частая запись одной константы вызывает ожидания на блокировках |
Если сомневаетесь, понадобится ли когда-нибудь история значения, сразу делайте периодический регистр сведений. Переделывать константу в регистр потом дороже: придётся переписывать все места чтения.
Как создать константу в конфигураторе
Порядок действий в конфигураторе платформы 8.3:
- Откройте дерево конфигурации (
Конфигурация → Открыть конфигурацию). - Найдите ветку
Константы, щёлкните по ней правой кнопкой и выберитеДобавить. - На вкладке основных свойств заполните
Имя(латиница или кириллица без пробелов, напримерИспользоватьСкладскойУчет) иСиноним— его увидит пользователь. - Выберите
Типзначения (подробно ниже). - Включите константу в нужные подсистемы, если она должна быть видна в командном интерфейсе раздела.
- Добавьте права в ролях (см. следующий раздел).
- Сохраните конфигурацию и обновите конфигурацию базы данных (
F7). Платформа создаст для константы новую таблицу.
Добавление константы меняет структуру базы. Если в базе работают пользователи, конфигуратор предложит динамическое обновление или попросит завершить сеансы. На рабочей базе делайте это вне рабочего времени и после резервной копии.
Константа в типовой конфигурации: через расширение
В типовую БП 3.0 или ЗУП 3.1 новую константу лучше не добавлять напрямую. Для этого придётся включить возможность изменения конфигурации, и каждое следующее обновление превратится в сравнение и объединение.
Рабочий приём — расширение конфигурации :
- Создайте расширение (
Конфигурация → Расширения конфигурации → Добавить). - В дереве расширения добавьте собственную константу в ветку
Константы. Имя начните с префикса расширения, напримермр_ИспользоватьАвтозагрузку, чтобы не пересечься с будущими объектами типовой. - Заимствуйте роль, которой нужно право на константу, и отметьте права в ней.
- Сохраните расширение и обновите конфигурацию базы данных.
Типовая конфигурация при этом остаётся на поддержке, обновления ставятся штатно.
Какой тип значения выбрать
| Тип | Пример константы | На что обратить внимание |
|---|---|---|
Булево | ИспользоватьВалютныйУчет | Подходит как хранилище функциональной опции |
Число | КоличествоДнейХраненияЛогов | Задайте длину и точность, иначе дробные значения обрежутся |
Строка | АдресСервисаОбмена | Можно указать неограниченную длину для длинных URL и JSON |
Дата | ДатаНачалаУчетаПоПартиям | Выберите состав даты: только дата или дата и время |
СправочникСсылка.* | ОсновнаяВалюта | Ссылка на элемент справочника, удобно для значений по умолчанию |
ПеречислениеСсылка.* | СпособОценкиЗапасов | Фиксированный набор вариантов |
ХранилищеЗначения | НастройкиИнтеграции | Структура или файл целиком; нельзя отобрать в запросе |
| Составной | — | Используйте редко: усложняет код и проверки |
Составной тип выглядит гибким, но в коде потом приходится проверять ТипЗнч() при каждом чтении. Если значения логически разные, лучше две константы.
Модуль менеджера значения
У константы есть Модуль менеджера значения. В нём пишут обработчики событий записи:
ПередЗаписью(Отказ)— проверка нового значения, его можно отклонить;ПриЗаписи(Отказ)— действия после записи в транзакции, например запись в журнал.
Внутри модуля текущее (новое) значение доступно через свойство Значение.
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Значение < 0 Тогда
ОбщегоНазначения.СообщитьПользователю("Срок хранения не может быть отрицательным.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Проверка ОбменДанными.Загрузка нужна, чтобы при загрузке данных обменом не срабатывала прикладная логика. ОбщегоНазначения.СообщитьПользователю есть в конфигурациях на БСП; в своей конфигурации без БСП используйте объект СообщениеПользователю.
Права доступа к константам
Права на константу задаются в каждой роли отдельно. Откройте роль, найдите в дереве ветку Константы и отметьте нужные флажки.
| Право | Что даёт |
|---|---|
Чтение | Получать значение программно и в запросах |
Изменение | Записывать значение программно |
Просмотр | Видеть значение в интерфейсе (на формах) |
Редактирование | Менять значение в интерфейсе |
Просмотр и Редактирование — интерактивные права, они опираются на Чтение и Изменение. Если дать Редактирование без Изменения, пользователь увидит поле, но при записи получит ошибку прав.
Практическая схема для прикладной конфигурации:
- 👤 рядовым ролям — только
Чтение, чтобы код мог взять значение; - 🛠 роли администратора — все четыре права;
- 🔒 технические константы (пароли сервисов, токены) — без прав у рядовых ролей вообще.
Чтение без прав: привилегированный режим
Бывает, что значение нужно коду, а пользователю видеть его нельзя. Например, адрес и логин внешнего сервиса. Тогда чтение выносят в серверный общий модуль с флагом Привилегированный или включают режим на время операции:
Функция АдресСервиса() Экспорт
УстановитьПривилегированныйРежим(Истина);
Адрес = Константы.АдресСервисаОбмена.Получить();
УстановитьПривилегированныйРежим(Ложь);
Возврат Адрес;
КонецФункции
Пароли в обычной строковой константе видит любой, у кого есть право Чтение и консоль запросов. В конфигурациях на БСП для секретов есть безопасное хранилище данных; в своей конфигурации храните секреты в константе без прав у пользовательских ролей.
Работа с константами в программном коде
Менеджер Константы доступен только на сервере (и в толстом клиенте). В модуле управляемой формы на клиенте его нет — нужен серверный вызов.
Чтение и запись одного значения
// Чтение
ОсновнаяВалюта = Константы.ОсновнаяВалюта.Получить();
// Запись (выполняется сразу, в своей транзакции)
Константы.ИспользоватьСкладскойУчет.Установить(Истина);
Установить() записывает значение и вызывает обработчики модуля менеджера значения. Отдельно вызывать Записать() не нужно.
Как получить значение на клиенте
Из клиентской процедуры формы значение берут через серверную функцию без контекста — она не передаёт данные формы на сервер и работает быстрее:
&НаСервереБезКонтекста
Функция ПолучитьОсновнуюВалюту()
Возврат Константы.ОсновнаяВалюта.Получить();
КонецФункции
&НаКлиенте
Процедура ЗаполнитьВалюту()
Валюта = ПолучитьОсновнуюВалюту();
КонецПроцедуры
Если значение нужно форме сразу, прочитайте его в ПриСозданииНаСервере и положите в реквизит формы — лишнего серверного вызова не будет.
Менеджер значения: проверка перед записью
Если нужно прочитать, изменить и записать с обработкой отказа, работайте через менеджер значения:
МенеджерЗначения = Константы.КоличествоДнейХраненияЛогов.СоздатьМенеджерЗначения();
МенеджерЗначения.Прочитать();
МенеджерЗначения.Значение = 90;
МенеджерЗначения.Записать();
Набор констант: несколько значений за раз
Когда на одной форме или в одной процедуре меняется несколько констант, используйте набор. Он читает и пишет их одной операцией:
Набор = Константы.СоздатьНабор("ОсновнаяВалюта, ИспользоватьВалютныйУчет");
Набор.Прочитать();
Набор.ИспользоватьВалютныйУчет = Истина;
Набор.Записать();
Константы в запросе
В языке запросов константы доступны через таблицу Константы. Это удобно, когда значение нужно в условии:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура,
| Цены.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены,
| Константы КАК Константы
|ГДЕ
| Цены.Валюта = Константы.ОсновнаяВалюта";
Константы типа ХранилищеЗначения в запросе не сравнить и не отобрать — их читают только через Получить().
Кеширование значения на сеанс
Константу, которую код читает сотни раз за сеанс, кешируют. Создайте серверный общий модуль с признаком Повторное использование возвращаемых значений: На время сеанса:
// Общий модуль РаботаСНастройкамиПовтИсп
Функция ОсновнаяВалюта() Экспорт
Возврат Константы.ОсновнаяВалюта.Получить();
КонецФункции
После изменения такой константы в текущем сеансе вызовите ОбновитьПовторноИспользуемыеЗначения(). В других сеансах кеш обновится сам, но не мгновенно, а через некоторое время или после перезапуска.
Как вывести константы пользователю
У пользователя константы редактируются на формах. Есть три рабочих способа.
Общая форма констант
Создайте в ветке Общие → Общие формы форму, а основным реквизитом сделайте реквизит типа КонстантыНабор. Перетащите нужные константы из реквизита на форму. При нажатии «Записать и закрыть» набор запишется целиком.
В свойствах конфигурации укажите эту форму в поле Основная форма констант. Тогда она откроется командой из меню Все функции → Константы.
Форма настроек раздела
Так сделаны типовые конфигурации: константы раскиданы по формам настроек (Администрирование → Параметры учета, Администрирование → Общие настройки в БП 3.0). Каждая форма содержит только константы своего раздела. Удобнее для пользователя, но требует своей формы на каждый раздел.
Быстрый доступ для администратора
В режиме «Предприятие» список всех констант открывается через Главное меню (≡) → Все функции → Константы. Если пункта «Все функции» нет, включите его: Главное меню → Сервис → Параметры → флажок «Отображать команду “Все функции”».
В типовых конфигурациях часть констант связана между собой: включение одной меняет другие через код формы настроек. Меняйте их через штатные формы настроек, а не через «Все функции», чтобы не нарушить эти связи.
Константа и функциональная опция
Чтобы флаг скрывал и показывал реквизиты, команды и формы, его связывают с функциональной опцией:
- В ветке
Общие → Функциональные опциисоздайте опцию. - В свойстве
Хранениевыберите константу типаБулево. - В составе опции отметьте реквизиты, команды и объекты, которые она управляет.
В коде значение проверяют через ПолучитьФункциональнуюОпцию("ИспользоватьСкладскойУчет"). После записи константы вызовите ОбновитьИнтерфейс() на клиенте, иначе пользователь увидит изменения только после перезапуска.
Ошибки при работе с константами и как их исправить
Ещё несколько ошибок, которые всплывают при доработке:
- 🔄 Смена типа существующей константы. При обновлении базы платформа попытается преобразовать значение. Строку «abc» в число не превратить, значение обнулится. Перед сменой типа сохраните старое значение во временную константу или выгрузите его.
- 🧾 Число без точности. Константу
Число(10, 0)нельзя использовать под процент 12,5 — дробная часть пропадёт. - 📦 Объект в константе для обмена. В правилах обмена константы нужно перечислить явно, иначе значение в приёмнике останется пустым.
- 🗑 Удаление константы, на которую ссылается функциональная опция. Конфигуратор не даст сохранить конфигурацию ; сначала смените хранение опции.
Частые вопросы
Можно ли хранить в константе таблицу значений?
ХранилищеЗначения. Записывают Новый ХранилищеЗначения(Таблица), читают через Получить().Получить(). В запросе такое значение не использовать.Чем константа отличается от параметра сеанса?
Можно ли узнать, кто изменил константу?
Сколько констант можно создать в конфигурации?
Как задать значение константы при первом запуске базы?
Установить().