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