Форум ДИЦ

Пользовательский и Дилерский форум ДИЦ
Текущее время: Пн авг 20, 2018 7:29 am

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Ср фев 07, 2018 7:43 pm 
Не в сети

Зарегистрирован: Пт дек 08, 2017 11:51 am
Сообщения: 18
Откуда: Санкт-Петербург
Здравствуйте. Нужно сделать выборку с учётом доступа.
Такие условия:

Есть документы, есть пользователи.

У документов есть поле, содержащее отдел; у пользователей есть поле-массив с назначенными отделами.

Отделы имеют иерархию. Например, отделы (A, B, C) могут входить в группу (Владивосток). Если пользователю в качестве отдела назначена группа (Владивосток), выборка должна включать документы всех вложенных отделов.

Как в Турбо сделать это грамотно и быстро? Есть вариант составить фильтр вида (Отдел is {xx:yy} or Отдел is {xy:xy} or Отдел is {yx:yx}) из всех отделов пользователя, но мне кажется это плохой идеей. Подскажите, как составить запрос или какую использовать логику.


Последний раз редактировалось dmvw34 Пн мар 19, 2018 5:23 pm, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Ср фев 07, 2018 9:01 pm 
Не в сети

Зарегистрирован: Пн мар 29, 2004 10:25 am
Сообщения: 4890
Откуда: Таганрог
Синтаксис фильтра запроса во внутренних отчетах, и в выборке записей насколько я знаю разная. Тип IS нельзя использовать в выборке записей, а во внутренних отчетах можно. Где фильтруете то? Что такое документы, что такое пользователи? Что Вы под этим понимаете - записи базы, пользователя который имеет право входить в Турбо и т.п. Чем Вам не нравиться запрос "is Владивосток" (я не про синтаксис запроса а про его суть)?

_________________
Александр Золотько, г.Таганрог


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пт фев 09, 2018 11:53 am 
Не в сети

Зарегистрирован: Пт дек 08, 2017 11:51 am
Сообщения: 18
Откуда: Санкт-Петербург
Что такое документы? Я старался объяснить абстрактно, доходчиво. В техническом плане, это записи, которые содержат данные, присущие документам. Заголовок, содержание, дата создания, другая информация.

Что такое пользователи? Записи, содержащие данные, присущие пользователям. Фактически это расширеные записи Kernel.Settings.User.

Использование оператора is? Для выборки я использую класс Query, где в фильтре я могу использовать оператор is, сейчас он и используется.

Что мне не нравится? Хорошо, если пользователю назначен один или два отдела, но если пользователю назначен десяток или больше отделов, фильтр становится монструозным. Вроде:

(Отдел is A or Отдел is B or Отдел is C or Отдел is D or Отдел is E or ...)

Средствами SQL я бы сделал это с помощью JOIN. Есть какой-то другой способ решить мою задачу средствами Турбо, или здесь так принято?


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пт фев 09, 2018 12:00 pm 
Не в сети

Зарегистрирован: Вт мар 30, 2004 12:30 pm
Сообщения: 5015
Откуда: Москва, Кустарь-одиночка с мотором
dmvw34 писал(а):
Отделы имеют иерархию. Например, отделы (A, B, C) могут входить в группу (Владивосток). Если пользователю в качестве отдела назначена группа (Владивосток), выборка должна включать документы всех вложенных отделов

Ну так оператор IS и позволяет указать именно группу и всё, что в неё входит
То есть достаточно в Вашем случае написать (Отдел is {Владивосток} - так пишу для понимания) - и под фильтр попадут и группа Владивосток, и всё, что в неё входит

То, что IS работает и на простых записях - это просто частный случай, ниже в иерархии ничего нет ;)

_________________
Андрей Булетов, Москва
PS Не стесняйтесь, поправьте меня, если я не прав!


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пт фев 09, 2018 1:44 pm 
Не в сети

Зарегистрирован: Пт дек 08, 2017 11:51 am
Сообщения: 18
Откуда: Санкт-Петербург
Это понятно, для этого и используется оператор is. Меня интересует, что делать, если таких групп много?

Пусть отделы (A, B, C) входят в группу Владивосток и я охвачу их с помощью оператора is, но по аналогии также могут существовать группы Москва, Самара, Новосибирск и другие. Их тоже нужно учесть и если использовать эту логику, фильтр станет длинным и возможно неэффективным.

Как решить эту задачу эффективно? Я вижу, что отвечают опытные пользователи, может быть вы сталкивались с аналогичными задачами?


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пт фев 09, 2018 2:26 pm 
Не в сети

Зарегистрирован: Вт мар 30, 2004 12:30 pm
Сообщения: 5015
Откуда: Москва, Кустарь-одиночка с мотором
dmvw34 писал(а):
Пусть отделы (A, B, C) входят в группу Владивосток и я охвачу их с помощью оператора is, но по аналогии также могут существовать группы Москва, Самара, Новосибирск и другие. Их тоже нужно учесть и если использовать эту логику, фильтр станет длинным и возможно неэффективным

А как описать эти группы без их перечисления, если нет признака, по которым их можно объединить?!
Вы же запрос в коде пишите, фильтр набираете программно? Ну так длины строкового поля обычно хватает
То есть, на мой взгляд, вариантов здесь два:
1 - не переживать за длину фильтра. В Т9 работа с SQL построена хорошо, оптимизация запросов ядром выполняется
2- усложнить себе алгоритм/работу - надо понять, какой информацией группы логически объединяются, за счёт чего можно вместо перечисления групп упростить фильтр...

_________________
Андрей Булетов, Москва
PS Не стесняйтесь, поправьте меня, если я не прав!


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пт фев 09, 2018 2:33 pm 
Не в сети

Зарегистрирован: Пн мар 29, 2004 10:25 am
Сообщения: 4890
Откуда: Таганрог
dmvw34 писал(а):
Что такое документы? Я старался объяснить абстрактно, доходчиво. В техническом плане, это записи, которые содержат данные, присущие документам. Заголовок, содержание, дата создания, другая информация.
Что такое пользователи? Записи, содержащие данные, присущие пользователям. Фактически это расширеные записи Kernel.Settings.User.
Использование оператора is? Для выборки я использую класс Query, где в фильтре я могу использовать оператор is, сейчас он и используется.
Что мне не нравится? Хорошо, если пользователю назначен один или два отдела, но если пользователю назначен десяток или больше отделов, фильтр становится монструозным. Вроде:
(Отдел is A or Отдел is B or Отдел is C or Отдел is D or Отдел is E or ...)
Средствами SQL я бы сделал это с помощью JOIN. Есть какой-то другой способ решить мою задачу средствами Турбо, или здесь так принято?

А Вы попытайтесь не "абстрактно, доходчиво", а "конкретно".
В зависимости от того ГДЕ Вы делаете запрос понятие документ разнится. Во внутренних отчетах Документ - это просто источник информации при формирование проводок и к нему запросы укладываются в прокрустово ложе внутренних отчетов и функций в бланках формирования запросов по проводам и оборотам.
Если говорить об информационно-справочной системе (как часть подсистемы Т9) то там под документом понимается ЗАПИСЬ информации и запросы строятся уже с помощью другого механизма - QUERY, который имеет свои ограничения применения. То же и про пользователей. Пользователь - это может быть "пользователь системы" которые строят запросы (работают сейчас в открытой сессии), а может пониматься и запись, содержащая информацию о пользователях.
Было бы проще, если бы Вы описали свою структуру информации В КОТОРОЙ собираетесь что-либо искать...

ЗЫ. То Булетов. Андрей, а что разве мы можем построить запрос например к записям ТМЦ QUERY с возможностью использовать IS в фильтре на записи [Базовый.Данные.Ресурс]? Покажи как фильтр будет выглядеть... Мы же вроде вместо IS строили фильтр по текстовому коду вхождения в группу...

_________________
Александр Золотько, г.Таганрог


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пт фев 09, 2018 3:05 pm 
Не в сети

Зарегистрирован: Вт мар 30, 2004 12:30 pm
Сообщения: 5015
Откуда: Москва, Кустарь-одиночка с мотором
Zolotko писал(а):
а что разве мы можем построить запрос например к записям ТМЦ QUERY с возможностью использовать IS в фильтре на записи [Базовый.Данные.Ресурс]? Покажи как фильтр будет выглядеть... Мы же вроде вместо IS строили фильтр по текстовому коду вхождения в группу...

Да, я поторопился :(
В фильтре запроса принадлежность к группе определяется так: GroupDoc = {Базовый.Данные.Субъект:4743} - к конкретной группе
Или так: Match(GroupPath,'2.*') - вхождение в иерархию, начиная с конкретного уровня

_________________
Андрей Булетов, Москва
PS Не стесняйтесь, поправьте меня, если я не прав!


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Сб фев 10, 2018 11:00 am 
Не в сети

Зарегистрирован: Ср июн 18, 2008 3:03 pm
Сообщения: 988
Для работы с группами в правах доступа есть такие функции:
МашинаРеквизитов.ВычислительПраваДоступа.MakeIs
МашинаРеквизитов.ВычислительПраваДоступа.Группы


"Позиции.Exists((" + MakeIs("ПроцессОткуда",%1) + ") или (" + MakeIs("ПроцессКуда",%1) + "))"
"Позиции.Exists(" + MakeIs("ПроцессОткуда", %1) + " или " + MakeIs("ПроцессКуда", %1) + " или " + MakeIs("ПроцессОткуда", %3) + " или " + MakeIs("ПроцессКуда", %3) + " или " + Группы(Управление.Данные.Процесс,"ПроцессОткуда", [%2]) + ")"
"Позиции.Exists(" + Группы(Управление.Данные.Процесс,"ПроцессОткуда", [%1,%2,%3]) + " или " + Группы(Управление.Данные.Процесс,"ПроцессКуда", [%1,%2]) + ")"
где %1, %2, %3 конкретные ссылки на запись, содержащую(или не содержащую) элементы группы, например, {Управление.Данные.Процесс:567}

_________________
С уважением, Владимир Миронычев.


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Сб фев 10, 2018 3:55 pm 
Не в сети

Зарегистрирован: Пн мар 29, 2004 10:25 am
Сообщения: 4890
Откуда: Таганрог
Володя, а что происходить после того как я программно заменю GroupDOC? GroupPath измениться на автомате или кодом нужно самому отслеживать при перетаскивании (перенос делаю в коде бланка тупа присваивая нужный GroupDoc) из группы в группу?

_________________
Александр Золотько, г.Таганрог


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Вс фев 11, 2018 8:23 pm 
Не в сети

Зарегистрирован: Ср июн 18, 2008 3:03 pm
Сообщения: 988
Zolotko писал(а):
Володя, а что происходить после того как я программно заменю GroupDOC? GroupPath измениться на автомате или кодом нужно самому отслеживать при перетаскивании (перенос делаю в коде бланка тупа присваивая нужный GroupDoc) из группы в группу?

Думаю, что ничего не происходит, кроме изменения GroupDoc. GroupPath изменится при сборке мусора

_________________
С уважением, Владимир Миронычев.


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Сб мар 17, 2018 8:21 am 
Не в сети

Зарегистрирован: Пн мар 29, 2004 10:25 am
Сообщения: 4890
Откуда: Таганрог
Обнаружил что отчет по оборотам В БЛАНКЕ стал воспринимать IS в фильтре. Это глюк или действительно что-то изменилось в экзешнике?
Дополнительный вопрос - как работаtт фильтр по IS - смотрит GroupPath или иным способом обрабатывает цепочку ссылок? Что произойдет в такой выборке если GroupPath не соответствует цепочке ссылок GroupDOC?
У нас есть стандартный метод восстановления таких иерархических путей? Ведь в сборке мусора такой функционал есть. Как его вызвать из бланка?

_________________
Александр Золотько, г.Таганрог


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Фильтр для запроса - нужна помощь
СообщениеДобавлено: Пн мар 26, 2018 8:53 am 
Не в сети

Зарегистрирован: Пн мар 29, 2004 10:25 am
Сообщения: 4890
Откуда: Таганрог
UP!!!
IS теперь можно использовать в фильтре запроса всегда? И как он работает если ссылки GroupDoc не будут соответствовать GroupPath?

_________________
Александр Золотько, г.Таганрог


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB