Пользуемся конфигурацией "Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК 3.0". Запрос в техподдержку уже написан. Однако просто стало интересно разобраться в проблеме. Может кто-то что-то сможет подсказать. Случай интересный.
Проблема повторяется на двух наших базах, на разных ПК.
В конфигурации есть такой документ как "Зачет авансов", по сути он перераспределяет переплаты с одной услуги на другую.
Проблема в том, что данный документ заполняется (не проводится, а именно заполняется):
- под администратором 2-5 секунд.
- под пользователем 2+ минуты (!).
Проводится туда-сюда (+ -) одинаково у обоих.
Стало интересно - с каких радостей такая разница? Делаю копию, сношу пользователю настройки - результата нуль целых, нуль десятых. Создаю нового - результата ровно столько же.
Назначаю пользователю полные права - вуаля! Заполнение документа зачета авансов от пользователя выполняется 2-5 секунд!
Ок.
Возвращаю пользователю его пролетарские права. Делаю замер производительности от админа и пользователя.
Замечаю что от пользователя висит тот самый документ: Документ.УПЖКХ_ЗакрытиеПериодаПоНачислениямЖКХ.МодульОбъекта (да да, это и есть "Зачет авансов", просто так назван в конфигурации).
А именно 220 секунд висит операция выгрузки запроса, ну которая "Результат = Запрос.выполнить().выгрузить();".
Понимаю что дело в запросе, но при этом в остальном коде зависимости от прав пользователя не нахожу. Ок. Открываю самописный внешний отчет, выдергиваю и выкидываю оттуды свой запрос, вкорячиваю запрос разработчика из указанного выше объекта, прописываю параметры, запускаю, формирую и...
- под админом выполняется шустро, сразу же
- под пользователем висит те же 2+ минуты.
И все. И приплыли. Куда дальше копать - неизвестно. И что досадно то - идей нет.
Собственно ясное дело что конфигурация типовая. Забота разработчика, да и обращение уже написано. Но все же хотелось бы понять от чего такая реакция и как тут замешаны права пользователя.
Тот самый запрос, а вернее его часть - которая уже приводит к долгому зависанию (выяснил опытным путем):
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЕСТЬNULL(УПЖКХ_Начисления.СуммаНачисления, 0) КАК Перерасчет,
ВЫБОР
КОГДА УПЖКХ_Начисления.РазделУчета ЕСТЬ NULL
ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.ПустаяСсылка)
ИНАЧЕ ВЫБОР
КОГДА УПЖКХ_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Пени)
ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени)
ИНАЧЕ ВЫБОР
КОГДА УПЖКХ_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Рассрочка)
ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Рассрочка)
ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление)
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК ВидНачисления,
втТаблицаОстатковСДаннымиОПереплатах.Объект КАК Объект,
втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента КАК ДоговорКонтрагента,
втТаблицаОстатковСДаннымиОПереплатах.Услуга КАК Услуга,
втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления КАК МесяцНачисления
ПОМЕСТИТЬ втПерерасчетПредварительная
ИЗ
втТаблицаОстатковСДаннымиОПереплатах КАК втТаблицаОстатковСДаннымиОПереплатах
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УПЖКХ_Начисления КАК УПЖКХ_Начисления
ПО втТаблицаОстатковСДаннымиОПереплатах.Объект = УПЖКХ_Начисления.ЛицевойСчет
И втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента = УПЖКХ_Начисления.Договор
И втТаблицаОстатковСДаннымиОПереплатах.Услуга = УПЖКХ_Начисления.Услуга
И втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления = УПЖКХ_Начисления.МесяцНачисления
ГДЕ
втТаблицаОстатковСДаннымиОПереплатах.ЭтоПереплата
И (втТаблицаОстатковСДаннымиОПереплатах.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление)
ИЛИ втТаблицаОстатковСДаннымиОПереплатах.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени))
И (УПЖКХ_Начисления.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.ПерерасчетНачисления)
ИЛИ УПЖКХ_Начисления.ВидНачисления = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.КорректировкаПриОтсутствииПоказанийПоИПУ))
И УПЖКХ_Начисления.Организация = &Организация
И УПЖКХ_Начисления.СуммаНачисления < 0
Показать
Зависание происходит именно при третьей выборке, в виртуальной таблице втПерерасчетПредварительная
Ну и технические данные:
Тык
• Платформа: 8.3.18.1779
• Конфигурация: 3.0.111.2
• Режим работы: файловый (база 6+ Гб), 1 пользователь
• Оборудование: Windows Server 2012 R2, процессор i7 3+ Ггц, 32Гб ОЗУ, SSD диск.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
УПЖКХ_Начисления.ЛицевойСчет,
УПЖКХ_Начисления.Договор,
УПЖКХ_Начисления.Услуга,
УПЖКХ_Начисления.МесяцНачисления,
УПЖКХ_Начисления.РазделУчета,
УПЖКХ_Начисления.СуммаНачисления
ПОМЕСТИТЬ ТабРН_Начисления
ИЗ
РегистрНакопления.УПЖКХ_Начисления КАК УПЖКХ_Начисления
ГДЕ
УПЖКХ_Начисления.ВидНачисления В (ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.ПерерасчетНачисления), ЗНАЧЕНИЕ(Перечисление.УПЖКХ_ВидыНачислений.КорректировкаПриОтсутствииПоказанийПоИПУ))
И УПЖКХ_Начисления.Организация = &Организация
И УПЖКХ_Начисления.СуммаНачисления < 0
ИНДЕКСИРОВАТЬ ПО
ЛицевойСчет,
Договор,
Услуга,
МесяцНачисления
;
ВЫБРАТЬ
ЕСТЬNULL(ТабРН_Начисления.СуммаНачисления, 0) КАК Перерасчет,
ВЫБОР
КОГДА ТабРН_Начисления.РазделУчета ЕСТЬ NULL
ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.ПустаяСсылка)
ИНАЧЕ ВЫБОР
КОГДА ТабРН_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Пени)
ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени)
КОГДА ТабРН_Начисления.РазделУчета = ЗНАЧЕНИЕ(Перечисление.УПЖКХ_РазделыУчета.Рассрочка)
ТОГДА ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Рассрочка)
ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление)
КОНЕЦ
КОНЕЦ КАК ВидНачисления,
втТаблицаОстатковСДаннымиОПереплатах.Объект КАК Объект,
втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента КАК ДоговорКонтрагента,
втТаблицаОстатковСДаннымиОПереплатах.Услуга КАК Услуга,
втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления КАК МесяцНачисления
ПОМЕСТИТЬ втПерерасчетПредварительная
ИЗ
втТаблицаОстатковСДаннымиОПереплатах КАК втТаблицаОстатковСДаннымиОПереплатах
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабРН_Начисления КАК ТабРН_Начисления
ПО втТаблицаОстатковСДаннымиОПереплатах.Объект = ТабРН_Начисления.ЛицевойСчет
И втТаблицаОстатковСДаннымиОПереплатах.ДоговорКонтрагента = ТабРН_Начисления.Договор
И втТаблицаОстатковСДаннымиОПереплатах.Услуга = ТабРН_Начисления.Услуга
И втТаблицаОстатковСДаннымиОПереплатах.МесяцНачисления = ТабРН_Начисления.МесяцНачисления
ГДЕ
втТаблицаОстатковСДаннымиОПереплатах.ЭтоПереплата
И втТаблицаОстатковСДаннымиОПереплатах.ВидНачисления В ( ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Начисление), ЗНАЧЕНИЕ(Перечисление.КВП_ВидыНачисленияОстатки.Пени))
(3) Нет, не он.
Для каждого объекта конфигурации есть шаблоны ограничений на каждую роль.
В объекте конфигурации можете посмотреть шаблоны. Зайдите в роли - Шаблоны ограничений - там видно.
(12)
Причину установил. Проблема и правда в RLS.
В регистре накопления, в котором лежат записи по начислению услуг - "УПЖКХ_Начисления", у ролей добавлены права на чтение/запись/просмотр и т.д. А ниже у некоторых прописано ограничение на уровне объектов. У всех у кого есть ограничение, оно вот такого вида:
#ПоОбъектамУчета("ЛицевойСчет.Адрес.Владелец","")
Так же прикрепил скриншот.
После удаления правила и обновления конфигурации БД - под пользователем с измененной мною ролью отчет с данным запросом стал формироваться так же быстро, как под администратором. Заполнение документа зачета авансов тоже происходит нормально.
Причина известна.
Вот теперь буду пытаться ее решить через техподдержку. Вносить правки в работающую конфигурацию не хочу. А без этого данную проблему не решить, видимо...
Хотя конфу бы глянуть, возможно там какие-то права расписаны.
Через конфигуратор назначал пользователю все права, кроме администратора системы и полных прав. Результата не дало. Ну то есть программа так же подвисает на 2+ минуты при заполнении документа.
Причем в остальном проблем вообще нет. Другие документы, отчеты и т.д. - все без долгих зависаний.
Тормоза с rls бывают из-за наличия в запросе обращения через две точки к реквизиту составного типа пр. ТоварыВРознице.Регистратор.Дата, причем не важно в какой выборке запроса это происходит.
Тоже самое бывает при СОЕДИНЕНИИ составных типов.