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

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

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

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

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

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

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

Ок.

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

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

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

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

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

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

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


За ответы всем спасибо.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
13. Sashares 34 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 48 07.09.22 12:52 Сейчас в теме
(3) Нет, не он.
Для каждого объекта конфигурации есть шаблоны ограничений на каждую роль.
В объекте конфигурации можете посмотреть шаблоны. Зайдите в роли - Шаблоны ограничений - там видно.
11. gkhvgkh 07.09.22 12:54 Сейчас в теме
(8) так же изучу этот вопрос подробнее завтра. У нас уже вечер ) Но спасибо за комментарий. Постараюсь найти конкретный пункт, влияющий на проблему.
12. Denis_CFO 48 07.09.22 12:56 Сейчас в теме
(11)
У нас уже вечер

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

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

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

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

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

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

Спасибо!
4. user1203706 12 07.09.22 12:31 Сейчас в теме
(1) ФО нет никаких там, случаем ?
5. gkhvgkh 07.09.22 12:35 Сейчас в теме
(4) что вы подразумеваете под ФО? Не могу понять...
6. Denis_CFO 48 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 бывают из-за наличия в запросе обращения через две точки к реквизиту составного типа пр. ТоварыВРознице.Регистратор.Дата, причем не важно в какой выборке запроса это происходит.
Тоже самое бывает при СОЕДИНЕНИИ составных типов.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)