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

28.11.11

Разработка - Механизмы платформы 1С

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

1      Описание

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

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

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

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

2      Реализация

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

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

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

КонецЕсли;

 

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

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

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

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

 

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

Реквизиты

Тип

Комментарий

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

Строка (100)

 

Комментарий

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

 

 

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

 

Тип

Комментарий

Измерения

 

 

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

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

 

Политика

Политика

 

Ресурсы

 

 

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

Дата

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

 

 

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

См. также

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    5682    dsdred    40    

91

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    9976    bayselonarrend    21    

161

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7176    dsdred    18    

81

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    23164    YA_418728146    28    

73

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    25328    SeiOkami    48    

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