gifts2017

Действующие политики или именованные булевы Константы

Опубликовал Андрей Калякин (kalyaka) в раздел Программирование - Практика программирования

Как часто Вам приходилось использовать временные именованные булевы константы в коде? Ключевое здесь слово «временные». Не всегда удобно вводить константу, чтобы потом ее удалить или использовать уже по другому назначению...

1      Описание

Как часто Вам приходилось использовать временные именованные булевы константы в коде? Ключевое здесь слово «временные». Не всегда удобно вводить константу, чтобы потом ее удалить или использовать уже по другому назначению. Такой код может привести к усложнению понимания функционирования программы и как следствие к ненадежному коду. Я предлагаю подход, когда программист не ограничен в своей фантазии использовать различные именованные булевы константы. Сами константы хранить в регистре сведений. В этом случае мы с одной стороны получаем код, работающий с конкретным булевым значением, а с другой – в любой момент можно отказаться от булевого значения и код при этом будет функционировать, даже если проверку булевой константы оставить.

Для чего может пригодиться именованная булева константа? - для управления. Так в задаче, когда некоторый код должен выполняться в тестовом режиме и есть необходимость иметь возможность оперативно отключить использование данного кода. В другой ситуации Вам нужно запретить использование некоторой функциональности для одной группы пользователей, но оставить такую возможность для другой. В обратной ситуации может потребоваться разрешить использование функциональности только для одного пользователя или группы пользователей.

Итак, если в описании ситуаций выше Вы увидели свой случай, то предлагаемое решение для Вас.

Суть идеи была подсмотрена в реализации групповых политик для управления сервером на ОС Windows. Политика здесь выступает в роли правила, диктующего линию поведения. Поведение может быть запрещено - запрещающая политика, разрешено – разрешающая и регламентированное – регламентирующая. Не вдаваясь глубоко в философию использования политик укажу лишь, что вид политики никак в данной реализации не определяется и может свободно трактоваться в Вашем коде. Как Вы уже могли догадаться, политика – это и есть та самая именованная булева константа. Особенность Политики в отличии от константы – действие политики может быть ограничено по времени, политика может быть назначена на пользователя или группу пользователей.

2      Реализация

Примеры использования политик:

//
//  Присвоение переменной булевого значения действия политики
КонтрольСтатусов   = ДействуетПолитика("КонтрольСтатусаОбъектов", ТекущаяДата());
//
//  Проверка действия хотя бы одной из политик
ДействуетПолитикаКонтроля = Не ДействуетПолитика("НЕ_ИСПОЛЬЗОВАТЬ_КОНТРОЛЬ_ТЧ_ДДС|Администратор", Дата);
//
//  Проверка действия политики для кода, который находится в режиме тестирования
Если ДействуетПолитика("ТЕСТ_ПРОВЕДЕНИЯ_ЗАЯВКА_НА_ОПЛАТУ") Тогда

КонецЕсли;
//
//  Выполнение действия для группы пользователей, определенной для опроса
Если ДействуетПолитика("ОпросПользователей", ТекущаяДата()) Тогда

КонецЕсли;

 

3      Спецификация

Проверка действия политики осуществляется в функции «ДействуетПолитика», которую я предлагаю разместить в глобальном модуле ПраваДоступа. Текст функции представлен ниже.

Для работы механизма нужно в типовом решении 1С добавить регистр сведения ДействующиеПолитики и справочник Политики.

Структура объектов метаданных:

 

Таблица 1. Справочник Политики

Реквизиты

Тип

Комментарий

Наименование

Строка (100)

 

Комментарий

Неограниченная строка

 

 

Таблица 2. Регистр сведений ДействующиеПолитики

 

Тип

Комментарий

Измерения

 

 

Пользователь

Пользователи, ГруппыПользователей

 

Политика

Политика

 

Ресурсы

 

 

ДатаОкончания

Дата

Может быть пустой

 

 

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

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Зубцов (iov) 25.11.11 11:40
(0) Вот только не надо говорить что не знаете про разукрашку.... :!:
2. Андрей Калякин (kalyaka) 25.11.11 14:40
(1) iov, знаю, пока денег нету :)
3. Александр Зубцов (iov) 25.11.11 14:42
4. Tiger77 (Tiger77) 25.11.11 18:40
Огромный плюс за идею и ее реализацию. Небольшой минус за оформление.
5. Алексей Исаев (it_nazarov) 01.12.11 11:12
Отличная идея и хорошая реализация, как с точки зрения программиста и аналитика, так и с точки зрения пользователя и управленца. Не вижу ни одного отрицательного момента.