В практике разработки на платформе 1С:Предприятие часто возникает задача динамического управления настройками. Начинающие разработчики иногда пытаются «программно добавить константу», подразумевая под этим создание нового места для хранения данных прямо во время работы пользователя. Однако здесь кроется важное архитектурное различие между объектами метаданных и данными.
В этой статье мы разберем, почему классическую константу нельзя создать «на лету», и рассмотрим эффективные способы решения этой задачи, которые позволяют хранить индивидуальные настройки для разных сотрудников.
Прежде всего, проанализируем ситуацию. В системе 1С Константа — это объект метаданных. Ее структура (имя, тип данных) описывается в Конфигураторе. Когда вы хотите «добавить константу», вы фактически предлагаете изменить структуру базы данных. В режиме «Предприятие» это невозможно по ряду причин:
Если вам нужно хранить значение, которое «нужно не для всех сотрудников» или должно появляться динамически, следует использовать другие механизмы. Рассмотрим их подробнее.
Это самый гибкий и правильный способ реализации «динамических констант». Вместо создания множества констант в Конфигураторе, мы создаем один РегистрСведений (например, с именем ДополнительныеНастройки).
Структура регистра:
КлючНастройки (Тип: Строка или Перечисление) — здесь мы будем хранить «имя» нашей псевдо-константы.Пользователь (Тип: СправочникСсылка.Пользователи) — если настройка индивидуальна.Значение (Тип: ЛюбаяСсылка или ХранилищеЗначения) — здесь хранится само значение.Рассмотрим пример кода для записи такой «константы»:
МенеджерЗаписи = РегистрыСведений.ДополнительныеНастройки.СоздатьМенеджерЗаписи();
МенеджерЗаписи.КлючНастройки = "НужнаяНастройкаДляОсобыхСлучаев";
МенеджерЗаписи.Пользователь = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписи.Значение = Истина; // Или любое другое значение
МенеджерЗаписи.Записать();
А вот так мы можем проверить наличие этой настройки в коде:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеНастройки.Значение
|ИЗ
| РегистрСведений.ДополнительныеНастройки КАК ДополнительныеНастройки
|ГДЕ
| ДополнительныеНастройки.КлючНастройки = &КлючНастройки
| И ДополнительныеНастройки.Пользователь = &ТекущийПользователь";
Запрос.УстановитьПараметр("КлючНастройки", "НужнаяНастройкаДляОсобыхСлучаев");
Запрос.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Выполняем код, если условие выполнено
КонецЕсли;
Если «константа» нужна вам только в рамках текущего сеанса работы пользователя и ее не нужно хранить в базе вечно, лучше всего использовать ПараметрыСеанса. Они работают очень быстро, так как хранятся в памяти сервера приложений.
Выясним причину их удобства: они инициализируются при старте системы и доступны глобально. Однако, как и константы, сами параметры сеанса (их имена) должны быть созданы в Конфигураторе заранее.
Пример обращения к параметру сеанса:
// Установка значения (обычно в модуле сеанса или при выполнении условия)
ПараметрыСеанса.ИспользоватьРасширенныйФункционал = Истина;
// Проверка в коде
Если ПараметрыСеанса.ИспользоватьРасширенныйФункционал Тогда
// Выполняем специфические действия
КонецЕсли;
Для программиста 1С существует еще один «скрытый» механизм — ХранилищеОбщихНастроек. Он позволяет сохранять произвольные данные без создания новых объектов метаданных вообще.
Разберем по шагам, как сохранить и прочитать значение:
Сохранение значения:
КлючОбъекта = "СистемныеНастройкиПользователей";
КлючНастройки = "ПоказыватьСпецРаздел";
ЗначениеНастройки = Истина;
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастройки, ЗначениеНастройки, , ПараметрыСеанса.ТекущийПользователь.Наименование);
Восстановление значения:
Значение = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастройки);
Если Значение = Истина Тогда
// Действие
КонецЕсли;
Если константа уже создана в Конфигураторе, но вы хотите программно менять ее значение (а не саму структуру), используйте стандартные методы менеджера констант. Рассмотрим подробнее работу с КонстантыНабор, когда нужно записать несколько значений эффективно.
// Работа с одиночной константой
Константы.ИмяТвоейКонстанты.Установить(НовоеЗначение);
// Работа с набором (эффективно для записи нескольких констант сразу)
Набор = Константы.СоздатьНабор("Константа1, Константа2");
Набор.Константа1 = Значение1;
Набор.Константа2 = Значение2;
Набор.Записать();
Проанализировав ситуацию, мы пришли к выводу, что «программно добавить константу» как новый объект метаданных невозможно и неправильно. Вместо этого следует использовать:
Выбор конкретного метода зависит от того, насколько долго должно храниться значение и насколько часто оно будет изменяться. Для большинства задач «динамических констант» связка Регистр сведений + Кэширование в параметрах сеанса является золотым стандартом разработки на платформе 1С.