Имя: Пароль:
1C
1С v8
Запрос долго что-то (Профиль гр дост - по Организация, назн в группах доступа)
,
0 korppinen
 
10.02.15
19:35
8.3.5.1383
БП 3.0.37.35


1. Скопировал типовой Профиль группы доступа ГлБухгалтер, назвал его ГлБухгалтер1.
2. Добавил в него ограничения доступа: Организация, Уч записи эл почты (Всезапрещены,Исключения назначаются в группах доступа).
3. Назначил пользователю. Всё ок.. работает.

Есть внешний отчет.. (мой первый под УФ;) вот кусок кода..

Вопрос. Под Админом с учетом по всем организациям, исполняется мгновенно, под пользователем с профилем ГлБухгалтер1 и доступом только по разрешенной организации - этот запросик делается полминуты(!) Куда смотреть то?
Спасибо.



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

</code>
1 Fragster
 
гуру
10.02.15
21:33
отбор по субконто - в параметры виртуальной таблицы
2 Fragster
 
гуру
10.02.15
21:34
ХозрасчетныйОстаткиИОбороты.Регистратор.ххх -> Выразить(ХозрасчетныйОстаткиИОбороты.Регистратор КАК док.ххх).ххх
3 korppinen
 
11.02.15
09:43
обновил до 8.3.5.1443.. всё тоже..

2 - может и не супер оптимально у меня, но полминуты не из-за этого.
4 Fragster
 
гуру
11.02.15
10:06
(3) ты бы сделал сначала (1) и (2)
5 korppinen
 
11.02.15
10:54
Спасибо.. соптимизировали.. теперь эта фигня делается 5(!) сек у пользователя с правом только на одну организацию..
Ну не в этом же дело?

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

    
    ВыделенныеРасчетныеСчета = Новый Массив;
    Для каждого ТекСчет Из ПараметрыОтчета.БанковскиеСчета Цикл
        Если  ТекСчет.Пометка Тогда
            ВыделенныеРасчетныеСчета.Добавить(ТекСчет.Значение);
        КонецЕсли;
    КонецЦикла;
    
    Запрос.УстановитьПараметр("ВыделенныеРасчетныеСчета", ВыделенныеРасчетныеСчета);
    
    РезультатЗапроса = Запрос.Выполнить();
    Сообщить ("1.3 "+ТекущаяДата());


<code>
6 korppinen
 
11.02.15
10:58
не понимаю.. что то с правами..
7 Fragster
 
гуру
11.02.15
11:04
автоупорядочивание
8 Fragster
 
гуру
11.02.15
11:05
соответственно
Выразить(ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Спроавочник.ххх) КАК РасчетныйСчет
9 n0ther
 
11.02.15
11:05
(0) rls что ли включил? и медленнее стало работать? страааанно
10 korppinen
 
11.02.15
11:30
Да.. не понимаю что такое.. Оптимальным запросом проблему не решить
11 korppinen
 
11.02.15
11:30
(8) Сделал.. та же песня
12 n0ther
 
11.02.15
11:38
(10) при включенном ограничении на уровне записей, у пользователя с ограничениями к этому запросу будет присоединен еще кусок из RLS, что однозначно замедлит его выполнение.
13 korppinen
 
11.02.15
11:44
(12) я не правильно организовал учет по одной организации?
14 korppinen
 
11.02.15
11:46
не ну есть же стандартные отчеты.. касс книга и пр, гораздо сложнее.. и они норм у такого пользователя формируются..
15 n0ther
 
11.02.15
11:51
(13) да почему, всё правильно. Различия в производительности под полными правами и под "подрезанными" будут все равно. Даже в типовых отчетах.

Попробуй выполнить запрос в консоли запросов под правами пользователя. Если быстро выполнится то точно проблема RLS, если так же по времени, то надо запрос оптимизировать.
16 Fragster
 
гуру
11.02.15
13:10
ИНАЧЕ ХозрасчетныйОстаткиИОбороты.Регистратор.Контрагент - все портит вот такая лажа.
17 Fragster
 
гуру
11.02.15
13:12
вероятно надо из корсубконто брать контрагента, а не из регистратора. Ну и про "назначение" то же самое
18 Fragster
 
гуру
11.02.15
13:13
две точки при составном типе пагубно влияют, особенно если по какому-то из возможных типов есть РЛС
19 korppinen
 
11.02.15
13:19
Спасибо. и не лажануться то терь в запросе чуть.. на 8.1 точно такой не было.
20 korppinen
 
20.02.15
17:11
Решил так в итоге..

УстановитьПривилегированныйРежим (Истина)
Запрос= Новый Запрос......

УстановитьПривилегированныйРежим (Ложь)
21 Fragster
 
гуру
20.02.15
18:21
(20) а стоило просто решить вопрос с вдумя точками без выразить... ХозрасчетныйОстаткиИОбороты.Регистратор.НазначениеПлатежа
22 Fragster
 
гуру
20.02.15
18:21
и ХозрасчетныйОстаткиИОбороты.Регистратор.Контрагент
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший