Имя: Пароль:
1C
1С v8
Разная скорость работы обработки в УТ 11
,
0 HiloNakamura
 
27.10.22
10:15
Здравствуйте!
1С 8.3 УТ 11. база SQL, тонкий клиент.
Захожу под администратором и запускаю обработку которая формирует цены по номенклатуре.
Под пользователем с админскими правами обработка формирует отчёт 30 секунд, под обычным пользователем почти 6 минут формирует.
Подскажите пожалуйста куда тут копать, в чём может быть причина такой разницы работы обработки под разными пользователями?
Может работает какое то дефолтное распределение ресурсов сервера 1С, когда он пользователю с права админа отдаёт все ресурсы, а обычным пользователям нет.
1 Kassern
 
27.10.22
10:17
(0) Запуск с одного рабочего места дает такую разницу по времени?
2 Фрэнки
 
27.10.22
10:17
А фига там копать-то, если в этой базе наверняка RLS активирован.
Т.е. у полных прав RLS игнорится, а на пользовательских - отрабатывает полностью.
3 Kassern
 
27.10.22
10:19
(2) Ну или костыль в коде, мол Если Не РольДоступна("ПолныеПрава") Тогда "Запустим долгую унылую логику и 100500 проверок еще и письмо напишем, что этот Вася посмел сформировать отчет" КонецЕсли
4 Фрэнки
 
27.10.22
10:20
(3) вряд ли. Эта проверка на РольДоступна как раз и пишется всякий раз, когда костыль в виде RLS приводит к жутким тормозам.
5 Фрэнки
 
27.10.22
10:22
(3) По идее, у ТС нужно уточнить, есть в этой базе доработки в части RLS или там полностью типовая конфа с небольшими довесками.
6 Kassern
 
27.10.22
10:24
(4) (5) Самый простой способ - запустить замер производительности и глянуть, что там столько времени отожрало.
7 HiloNakamura
 
27.10.22
10:32
(1) С разных рабочих мест, с разных ПК, на тонких клиентах.
(2) Еще не в курсе что такое RLS, совсем недавно начал админить 8ку.
(6) Этим, пожалуй, сейчас и займусь)
8 Kassern
 
27.10.22
10:35
(7) Может там антивирусник проявляет особую активность у клиента, поэтому 1ска подвисает и результат отображает с задержкой? Проверьте на одном рабочем месте под 2мя пользователями.
9 HiloNakamura
 
27.10.22
10:38
(8) Проверяли, тот же результат. Даже сейчас на сервере, на толстом клиенте такая же история, под админом за 30 секунд обработка отрабатывает, под обычным юзером - 6 минут.
10 Фрэнки
 
27.10.22
10:45
(9) https://xn----1-bedvffifm4g.xn--p1ai/news/rls-data-access-restrictions/

Я даже ссылку уже нашел. Осталось только прочитать и проверить :-)
11 Kassern
 
27.10.22
10:47
(9) "на толстом клиенте такая же история" - а зачем вы толстый клиент для УТ11 запускаете?
12 Фрэнки
 
27.10.22
10:51
(11) ну так запросики кто-то из них там кропает в консолях
Допустим, при написании запросов в подсистеме Обеспечения можно их прямо в режиме Предприятием, только толстый клиент нужен для конструктора запросов.

или обработина какая-то из прошлого есть, которую под УФ так и не переписали.
13 Kassern
 
27.10.22
10:54
(12) Так есть же консоль запросов под УФ. Все норм отрабатывает, толстый клиент не нужен для этого.
14 Фрэнки
 
27.10.22
10:59
(13) ну что ты как маленький? Они там даже не знают сходу о том, что включен у них в базе RLS или нет, а ты говоришь, что где-то у кого-то есть консоль запросов под УФ.

И еще, я написал конкретно о подсистеме Обеспечения.
Даже если ты запустишь для себя лично консоль запросов на УФ или конфигуратор с его конструктором,
то это не поможет в подсистему Обеспечение текст запроса засунуть, если с Толстым клиентом не запускаться.
15 HiloNakamura
 
27.10.22
11:41
Вод код запускаемой обработки:

-------------------------------------------------------------------
&НаКлиенте
Процедура Загрузить(Команда)
    ЗагрузитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере()
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ВложенныйЗапрос.Номенклатура КАК Номенклатура,
                          |    ВложенныйЗапрос.ВНаличииОстаток КАК ВНаличииОстаток,
                          |    ВложенныйЗапрос.Цена КАК Цена,
                          |    ВложенныйЗапрос1.Значение КАК Значение
                          |ИЗ
                          |    (ВЫБРАТЬ
                          |        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
                          |        СУММА(ТоварыНаСкладахОстатки.ВНаличииОстаток) КАК ВНаличииОстаток,
                          |        ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
                          |    ИЗ
                          |        РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыНаСкладахОстатки
                          |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
                          |            ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                          |    
                          |    СГРУППИРОВАТЬ ПО
                          |        ТоварыНаСкладахОстатки.Номенклатура,
                          |        ЦеныНоменклатурыСрезПоследних.Цена) КАК ВложенныйЗапрос
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                          |            НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
                          |            НоменклатураДополнительныеРеквизиты.Значение КАК Значение
                          |        ИЗ
                          |            Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
                          |                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
                          |                ПО НоменклатураДополнительныеРеквизиты.Ссылка = Номенклатура.Ссылка
                          |        ГДЕ
                          |            НоменклатураДополнительныеРеквизиты.Свойство = &Свойство) КАК ВложенныйЗапрос1
                          |        ПО ВложенныйЗапрос.Номенклатура = ВложенныйЗапрос1.Ссылка");
    
    Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("Свойство", Реквизит);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Элемент                     = Список.Добавить();
        Элемент.Номенклатура        = Выборка.Номенклатура;
        Элемент.Остаток             = Выборка.ВНаличииОстаток;
        Элемент.Цена                 = Выборка.Цена;
        Элемент.Категория             = Выборка.Номенклатура.Родитель;
        Элемент.ЗначениеРеквизита    = Выборка.Значение;
    КонецЦикла;
        
    Список.Сортировать("ЗначениеРеквизита,Номенклатура ВОЗР");
    
КонецПроцедуры


&НаКлиенте
Процедура РеквизитПриИзменении(Элемент)
    Если ЗначениеЗаполнено(Реквизит) Тогда
        Элементы.СписокБрэнд.Заголовок = Строка(Реквизит);
    Иначе
        Элементы.СписокБрэнд.Заголовок = "...";
    КонецЕсли;    
КонецПроцедуры
-------------------------------------------------------------------

Насколько я могу понять, механизм RLS в ней явно не используется.
Отладка сейчас показывает 260 накопленных вызовов за 380 секунд.
16 Фрэнки
 
27.10.22
11:42
И еще вспомнил, при установке Вида цен есть возможность указать Произвольный запрос к ИБ. Вот чтоб его указывать тоже нужен запуск в толстом клиенте.
17 Фрэнки
 
27.10.22
11:47
(15) самое просто, без глубоких поисков и разбирательств, хотя может потребовать времени на создание базы и т.п.

Открой в копии базы для тестирования или разработки (у вас же есть такие возможности, верно?)
Убери там настройки внутри раздела Настройки пользователей и прав - там увидишь в Группах доступа галочки на "Ограничивать доступ на уровне записей" и далее там.
И пробуй формировать.
Т.е. сразу в копии глянь, как оно формирует сейчас. а затем отключи и посмотри без него.
18 Kassern
 
27.10.22
11:47
(15) Перепишите этот как на временные таблицы. Во втором вложенном запросе зачем вы ТЧ номенклатуры с номенклатурой соединяете левым соединением, если потом правую таблицу нигде не используете? И почему у вас 2 вложенных запроса никак не соединены?
19 Kassern
 
27.10.22
11:47
(17) да тут просто корявый запрос, который под одним юзвером скуль норм план строит, а под другим - шлет лесом.
20 Kassern
 
27.10.22
11:51
(15) Попробуйте вот так запрос написать (на коленке состряпал)

ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    СУММА(ТоварыНаСкладахОстатки.ВНаличииОстаток) КАК ВНаличииОстаток,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК ЗначениеСвойства
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыНаСкладахОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО ТоварыНаСкладахОстатки.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка
            И (НоменклатураДополнительныеРеквизиты.Свойство = &Свойство)

СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОстатки.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "")
21 HiloNakamura
 
27.10.22
13:55
(17) Попробовал. Снял галочку ограничения доступа. Результат тот же - 30 сек с правами админа и 6 минут с обычным пользователем.
Еще момент. "Обновление доступа на уровне записей" у меня висит на 95% и выкатывается с ошибкой.
22 HiloNakamura
 
27.10.22
13:56
ОШИБКА ОБНОВЛЕНИЯ ДОСТУПА

При обновлении ключей доступа к элементам данных списка
"Корректировка перемещения (Документ)" (для пользователей)
возникла ошибка:
10/27/2022 6:55:35 PM Невозможно обновить ключ доступа объекта "Корректировка перемещения 00000000001 dated 7/4/2022 12:00:07 PM" типа "Корректировка перемещения",
так как этот тип не указан в определяемом типе ВладелецЗначенийКлючейДоступа.
{ОбщийМодуль.УправлениеДоступомСлужебный.Модуль(16920)}:        ВызватьИсключение ТекстОшибки;
{ОбщийМодуль.УправлениеДоступомСлужебный.Модуль(16215)}:    ЗаписатьКлючиДоступаОбъектов(ПараметрыОбновления, Контекст);
{ОбщийМодуль.УправлениеДоступомСлужебный.Модуль(13689)}:        ОбновитьЭлементыДанныхСпискаСУстаревшимРазрешеннымКлючом(Элементы, ПараметрыОбновления);
{ОбщийМодуль.УправлениеДоступомСлужебный.Модуль(12975)}:        ОбновитьПорциюЭлементов(Элементы, ПараметрыОбновления);
{ОбщийМодуль.УправлениеДоступомСлужебный.Модуль(12735)}:            ВыполнитьОбновлениеДоступаСписка(ОбщиеПараметрыОбновления);
{ОбщийМодуль.УправлениеДоступомСлужебный.Модуль(12043)}:            ВыполнитьОбновлениеДоступаСпискаСПопыткамиПовтора(ОбщиеПараметрыОбновления, Контекст);
23 Kassern
 
27.10.22
13:59
(22) попробуйте добавить этот док в определяемый тип
24 Kassern
 
27.10.22
14:00
(22) А откуда у вас вообще документ взялся "Корректировка перемещения"? Сами прикрутили? Не припомню такого в УТ11
25 Мультук
 
гуру
27.10.22
14:05
(16) (18)

РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, )

Запрос.УстановитьПараметр("Дата", ТекущаяДата());

За такие вещи нынче уже пальцем не тыкают или "ну и хрен с ним" ?
26 Kassern
 
27.10.22
14:08
(25) Не посмотрел параметры запроса)) Думал, что там указывается дата, а так да, надо потыкать пальцем и сказать атата. Для текущей даты не надо указывать период в таблице. Так быстрее отработает запрос