Время запроса напрямую зависит от прав пользователя

1. gkhvgkh 07.09.22 12:06 Сейчас в теме
Доброго дня!

Пользуемся конфигурацией "Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК 3.0". Запрос в техподдержку уже написан. Однако просто стало интересно разобраться в проблеме. Может кто-то что-то сможет подсказать. Случай интересный.
Проблема повторяется на двух наших базах, на разных ПК.

В конфигурации есть такой документ как "Зачет авансов", по сути он перераспределяет переплаты с одной услуги на другую.

Проблема в том, что данный документ заполняется (не проводится, а именно заполняется):
- под администратором 2-5 секунд.
- под пользователем 2+ минуты (!).

Проводится туда-сюда (+ -) одинаково у обоих.

Стало интересно - с каких радостей такая разница? Делаю копию, сношу пользователю настройки - результата нуль целых, нуль десятых. Создаю нового - результата ровно столько же.
Назначаю пользователю полные права - вуаля! Заполнение документа зачета авансов от пользователя выполняется 2-5 секунд!

Ок.

Возвращаю пользователю его пролетарские права. Делаю замер производительности от админа и пользователя.
Замечаю что от пользователя висит тот самый документ: Документ.УПЖКХ_ЗакрытиеПериодаПоНачислениямЖКХ.МодульОбъекта (да да, это и есть "Зачет авансов", просто так назван в конфигурации).
А именно 220 секунд висит операция выгрузки запроса, ну которая "Результат = Запрос.выполнить().выгрузить();".

Понимаю что дело в запросе, но при этом в остальном коде зависимости от прав пользователя не нахожу. Ок. Открываю самописный внешний отчет, выдергиваю и выкидываю оттуды свой запрос, вкорячиваю запрос разработчика из указанного выше объекта, прописываю параметры, запускаю, формирую и...
- под админом выполняется шустро, сразу же
- под пользователем висит те же 2+ минуты.

И все. И приплыли. Куда дальше копать - неизвестно. И что досадно то - идей нет.

Собственно ясное дело что конфигурация типовая. Забота разработчика, да и обращение уже написано. Но все же хотелось бы понять от чего такая реакция и как тут замешаны права пользователя.

Тот самый запрос, а вернее его часть - которая уже приводит к долгому зависанию (выяснил опытным путем):
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ЕСТЬNULL(УПЖКХ_Начисления.СуммаНачисления, 0) КАК Перерасчет,
	ВЫБОР
		КОГДА УПЖКХ_Начисления.РазделУчета ЕСТЬ NULL
			ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.ПустаяСсылка)
		ИНАЧЕ ВЫБОР
				КОГДА УПЖКХ_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Пени)
					ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени)
				ИНАЧЕ ВЫБОР
						КОГДА УПЖКХ_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Рассрочка)
							ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Рассрочка)
						ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление)
					КОНЕЦ
			КОНЕЦ
	КОНЕЦ КАК ВидНачисления,
	втТаблицаОстатковСДаннымиОПереплатах.Объект КАК Объект,
	втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента КАК ДоговорКонтрагента,
	втТаблицаОстатковСДаннымиОПереплатах.Услуга КАК Услуга,
	втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления КАК МесяцНачисления
ПОМЕСТИТЬ втПерерасчетПредварительная
ИЗ
	втТаблицаОстатковСДаннымиОПереплатах КАК втТаблицаОстатковСДаннымиОПереплатах
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УПЖКХ_Начисления КАК УПЖКХ_Начисления
		ПО втТаблицаОстатковСДаннымиОПереплатах.Объект = УПЖКХ_Начисления.ЛицевойСчет
			И втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента = УПЖКХ_Начисления.Договор
			И втТаблицаОстатковСДаннымиОПереплатах.Услуга = УПЖКХ_Начисления.Услуга
			И втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления = УПЖКХ_Начисления.МесяцНачисления
ГДЕ
	втТаблицаОстатковСДаннымиОПереплатах.ЭтоПереплата
	И (втТаблицаОстатковСДаннымиОПереплатах.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление)
			ИЛИ втТаблицаОстатковСДаннымиОПереплатах.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени))
	И (УПЖКХ_Начисления.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.ПерерасчетНачисления)
			ИЛИ УПЖКХ_Начисления.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.КорректировкаПриОтсутствииПоказанийПоИПУ))
	И УПЖКХ_Начисления.Организация = &Организация
	И УПЖКХ_Начисления.СуммаНачисления < 0
Показать

Зависание происходит именно при третьей выборке, в виртуальной таблице втПерерасчетПредварительная

Ну и технические данные:
Тык


За ответы всем спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
13. Sashares 35 07.09.22 12:58 Сейчас в теме
(1) Попробуйте так изменить запрос:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
УПЖКХ_Начисления.ЛицевойСчет,
УПЖКХ_Начисления.Договор,
УПЖКХ_Начисления.Услуга,
УПЖКХ_Начисления.МесяцНачисления,
УПЖКХ_Начисления.РазделУчета,
УПЖКХ_Начисления.СуммаНачисления
ПОМЕСТИТЬ ТабРН_Начисления
ИЗ
РегистрНакопления.УПЖКХ_Начисления КАК УПЖКХ_Начисления
ГДЕ
УПЖКХ_Начисления.ВидНачисления В (ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.ПерерасчетНачисления), ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.КорректировкаПриОтсутствииПоказанийПоИПУ))
    И УПЖКХ_Начисления.Организация = &Организация
    И УПЖКХ_Начисления.СуммаНачисления < 0
ИНДЕКСИРОВАТЬ ПО 
ЛицевойСчет,
Договор,
Услуга,
МесяцНачисления
;
ВЫБРАТЬ
    ЕСТЬNULL(ТабРН_Начисления.СуммаНачисления, 0) КАК Перерасчет,
    ВЫБОР
        КОГДА ТабРН_Начисления.РазделУчета ЕСТЬ NULL
            ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.ПустаяСсылка)
        ИНАЧЕ ВЫБОР
                КОГДА ТабРН_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Пени)
                    ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени)
               
               КОГДА ТабРН_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Рассрочка)
                   ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Рассрочка)
                   ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление)
            КОНЕЦ
    КОНЕЦ КАК ВидНачисления,
    втТаблицаОстатковСДаннымиОПереплатах.Объект КАК Объект,
    втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента КАК ДоговорКонтрагента,
    втТаблицаОстатковСДаннымиОПереплатах.Услуга КАК Услуга,
    втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления КАК МесяцНачисления
ПОМЕСТИТЬ втПерерасчетПредварительная
ИЗ
    втТаблицаОстатковСДаннымиОПереплатах КАК втТаблицаОстатковСДаннымиОПереплатах
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабРН_Начисления КАК ТабРН_Начисления
        ПО втТаблицаОстатковСДаннымиОПереплатах.Объект = ТабРН_Начисления.ЛицевойСчет
            И втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента = ТабРН_Начисления.Договор
            И втТаблицаОстатковСДаннымиОПереплатах.Услуга = ТабРН_Начисления.Услуга
            И втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления = ТабРН_Начисления.МесяцНачисления
ГДЕ
    втТаблицаОстатковСДаннымиОПереплатах.ЭтоПереплата
    И втТаблицаОстатковСДаннымиОПереплатах.ВидНачисления В ( ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление), ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени))
Показать
2. Online-Ufa 07.09.22 12:09 Сейчас в теме
3. gkhvgkh 07.09.22 12:17 Сейчас в теме
(2) это тот, который "Ограничивать доступ на уровне записей"? - выключен.
8. Denis_CFO 49 07.09.22 12:52 Сейчас в теме
(3) Нет, не он.
Для каждого объекта конфигурации есть шаблоны ограничений на каждую роль.
В объекте конфигурации можете посмотреть шаблоны. Зайдите в роли - Шаблоны ограничений - там видно.
11. gkhvgkh 07.09.22 12:54 Сейчас в теме
(8) так же изучу этот вопрос подробнее завтра. У нас уже вечер ) Но спасибо за комментарий. Постараюсь найти конкретный пункт, влияющий на проблему.
12. Denis_CFO 49 07.09.22 12:56 Сейчас в теме
(11)
У нас уже вечер

ЖКХ_В_ЖКХ - жестко у вас :)

Если что - пишите, может и разберемся.
16. gkhvgkh 08.09.22 05:43 Сейчас в теме
(12)
Причину установил. Проблема и правда в RLS.
В регистре накопления, в котором лежат записи по начислению услуг - "УПЖКХ_Начисления", у ролей добавлены права на чтение/запись/просмотр и т.д. А ниже у некоторых прописано ограничение на уровне объектов. У всех у кого есть ограничение, оно вот такого вида:

#ПоОбъектамУчета("ЛицевойСчет.Адрес.Владелец","")

Так же прикрепил скриншот.

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

Вот теперь буду пытаться ее решить через техподдержку. Вносить правки в работающую конфигурацию не хочу. А без этого данную проблему не решить, видимо...

Спасибо!
4. user1203706 14 07.09.22 12:31 Сейчас в теме
(1) ФО нет никаких там, случаем ?
5. gkhvgkh 07.09.22 12:35 Сейчас в теме
(4) что вы подразумеваете под ФО? Не могу понять...
6. Denis_CFO 49 07.09.22 12:49 Сейчас в теме
(5) ФО - Функциональные опции.
Только я тоже не знаю, как права пользователя и админа от них зависят.

Хотя конфу бы глянуть, возможно там какие-то права расписаны.
9. gkhvgkh 07.09.22 12:52 Сейчас в теме
(6) покопаюсь завтра на этот счет. Как и над RLS (хотя она, вроде, вообще отключена у нас).

(6)
Хотя конфу бы глянуть, возможно там какие-то права расписаны.

Через конфигуратор назначал пользователю все права, кроме администратора системы и полных прав. Результата не дало. Ну то есть программа так же подвисает на 2+ минуты при заполнении документа.

Причем в остальном проблем вообще нет. Другие документы, отчеты и т.д. - все без долгих зависаний.
7. toypaul 63 07.09.22 12:51 Сейчас в теме
Для начала почитать что такое RLS. Это не тот, который "Ограничивать доступ на уровне записей"?

Может быть и по другому организовано.

Например можно выполнить запрос без РАЗРЕШЕННЫЕ. Если без него выполняется быстрее, значит 100% причина в RLS
karamazoff; +1 Ответить
10. gkhvgkh 07.09.22 12:53 Сейчас в теме
(7) в свой внешний отчет запрос включил удалив слово "РАЗРЕШЕННЫЕ". На результат не повлияло...
14. toypaul 63 07.09.22 15:37 Сейчас в теме
(10) тогда тут что-то более сложное. тут уже нужно подключать инструменты типа технологического журнала или sql profiler
15. RustamZz 07.09.22 17:04 Сейчас в теме
(14) Файловая база у автора.
sql profiler
17. gkhvgkh 08.09.22 05:45 Сейчас в теме
(14)

Вы правы. Причина в RLS. Вот тут расписал человеку подробно: http://forum.infostart.ru/forum26/topic287032/message2872224/#message2872224

Только вот странно что приставка "РАЗРЕШЕННЫЕ" не оказывает влияния на проблему. Но возможно я чего-то не понимаю.
19. 1cNBL 11.05.23 15:18 Сейчас в теме
Тормоза с rls бывают из-за наличия в запросе обращения через две точки к реквизиту составного типа пр. ТоварыВРознице.Регистратор.Дата, причем не важно в какой выборке запроса это происходит.
Тоже самое бывает при СОЕДИНЕНИИ составных типов.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот