Можно ли программно добавить значение константы в 1С и как это сделать правильно

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

Проблема: Метаданные против Данных

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

  1. Для изменения структуры требуется монопольный доступ к базе данных.
  2. Любое изменение метаданных требует обновления конфигурации базы данных.
  3. Программное изменение метаданных через встроенный язык не предусмотрено (кроме специализированных механизмов выгрузки/загрузки XML, что крайне небезопасно в рабочей среде).

Если вам нужно хранить значение, которое «нужно не для всех сотрудников» или должно появляться динамически, следует использовать другие механизмы. Рассмотрим их подробнее.

Решение 1: Использование непериодического регистра сведений

Это самый гибкий и правильный способ реализации «динамических констант». Вместо создания множества констант в Конфигураторе, мы создаем один РегистрСведений (например, с именем ДополнительныеНастройки).

Структура регистра:

Рассмотрим пример кода для записи такой «константы»:


МенеджерЗаписи = РегистрыСведений.ДополнительныеНастройки.СоздатьМенеджерЗаписи();
МенеджерЗаписи.КлючНастройки = "НужнаяНастройкаДляОсобыхСлучаев";
МенеджерЗаписи.Пользователь = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписи.Значение = Истина; // Или любое другое значение
МенеджерЗаписи.Записать();

А вот так мы можем проверить наличие этой настройки в коде:


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

Запрос.УстановитьПараметр("КлючНастройки", "НужнаяНастройкаДляОсобыхСлучаев");
Запрос.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);

РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    // Выполняем код, если условие выполнено
КонецЕсли;

Решение 2: Параметры сеанса

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

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

Пример обращения к параметру сеанса:


// Установка значения (обычно в модуле сеанса или при выполнении условия)
ПараметрыСеанса.ИспользоватьРасширенныйФункционал = Истина;

// Проверка в коде
Если ПараметрыСеанса.ИспользоватьРасширенныйФункционал Тогда
    // Выполняем специфические действия
КонецЕсли;

Решение 3: Хранилище общих настроек

Для программиста 1С существует еще один «скрытый» механизм — ХранилищеОбщихНастроек. Он позволяет сохранять произвольные данные без создания новых объектов метаданных вообще.

Разберем по шагам, как сохранить и прочитать значение:

Сохранение значения:


КлючОбъекта = "СистемныеНастройкиПользователей";
КлючНастройки = "ПоказыватьСпецРаздел";
ЗначениеНастройки = Истина;

ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастройки, ЗначениеНастройки, , ПараметрыСеанса.ТекущийПользователь.Наименование);

Восстановление значения:


Значение = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастройки);
Если Значение = Истина Тогда
    // Действие
КонецЕсли;

Решение 4: Работа с существующими константами

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


// Работа с одиночной константой
Константы.ИмяТвоейКонстанты.Установить(НовоеЗначение);

// Работа с набором (эффективно для записи нескольких констант сразу)
Набор = Константы.СоздатьНабор("Константа1, Константа2");
Набор.Константа1 = Значение1;
Набор.Константа2 = Значение2;
Набор.Записать();

Подведем итоги

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

Выбор конкретного метода зависит от того, насколько долго должно храниться значение и насколько часто оно будет изменяться. Для большинства задач «динамических констант» связка Регистр сведений + Кэширование в параметрах сеанса является золотым стандартом разработки на платформе 1С.

← На главную