Имя: Пароль:
1C
 
Оптимизировать получение данных
,
0 RomaH
 
naïve
14.07.22
11:24
|    табРасписание КАК табРасписание
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаписьНаПрием КАК ЗаписьНаПрием
    |        ПО табРасписание.Врач = ЗаписьНаПрием.Врач
    |            И табРасписание.НачалоОкна <= ЗаписьНаПрием.ДатаПриема
    |            И табРасписание.КонецОкна > ЗаписьНаПрием.ДатаПриема


есть вот такой запрос

регистр:
https://ibb.co/cwpC75P   желтым выделены индексированные поля (врача и дату приема сейчас проиндексировал - не помогло)

запрос выполняется 1.5 - 2 секунды

как возможно ускорить?
1 RomanYS
 
14.07.22
11:28
(0) скорее всего в табРасписание более менее актуальные периоды, может предварительно выбрать из регистра ВТ только эти периоды, а потом уже соединять
2 Kassern
 
14.07.22
11:29
(0) а давно у нас врачи ресурсом считаются? Обидно даже стало
3 RomaH
 
naïve
14.07.22
11:33
(2) а зачем они в измерении?
4 Мультук
 
гуру
14.07.22
11:37
(0)

1) В порядке бреда -- врачей мало, ДатаПриема много больше.

Убрать индекс по врачам. оставить по ДатаПриема и посмотреть план запроса ?

2) Сколько всего записей на выходе ? Может они выбираются быстро, а на клиента передаются медленно
5 RomaH
 
naïve
14.07.22
11:41
(4) это выполнение именно этой части запроса - разбиваю текст по ";" и выполняю
индексов по врачам и дате не было - добавил сначала по дате - потом по врачам - разницы не заметил
6 Kassern
 
14.07.22
11:45
(0) покажи уже весь запрос
7 RomaH
 
naïve
14.07.22
11:45
а вот вынос во временную таблицу сократил общее время в два раза с 1.2 до 0.6
8 Dmitrii
 
гуру
14.07.22
11:46
(0) Если таблица РегистрСведений.ЗаписьНаПрием большая, то попробовать получить предварительный набор данных во временную таблицу.
И соединять табРасписание уже с этой временной таблицей.
9 RomaH
 
naïve
14.07.22
11:46
ВЫБРАТЬ
    |    Числа.Число КАК А
    |ПОМЕСТИТЬ таб
    |ИЗ
    |    РегистрСведений.Числа КАК Числа
    |ГДЕ
    |    Числа.Число < 100
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЕСТЬNULL(АдминистраторыЗаписиНаПрием.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.АдминистраторыЗаписиНаПрием), ЛОЖЬ) КАК АдминистраторыЗаписиНаПрием,
    |    ЕСТЬNULL(Интернет.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.Интернет), ЛОЖЬ) КАК Интернет,
    |    ЕСТЬNULL(КоллЦентр.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.КоллЦентр), ЛОЖЬ) КАК КоллЦентр,
    |    ЕСТЬNULL(МедицинскийПерсонал.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.МедицинскийПерсонал), ЛОЖЬ) КАК МедицинскийПерсонал,
    |    ЕСТЬNULL(Регистратура.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.Регистратура), ЛОЖЬ) КАК Регистратура
    |ПОМЕСТИТЬ втРазрешенияПользователя
    |ИЗ
    |    Справочник.Пользователи КАК СправочникПользователи
    |        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ГруппыПользователейСостав.Ссылка КАК Ссылка
    |        ИЗ
    |            Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
    |        ГДЕ
    |            ГруппыПользователейСостав.Пользователь = &ТекущийПользователь
    |            И ГруппыПользователейСостав.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.АдминистраторыЗаписиНаПрием)) КАК АдминистраторыЗаписиНаПрием
    |        ПО (ИСТИНА)
    |        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ГруппыПользователейСостав.Ссылка КАК Ссылка
    |        ИЗ
    |            Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
    |        ГДЕ
    |            ГруппыПользователейСостав.Пользователь = &ТекущийПользователь
    |            И ГруппыПользователейСостав.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.Интернет)) КАК Интернет
    |        ПО (ИСТИНА)
    |        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ГруппыПользователейСостав.Ссылка КАК Ссылка
    |        ИЗ
    |            Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
    |        ГДЕ
    |            ГруппыПользователейСостав.Пользователь = &ТекущийПользователь
    |            И ГруппыПользователейСостав.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.КоллЦентр)) КАК КоллЦентр
    |        ПО (ИСТИНА)
    |        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ГруппыПользователейСостав.Ссылка КАК Ссылка
    |        ИЗ
    |            Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
    |        ГДЕ
    |            ГруппыПользователейСостав.Пользователь = &ТекущийПользователь
    |            И ГруппыПользователейСостав.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.МедицинскийПерсонал)) КАК МедицинскийПерсонал
    |        ПО (ИСТИНА)
    |        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ГруппыПользователейСостав.Ссылка КАК Ссылка
    |        ИЗ
    |            Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
    |        ГДЕ
    |            ГруппыПользователейСостав.Пользователь = &ТекущийПользователь
    |            И ГруппыПользователейСостав.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.Регистратура)) КАК Регистратура
    |        ПО (ИСТИНА)
    |ГДЕ
    |    СправочникПользователи.Ссылка = &ТекущийПользователь
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВремяПриема.Кабинет.Родитель КАК КабинетРодитель,
    |    ВремяПриема.Врач КАК Врач,
    |    ВремяПриема.Кабинет КАК Кабинет,
    |    НАЧАЛОПЕРИОДА(ВремяПриема.Период, ДЕНЬ) КАК Период,
    |    ВремяПриема.Период КАК ПриемС,
    |    ВремяПриема.ВремяОкончанияПриема КАК ПриемДо,
    |    ДОБАВИТЬКДАТЕ(ВремяПриема.Период, СЕКУНДА, РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ВремяПриема.ПродолжительностьПриема, СЕКУНДА) * таб.А) КАК НачалоОкна,
    |    ДОБАВИТЬКДАТЕ(ВремяПриема.Период, СЕКУНДА, РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ВремяПриема.ПродолжительностьПриема, СЕКУНДА) * (таб.А + 1)) КАК КонецОкна,
    |    (ВремяПриема.ЗаписываетРегистратура
    |            И РазрешенияПользователя.Регистратура
    |        ИЛИ ВремяПриема.ЗаписываетВрач
    |            И РазрешенияПользователя.МедицинскийПерсонал
    |        ИЛИ ВремяПриема.ЗаписываетТелефон
    |            И РазрешенияПользователя.КоллЦентр
    |        ИЛИ ВремяПриема.ЗаписываетИнтернет
    |            И РазрешенияПользователя.Интернет
    |        ИЛИ ВремяПриема.ЗаписываетМенеджер
    |            И РазрешенияПользователя.АдминистраторыЗаписиНаПрием)
    |        И (НЕ ВремяПриема.ЗаписываетСпециалист
    |            ИЛИ ВремяПриема.ЗаписываетСпециалист
    |                И ВремяПриема.Врач.ФизическоеЛицо = &ТекущийСпециалист) КАК РазрешенаЗапись,
    |    ВЫБОР
    |        КОГДА ИсключениеИзПриема.Врач ЕСТЬ NULL
    |            ТОГДА ЕСТЬNULL(ВремяПриема.ВидПриема.НетПриема, ЛОЖЬ)
    |        ИНАЧЕ ИСТИНА
    |    КОНЕЦ КАК НетПриема
    |ПОМЕСТИТЬ табРасписание
    |ИЗ
    |    таб КАК таб,
    |    втРазрешенияПользователя КАК РазрешенияПользователя,
    |    РегистрСведений.ВремяПриема КАК ВремяПриема
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсключениеИзПриема КАК ИсключениеИзПриема
    |        ПО ВремяПриема.Врач = ИсключениеИзПриема.Врач
    |            И (ВремяПриема.Период МЕЖДУ ИсключениеИзПриема.Период И ИсключениеИзПриема.КонецПериода)
    |            И (ВремяПриема.ВремяОкончанияПриема МЕЖДУ ИсключениеИзПриема.Период И ИсключениеИзПриема.КонецПериода)
    |ГДЕ
    |    ВремяПриема.Период >= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ), ДЕНЬ, -1)
    |    И (ВремяПриема.Кабинет В ИЕРАРХИИ (&Отделение)
    |            ИЛИ &Отделение = НЕОПРЕДЕЛЕНО)
    |    И (ВремяПриема.Врач.Специальность = &Специальность
    |            ИЛИ &Специальность = НЕОПРЕДЕЛЕНО)
    |    И ДОБАВИТЬКДАТЕ(ВремяПриема.Период, СЕКУНДА, РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ВремяПриема.ПродолжительностьПриема, СЕКУНДА) * таб.А) < ВремяПриема.ВремяОкончанияПриема
    |    И (ВремяПриема.ЗаписываетРегистратура
    |            ИЛИ ВремяПриема.ЗаписываетВрач
    |            ИЛИ ВремяПриема.ЗаписываетТелефон
    |            ИЛИ ВремяПриема.ЗаписываетИнтернет
    |            ИЛИ ВремяПриема.ЗаписываетМенеджер)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    СегментыГруппПациентовСоставГрупп.Ссылка КАК СегментПациентов
    |ПОМЕСТИТЬ втСегментыПациента
    |ИЗ
    |    Справочник.СегментыГруппПациентов.СоставГрупп КАК СегментыГруппПациентовСоставГрупп
    |ГДЕ
    |    СегментыГруппПациентовСоставГрупп.ГруппаПациентов = &ГруппаПациентов
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЛимитыПоГруппамПациентов.Период КАК Период,
    |    ЛимитыПоГруппамПациентов.Врач КАК Врач,
    |    ЛимитыПоГруппамПациентов.Кабинет КАК Кабинет,
    |    ЛимитыПоГруппамПациентов.ГруппаПациентов КАК ГруппаПациентов,
    |    ЛимитыПоГруппамПациентов.ЧислоПриемов КАК ЧислоПриемов
    |ПОМЕСТИТЬ втНазначенныеЛимиты
    |ИЗ
    |    РегистрНакопления.ЛимитыПоГруппамПациентов КАК ЛимитыПоГруппамПациентов
    |ГДЕ
    |    ЛимитыПоГруппамПациентов.Период >= НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ)
    |    И ЛимитыПоГруппамПациентов.Врач В
    |            (ВЫБРАТЬ
    |                табРасписание.Врач КАК Врач
    |            ИЗ
    |                табРасписание КАК табРасписание)
    |    И ЛимитыПоГруппамПациентов.ГруппаПациентов В
    |            (ВЫБРАТЬ
    |                втСегментыПациента.СегментПациентов КАК ГруппаПациентов
    |            ИЗ
    |                втСегментыПациента КАК втСегментыПациента)
    |    И ЛимитыПоГруппамПациентов.ЧислоПриемов >= 0
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    втНазначенныеЛимиты.Период КАК Период,
    |    втНазначенныеЛимиты.Врач КАК Врач,
    |    втНазначенныеЛимиты.Кабинет КАК Кабинет,
    |    МАКСИМУМ(ЕСТЬNULL(ЛимитыПоГруппамПациентовОбороты.ЧислоПриемовОборот, 0) - 1) КАК ОстатокЛимита
    |ПОМЕСТИТЬ втВыбранныеЛимиты
    |ИЗ
    |    втНазначенныеЛимиты КАК втНазначенныеЛимиты
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЛимитыПоГруппамПациентов.Обороты(
    |                НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ),
    |                ,
    |                День,
    |                Врач В
    |                        (ВЫБРАТЬ
    |                            табРасписание.Врач КАК Врач
    |                        ИЗ
    |                            табРасписание КАК табРасписание)
    |                    И ГруппаПациентов В
    |                        (ВЫБРАТЬ
    |                            втСегментыПациента.СегментПациентов КАК ГруппаПациентов
    |                        ИЗ
    |                            втСегментыПациента КАК втСегментыПациента)) КАК ЛимитыПоГруппамПациентовОбороты
    |        ПО втНазначенныеЛимиты.Период = ЛимитыПоГруппамПациентовОбороты.Период
    |            И втНазначенныеЛимиты.Врач = ЛимитыПоГруппамПациентовОбороты.Врач
    |            И втНазначенныеЛимиты.Кабинет = ЛимитыПоГруппамПациентовОбороты.Кабинет
    |            И втНазначенныеЛимиты.ГруппаПациентов = ЛимитыПоГруппамПациентовОбороты.ГруппаПациентов
    |
    |СГРУППИРОВАТЬ ПО
    |    втНазначенныеЛимиты.Период,
    |    втНазначенныеЛимиты.Врач,
    |    втНазначенныеЛимиты.Кабинет
    |
    |ИМЕЮЩИЕ
    |    МАКСИМУМ(ЕСТЬNULL(ЛимитыПоГруппамПациентовОбороты.ЧислоПриемовОборот, 0) - 1) < 0
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ЗаписьНаПрием.Регистратор КАК Регистратор,
    |    ЗаписьНаПрием.НомерСтроки КАК НомерСтроки,
    |    ЗаписьНаПрием.Активность КАК Активность,
    |    ЗаписьНаПрием.ЗаказПациента КАК ЗаказПациента,
    |    ЗаписьНаПрием.Явка КАК Явка,
    |    ЗаписьНаПрием.Врач КАК Врач,
    |    ЗаписьНаПрием.Кабинет КАК Кабинет,
    |    ЗаписьНаПрием.ПродолжительностьПриема КАК ПродолжительностьПриема,
    |    ЗаписьНаПрием.МедицинскаяУслуга КАК МедицинскаяУслуга,
    |    ЗаписьНаПрием.ДатаПриема КАК ДатаПриема,
    |    ЗаписьНаПрием.ГруппаПациентов КАК ГруппаПациентов,
    |    ЗаписьНаПрием.Пациент КАК Пациент
    |ПОМЕСТИТЬ втЗаписьНаПрием
    |ИЗ
    |    РегистрСведений.ЗаписьНаПрием КАК ЗаписьНаПрием
    |ГДЕ
    |    ЗаписьНаПрием.ДатаПриема >= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ), ДЕНЬ, -1)
    |    И ЗаписьНаПрием.Врач В
    |            (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |                табРасписание.Врач
    |            ИЗ
    |                табРасписание)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    табРасписание.Кабинет КАК Кабинет,
    |    табРасписание.Врач КАК Врач,
    |    табРасписание.Период КАК Период,
    |    табРасписание.ПриемС КАК ПриемС,
    |    табРасписание.ПриемДо КАК ПриемДо,
    |    табРасписание.НачалоОкна КАК НачалоОкна,
    |    табРасписание.КонецОкна КАК КонецОкна,
    |    табРасписание.НетПриема КАК НетПриема,
    |    ВЫБОР
    |        КОГДА ЗаписьНаПрием.Пациент ЕСТЬ NULL
    |                И НЕ табРасписание.НетПриема
    |                И табРасписание.РазрешенаЗапись
    |            ТОГДА 1
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК Свободно,
    |    ВЫБОР
    |        КОГДА НЕ ЗаписьНаПрием.Пациент ЕСТЬ NULL
    |            ТОГДА 1
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК Занято,
    |    10000 КАК ДоступноПриемов,
    |    ""Нет"" КАК ГруппаПациентов,
    |    0 КАК Ограничение
    |ПОМЕСТИТЬ втРасписание
    |ИЗ
    |    табРасписание КАК табРасписание
    //|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаписьНаПрием КАК ЗаписьНаПрием
    |        ЛЕВОЕ СОЕДИНЕНИЕ втЗаписьНаПрием КАК ЗаписьНаПрием
    //|        ПО (ЗаписьНаПрием.ДатаПриема >= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ), ДЕНЬ, -1))
    //|            И табРасписание.Врач = ЗаписьНаПрием.Врач
    |        ПО     табРасписание.Врач = ЗаписьНаПрием.Врач
    |            И табРасписание.НачалоОкна <= ЗаписьНаПрием.ДатаПриема
    |            И табРасписание.КонецОкна > ЗаписьНаПрием.ДатаПриема
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    табРасписание.Кабинет КАК Кабинет,
    |    табРасписание.Врач КАК Врач,
    |    табРасписание.Период КАК Период,
    |    табРасписание.ПриемС КАК ПриемС,
    |    табРасписание.ПриемДо КАК ПриемДо,
    |    табРасписание.НачалоОкна КАК НачалоОкна,
    |    табРасписание.КонецОкна КАК КонецОкна,
    |    табРасписание.НетПриема КАК НетПриема,
    |    табРасписание.Свободно КАК Свободно,
    |    табРасписание.Занято КАК Занято,
    |    табРасписание.ДоступноПриемов КАК ДоступноПриемов,
    |    табРасписание.ГруппаПациентов КАК ГруппаПациентов,
    |    табРасписание.Ограничение КАК Ограничение,
    |    ЕСТЬNULL(ВыбранныеЛимиты.ОстатокЛимита, 0) < 0 КАК ЛимитВыбран,
    |    табРасписание.Врач.Специальность КАК ВрачСпециальность,
    |    табРасписание.Кабинет.НомерКабинета КАК КабинетНомерКабинета,
    |    табРасписание.Врач.КраткоеНаименование КАК ВрачКраткоеНаименование
    |ИЗ
    |    втРасписание КАК табРасписание
    |        ЛЕВОЕ СОЕДИНЕНИЕ втВыбранныеЛимиты КАК ВыбранныеЛимиты
    |        ПО (ВыбранныеЛимиты.Врач = табРасписание.Врач)
    |            И (ВыбранныеЛимиты.Кабинет = табРасписание.Кабинет)
    |            И (ВыбранныеЛимиты.Период = табРасписание.Период)
    |
    |УПОРЯДОЧИТЬ ПО
    |    табРасписание.Врач.Специальность.Наименование,
    |    табРасписание.Врач.Наименование,
    |    ПриемС
    |ИТОГИ
    |    МИНИМУМ(ПриемС),
    |    МАКСИМУМ(ПриемДо),
    |    МИНИМУМ(НетПриема),
    |    СУММА(Свободно) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппаПациентов) КАК Свободно,
    |    СУММА(Занято) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппаПациентов) КАК Занято,
    |    СРЕДНЕЕ(ДоступноПриемов),
    |    СРЕДНЕЕ(Ограничение),
    |    МАКСИМУМ(ЛимитВыбран),
    |    МАКСИМУМ(ВрачСпециальность)
    |ПО
    |    Врач,
    |    Период
10 Kassern
 
14.07.22
11:48
(9) Попакетно запрос выполняли, чтобы понять, какая из временных таблиц больше всего времени скушала на формирование?
11 Kassern
 
14.07.22
11:51
Вместо  всяких
(ВремяПриема.ЗаписываетРегистратура
    |            И РазрешенияПользователя.Регистратура
    |        ИЛИ ВремяПриема.ЗаписываетВрач
    |            И РазрешенияПользователя.МедицинскийПерсонал
    |        ИЛИ ВремяПриема.ЗаписываетТелефон
    |            И РазрешенияПользователя.КоллЦентр
    |        ИЛИ ВремяПриема.ЗаписываетИнтернет
    |            И РазрешенияПользователя.Интернет
    |        ИЛИ ВремяПриема.ЗаписываетМенеджер
    |            И РазрешенияПользователя.АдминистраторыЗаписиНаПрием)
    |        И (НЕ ВремяПриема.ЗаписываетСпециалист
    |            ИЛИ ВремяПриема.ЗаписываетСпециалист
    |                И ВремяПриема.Врач.ФизическоеЛицо = &ТекущийСпециалист) КАК РазрешенаЗапись,

И

|    ЕСТЬNULL(АдминистраторыЗаписиНаПрием.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.АдминистраторыЗаписиНаПрием), ЛОЖЬ) КАК АдминистраторыЗаписиНаПрием,
    |    ЕСТЬNULL(Интернет.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.Интернет), ЛОЖЬ) КАК Интернет,
    |    ЕСТЬNULL(КоллЦентр.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.КоллЦентр), ЛОЖЬ) КАК КоллЦентр,
    |    ЕСТЬNULL(МедицинскийПерсонал.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.МедицинскийПерсонал), ЛОЖЬ) КАК МедицинскийПерсонал,
    |    ЕСТЬNULL(Регистратура.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.Регистратура), ЛОЖЬ) КАК Регистратура
.......
Сделать отдельные регистры, где будет сразу отражено, разрешена ли запись, или нет, а так же разрешения юзверов


В итоге вы чутка увеличите время записи документов, что будет не заменто для сотрудников, но значительно упростите данный отчет и он будет более читаемым и выполняться будет гораздо быстрее
12 RomaH
 
naïve
14.07.22
12:04
(11) ага - а теперь перемещаем пользователя в другую группу - и ???
13 RomaH
 
naïve
14.07.22
12:04
(10) естественно
14 lodger
 
14.07.22
12:06
(12) при записи пользователя рассчитывать и писать отдельные регистры, где будет сразу отражено, разрешена ли запись, или нет, а так же разрешения юзверов
15 Смотрящий
 
14.07.22
12:10
Твою медицин-поликлинику писали джуны. У тебя вложенные запросы тормозят. Выдергивай их в ВТ
16 Kassern
 
14.07.22
12:28
(13) Можете скинуть сюда в свернутом виде сколько времени каждый пакет отожрал?
17 lodger
 
14.07.22
12:32
(16) ещё было бы неплохо озвучить свойства регистра - периодичность, регистратор.
18 RomaH
 
naïve
14.07.22
12:35
(16)
0,001278    0,03
0,003061    0,07
0,328918    7,31
0,398397    8,86
0,056232    1,25
0,056733    1,26
0,000977    0,02
0,064155    1,43
0,073847    1,64
0,043951    0,98
0,187402    4,17
0,582558    12,95
19 RomaH
 
naïve
14.07.22
12:36
ВЫБРАТЬ
    Числа.Число КАК А
ПОМЕСТИТЬ таб
ИЗ
    РегистрСведений.Числа КАК Числа
ГДЕ
    Числа.Число < 100
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВремяПриема.Кабинет.Родитель КАК КабинетРодитель,
    ВремяПриема.Врач КАК Врач,
    ВремяПриема.Кабинет КАК Кабинет,
    НАЧАЛОПЕРИОДА(ВремяПриема.Период, ДЕНЬ) КАК Период,
    ВремяПриема.Период КАК ПриемС,
    ВремяПриема.ВремяОкончанияПриема КАК ПриемДо,
    ВремяПриема.ПродолжительностьПриема КАК ПродолжительностьПриема,
    ЕСТЬNULL(ВремяПриема.ВидПриема.НетПриема, ЛОЖЬ) КАК НетПриема,
    ВремяПриема.Врач.ФизическоеЛицо КАК ФизическоеЛицо,
    ВремяПриема.ЗаписываетРегистратура КАК ЗаписываетРегистратура,
    ВремяПриема.ЗаписываетВрач КАК ЗаписываетВрач,
    ВремяПриема.ЗаписываетТелефон КАК ЗаписываетТелефон,
    ВремяПриема.ЗаписываетИнтернет КАК ЗаписываетИнтернет,
    ВремяПриема.ЗаписываетСпециалист КАК ЗаписываетСпециалист,
    ВремяПриема.ЗаписываетМенеджер КАК ЗаписываетМенеджер
ПОМЕСТИТЬ втВремяПриема
ИЗ
    РегистрСведений.ВремяПриема КАК ВремяПриема
ГДЕ
    ВремяПриема.Период >= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ), ДЕНЬ, -1)
    И (ВремяПриема.Кабинет В ИЕРАРХИИ (&Отделение)
            ИЛИ &Отделение = НЕОПРЕДЕЛЕНО)
    И (ВремяПриема.Врач.Специальность = &Специальность
            ИЛИ &Специальность = НЕОПРЕДЕЛЕНО)
    И (ВремяПриема.ЗаписываетРегистратура
            ИЛИ ВремяПриема.ЗаписываетВрач
            ИЛИ ВремяПриема.ЗаписываетТелефон
            ИЛИ ВремяПриема.ЗаписываетИнтернет
            ИЛИ ВремяПриема.ЗаписываетМенеджер)
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИсключениеИзПриема.Врач КАК Врач,
    ИсключениеИзПриема.Период КАК Период,
    ИсключениеИзПриема.КонецПериода КАК КонецПериода
ПОМЕСТИТЬ втИсключениеИзПриема
ИЗ
    РегистрСведений.ИсключениеИзПриема КАК ИсключениеИзПриема
ГДЕ
    ИсключениеИзПриема.Врач В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                табРасписаниеБезИсключения.Врач
            ИЗ
                табРасписаниеБезИсключения)
    И ИсключениеИзПриема.КонецПериода >= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ), ДЕНЬ, -1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    табРасписание.КабинетРодитель КАК КабинетРодитель,
    табРасписание.Врач КАК Врач,
    табРасписание.Кабинет КАК Кабинет,
    табРасписание.Период КАК Период,
    табРасписание.ПриемС КАК ПриемС,
    табРасписание.ПриемДо КАК ПриемДо,
    табРасписание.НачалоОкна КАК НачалоОкна,
    табРасписание.КонецОкна КАК КонецОкна,
    табРасписание.РазрешенаЗапись КАК РазрешенаЗапись,
    ВЫБОР
        КОГДА втИсключениеИзПриема.Врач ЕСТЬ NULL
            ТОГДА табРасписание.НетПриема
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК НетПриема
ПОМЕСТИТЬ табРасписание
ИЗ
    табРасписаниеБезИсключения КАК табРасписание
        ЛЕВОЕ СОЕДИНЕНИЕ втИсключениеИзПриема КАК втИсключениеИзПриема
        ПО табРасписание.Врач = втИсключениеИзПриема.Врач
            И (табРасписание.ПриемС МЕЖДУ втИсключениеИзПриема.Период И втИсключениеИзПриема.КонецПериода)
            И (табРасписание.ПриемДо МЕЖДУ втИсключениеИзПриема.Период И втИсключениеИзПриема.КонецПериода)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    СегментыГруппПациентовСоставГрупп.Ссылка КАК СегментПациентов
ПОМЕСТИТЬ втСегментыПациента
ИЗ
    Справочник.СегментыГруппПациентов.СоставГрупп КАК СегментыГруппПациентовСоставГрупп
ГДЕ
    СегментыГруппПациентовСоставГрупп.ГруппаПациентов = &ГруппаПациентов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЛимитыПоГруппамПациентов.Период КАК Период,
    ЛимитыПоГруппамПациентов.Врач КАК Врач,
    ЛимитыПоГруппамПациентов.Кабинет КАК Кабинет,
    ЛимитыПоГруппамПациентов.ГруппаПациентов КАК ГруппаПациентов,
    ЛимитыПоГруппамПациентов.ЧислоПриемов КАК ЧислоПриемов
ПОМЕСТИТЬ втНазначенныеЛимиты
ИЗ
    РегистрНакопления.ЛимитыПоГруппамПациентов КАК ЛимитыПоГруппамПациентов
ГДЕ
    ЛимитыПоГруппамПациентов.Период >= НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ)
    И ЛимитыПоГруппамПациентов.Врач В
            (ВЫБРАТЬ
                табРасписание.Врач КАК Врач
            ИЗ
                табРасписание КАК табРасписание)
    И ЛимитыПоГруппамПациентов.ГруппаПациентов В
            (ВЫБРАТЬ
                втСегментыПациента.СегментПациентов КАК ГруппаПациентов
            ИЗ
                втСегментыПациента КАК втСегментыПациента)
    И ЛимитыПоГруппамПациентов.ЧислоПриемов >= 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втНазначенныеЛимиты.Период КАК Период,
    втНазначенныеЛимиты.Врач КАК Врач,
    втНазначенныеЛимиты.Кабинет КАК Кабинет,
    МАКСИМУМ(ЕСТЬNULL(ЛимитыПоГруппамПациентовОбороты.ЧислоПриемовОборот, 0) - 1) КАК ОстатокЛимита
ПОМЕСТИТЬ втВыбранныеЛимиты
ИЗ
    втНазначенныеЛимиты КАК втНазначенныеЛимиты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЛимитыПоГруппамПациентов.Обороты(
                НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ),
                ,
                День,
                Врач В
                        (ВЫБРАТЬ
                            табРасписание.Врач КАК Врач
                        ИЗ
                            табРасписание КАК табРасписание)
                    И ГруппаПациентов В
                        (ВЫБРАТЬ
                            втСегментыПациента.СегментПациентов КАК ГруппаПациентов
                        ИЗ
                            втСегментыПациента КАК втСегментыПациента)) КАК ЛимитыПоГруппамПациентовОбороты
        ПО втНазначенныеЛимиты.Период = ЛимитыПоГруппамПациентовОбороты.Период
            И втНазначенныеЛимиты.Врач = ЛимитыПоГруппамПациентовОбороты.Врач
            И втНазначенныеЛимиты.Кабинет = ЛимитыПоГруппамПациентовОбороты.Кабинет
            И втНазначенныеЛимиты.ГруппаПациентов = ЛимитыПоГруппамПациентовОбороты.ГруппаПациентов

СГРУППИРОВАТЬ ПО
    втНазначенныеЛимиты.Период,
    втНазначенныеЛимиты.Врач,
    втНазначенныеЛимиты.Кабинет

ИМЕЮЩИЕ
    МАКСИМУМ(ЕСТЬNULL(ЛимитыПоГруппамПациентовОбороты.ЧислоПриемовОборот, 0) - 1) < 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаписьНаПрием.Врач КАК Врач,
    ЗаписьНаПрием.ДатаПриема КАК ДатаПриема,
    ЗаписьНаПрием.Пациент КАК Пациент
ПОМЕСТИТЬ втЗаписьНаПрием
ИЗ
    РегистрСведений.ЗаписьНаПрием КАК ЗаписьНаПрием
ГДЕ
    ЗаписьНаПрием.ДатаПриема >= ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Неделя, НЕДЕЛЯ), ДЕНЬ, -1)
    И ЗаписьНаПрием.Врач В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                табРасписание.Врач
            ИЗ
                табРасписание)

ИНДЕКСИРОВАТЬ ПО
    Врач
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    табРасписание.Кабинет КАК Кабинет,
    табРасписание.Врач КАК Врач,
    табРасписание.Период КАК Период,
    табРасписание.ПриемС КАК ПриемС,
    табРасписание.ПриемДо КАК ПриемДо,
    табРасписание.НачалоОкна КАК НачалоОкна,
    табРасписание.КонецОкна КАК КонецОкна,
    табРасписание.НетПриема КАК НетПриема,
    ВЫБОР
        КОГДА ЗаписьНаПрием.Пациент ЕСТЬ NULL
                И НЕ табРасписание.НетПриема
                И табРасписание.РазрешенаЗапись
            ТОГДА 1
        ИНАЧЕ 0
    КОНЕЦ КАК Свободно,
    ВЫБОР
        КОГДА НЕ ЗаписьНаПрием.Пациент ЕСТЬ NULL
            ТОГДА 1
        ИНАЧЕ 0
    КОНЕЦ КАК Занято,
    10000 КАК ДоступноПриемов,
    "Нет" КАК ГруппаПациентов,
    0 КАК Ограничение
ПОМЕСТИТЬ втРасписание
ИЗ
    табРасписание КАК табРасписание
        ЛЕВОЕ СОЕДИНЕНИЕ втЗаписьНаПрием КАК ЗаписьНаПрием
        ПО табРасписание.Врач = ЗаписьНаПрием.Врач
            И табРасписание.НачалоОкна <= ЗаписьНаПрием.ДатаПриема
            И табРасписание.КонецОкна > ЗаписьНаПрием.ДатаПриема
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    табРасписание.Кабинет КАК Кабинет,
    табРасписание.Врач КАК Врач,
    табРасписание.Период КАК Период,
    табРасписание.ПриемС КАК ПриемС,
    табРасписание.ПриемДо КАК ПриемДо,
    табРасписание.НачалоОкна КАК НачалоОкна,
    табРасписание.КонецОкна КАК КонецОкна,
    табРасписание.НетПриема КАК НетПриема,
    табРасписание.Свободно КАК Свободно,
    табРасписание.Занято КАК Занято,
    табРасписание.ДоступноПриемов КАК ДоступноПриемов,
    табРасписание.ГруппаПациентов КАК ГруппаПациентов,
    табРасписание.Ограничение КАК Ограничение,
    ЕСТЬNULL(ВыбранныеЛимиты.ОстатокЛимита, 0) < 0 КАК ЛимитВыбран,
    табРасписание.Врач.Специальность КАК ВрачСпециальность,
    табРасписание.Кабинет.НомерКабинета КАК КабинетНомерКабинета,
    табРасписание.Врач.КраткоеНаименование КАК ВрачКраткоеНаименование
ИЗ
    втРасписание КАК табРасписание
        ЛЕВОЕ СОЕДИНЕНИЕ втВыбранныеЛимиты КАК ВыбранныеЛимиты
        ПО (ВыбранныеЛимиты.Врач = табРасписание.Врач)
            И (ВыбранныеЛимиты.Кабинет = табРасписание.Кабинет)
            И (ВыбранныеЛимиты.Период = табРасписание.Период)

УПОРЯДОЧИТЬ ПО
    табРасписание.Врач.Специальность.Наименование,
    табРасписание.Врач.Наименование,
    ПриемС
ИТОГИ
    МИНИМУМ(ПриемС),
    МАКСИМУМ(ПриемДо),
    МИНИМУМ(НетПриема),
    СУММА(Свободно) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппаПациентов) КАК Свободно,
    СУММА(Занято) / КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппаПациентов) КАК Занято,
    СРЕДНЕЕ(ДоступноПриемов),
    СРЕДНЕЕ(Ограничение),
    МАКСИМУМ(ЛимитВыбран),
    МАКСИМУМ(ВрачСпециальность)
ПО
    Врач,
    Период
20 Смотрящий
 
14.07.22
12:37
0,328918    7,31 - тут вложенные
0,398397    8,86 - тут В ИЕРАРХИИ
0,582558    12,95 - тут ИТОГИ
21 RomaH
 
naïve
14.07.22
12:42
(20) - кабинеты тоже во временную?
а что с итогами делать?
22 Ryzeman
 
14.07.22
12:44
(20) >>0,398397    8,86 - тут В ИЕРАРХИИ
Там период в отборе на итог, а не в соединении... Связь по всем периодам идёт, только потом нужные отбираются
23 Мультук
 
гуру
14.07.22
12:48
(19)

Интересно, насколько много отъедает в последнем запросе вот это

    табРасписание.Врач.Специальность КАК ВрачСпециальность,
    табРасписание.Кабинет.НомерКабинета КАК КабинетНомерКабинета,
    табРасписание.Врач.КраткоеНаименование КАК ВрачКраткоеНаименование

и это

УПОРЯДОЧИТЬ ПО
    табРасписание.Врач.Специальность.Наименование,
    табРасписание.Врач.Наименование,

Я про точки. Если убрать эти поля (для теста) -- веселее намного ?
24 Смотрящий
 
14.07.22
12:58
(22) Период в где. Предварительно все равно весь регистр шерстится
25 Kassern
 
14.07.22
13:12
(24) это частое заблуждение кодеров, думая, что обрезав таблицы в ГДЕ у них меньше строк будет в объединении участвовать, а по факту, вначале 100500 строк свяжутся, а только потом эта громадина обрежется условием.
26 Смотрящий
 
14.07.22
13:15
(25) И не говори.
Никому не говори.
27 RomaH
 
naïve
14.07.22
13:19
(24) в (19) уже новый текст - там нет соединения в 3 запросе
28 RomaH
 
naïve
14.07.22
13:19
так что с итогами сделать можно?
29 Kassern
 
14.07.22
13:33
(28) Пробовали без итогов сформировать? Точно от них у вас время значительно выросло?
30 RomaH
 
naïve
14.07.22
13:34
(29) пробовал вынести последний запрос во временную - а потом уже от временной - итоговую

0,793016    13,9
0,001014    0,02


вместо
0,582558    12,95
31 Kassern
 
14.07.22
13:39
(30) уберите последние 3 поля через точку в выбрать и в сортировке и сформируйте без итогов. Сколько скушает последний запрос?
Вы там 2 таблицы объединяете, сколько строк в левой, сколько в правой в момент объединения?
Может быть ситуация, когда условиям соединения для 1 строчки левой таблицы может быть более 1 строки в правой?
32 RomaH
 
naïve
14.07.22
13:49
(31)
0,878518    8,28
1,151476    10,85

верхняя - без итогов, сортировки и точек
нижняя - исходная (два раза выполнял - потому время к предыдущим больше)
33 RomaH
 
naïve
14.07.22
13:49
(31) про соединение не понял мысли - что даст мне это знание?
34 Kassern
 
14.07.22
13:55
(33) Ну допустим у вас есть таблица1 из 1000 строчек и таблица2 из 1000000 строчек. Что будет левым соединением прилепить к таблице1 таблицу2, если учесть, что и там итам есть колонка1 с одинаковым значением (Например организация)? Сколько строк будет в результирующей таблице? А теперь представьте, что мы добавим с связь еще одну колонку, например номенклатуру. Если учесть, что значения по данной колонке не повторяются в обоих таблицах, сколько строк будет в результирующей и сформируется ли она быстрее?
35 Kassern
 
14.07.22
14:07
(34) я имею в виду, в первом случае связать таблицы по организации, а во втором - добавить еще номенклатуру в связи.
36 RomaH
 
naïve
14.07.22
14:09
(31) ну судя по обработке - интересуют только итоговые записи - в детальные в периоде не проваливаюсь
т.е. соединение умножает строки, но я их потом в итоги считаю
37 Kassern
 
14.07.22
14:13
(36) Ну так, чтобы посчитать итоги, надо предварительно собрать итоговую таблицу, а если там 100500 дублей строк из-за не корректной связи таблиц, то вот и получаете на выходе такое время. Сначала 1ска херачит здоровую таблицу объединяя  к каждой строчке первой таблицы, подходящие по условию строки правой. А потом еще на этапе итогов все это дело сворачивает.
38 RomaH
 
naïve
14.07.22
14:15
(37) .. т.е. втВыбранныеЛимиты сначала сгруппировать, а потом уже ... вариант
39 RomaH
 
naïve
14.07.22
14:15
а нет - они уже сгруппированны
40 Kassern
 
14.07.22
14:23
(38) (39) у вас же запрос перед глазами и данные тоже. Посмотрите в консоли запросов, что там в левой таблице, что в правой. Уникальна ли связь этих таблиц (есть ли дубли строк левой таблицы).
41 Kassern
 
14.07.22
14:26
чудес не бывает, если у вас в левой табличке 1000 строчек, и в правой 200 строчек и условия связи написаны нормально, то данный запрос выполнится практически моментально.
42 youalex
 
14.07.22
14:27
(0) >индексированные поля
емнип, индексы по ресурсам/реквизитам "не складываются". Т.е. там индексируемое поле ресурса + поля измерений. У второго ресурса - аналогично, вместе эти индексы не работают.
43 RomaH
 
naïve
14.07.22
14:48
|    //И ЗаписьНаПрием.ДатаПриема МЕЖДУ НАЧАЛОПЕРИОДА(&Период, ДЕНЬ) И КОНЕЦПЕРИОДА(&Период, ДЕНЬ)
    |    И НАЧАЛОПЕРИОДА(ЗаписьНаПрием.ДатаПриема,ДЕНЬ) = НАЧАЛОПЕРИОДА(&Период, ДЕНЬ)

вот такое - тут один день
исправление дает вместо 0.8 - 0.04 сек

ДатаПриема - на самом деле ДатаВремяПриема
44 lodger
 
14.07.22
15:23
(42) а в периодичном и подчиненном регистратору - ещё и период с регом обязательны.
45 RomaH
 
naïve
15.07.22
08:47
а что тут можно поделать?

    |ВЫБРАТЬ
    |    втНазначенныеЛимиты.Период КАК Период,
    |    втНазначенныеЛимиты.Врач КАК Врач,
    |    втНазначенныеЛимиты.Кабинет КАК Кабинет,
    |    МАКСИМУМ(ЕСТЬNULL(ЛимитыПоГруппамПациентовОбороты.ЧислоПриемовОборот, 0) - 1) КАК ОстатокЛимита
    |ПОМЕСТИТЬ втВыбранныеЛимиты
    |ИЗ
    |    втНазначенныеЛимиты КАК втНазначенныеЛимиты
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЛимитыПоГруппамПациентов.Обороты(
    |                НАЧАЛОПЕРИОДА(&Период, ДЕНЬ),
    |                КОНЕЦПЕРИОДА(&Период, ДЕНЬ),
    |                День,
    |                Врач В
    |                        (ВЫБРАТЬ
    |                            втДоступныеСпециалисты.Специалист КАК Врач
    |                        ИЗ
    |                            втДоступныеСпециалисты КАК втДоступныеСпециалисты)
    |                    И ГруппаПациентов В
    |                        (ВЫБРАТЬ
    |                            втСегментыПациента.СегментПациентов КАК ГруппаПациентов
    |                        ИЗ
    |                            втСегментыПациента КАК втСегментыПациента)) КАК ЛимитыПоГруппамПациентовОбороты
    |        ПО втНазначенныеЛимиты.Период = ЛимитыПоГруппамПациентовОбороты.Период
    |            И втНазначенныеЛимиты.Врач = ЛимитыПоГруппамПациентовОбороты.Врач
    |            И втНазначенныеЛимиты.ГруппаПациентов = ЛимитыПоГруппамПациентовОбороты.ГруппаПациентов
    |            И втНазначенныеЛимиты.Кабинет = ЛимитыПоГруппамПациентовОбороты.Кабинет
    |
    |СГРУППИРОВАТЬ ПО
    |    втНазначенныеЛимиты.Период,
    |    втНазначенныеЛимиты.Врач,
    |    втНазначенныеЛимиты.Кабинет
    |
    |ИМЕЮЩИЕ
    |    МАКСИМУМ(ЕСТЬNULL(ЛимитыПоГруппамПациентовОбороты.ЧислоПриемовОборот, 0) - 1) < 0
46 RomaH
 
naïve
15.07.22
08:58
при этом ... втНазначенныеЛимиты  пустая , но выполнение этого запроса в пакете занимает максимум времени

https://ibb.co/J36KPWr
47 Kassern
 
15.07.22
09:07
Через консоль запросов пробовали ваш запрос прогнать? Выполнить его попакетно в ней, посмотреть план выполнения запроса. В нем глянуть стоимость, затраты и сам текст sql запроса и проанализировать.
48 Конструктор1С
 
15.07.22
09:12
(9) о май гадбл, Данила, ты что, крейзи?! (с)

в этом решении ужасно всё
49 RomaH
 
naïve
15.07.22
09:16
50 Конструктор1С
 
15.07.22
09:19
(49) брось привычку пихать бизнес-логику в запросы. Потом с твоими "художествами" другим людям работать
51 RomaH
 
naïve
15.07.22
09:23
52 RomaH
 
naïve
15.07.22
10:37
а еще такой вопрос много времени занимает получение с сервера на клиента табличного документа
СеткаПриема = РасписаниеРаботыПриАктивизацииОбластиНаСервере(Элемент.ТекущаяОбласть.Расшифровка)

возвращаю таб док

вопрос - может через временное хранилище быстрее будет? или формировать на клиенте табличный документ, а с сервера возвращать коллекцию?
53 Мультук
 
гуру
15.07.22
10:43
(52)

&НаСервереБезКонтекста
РасписаниеРаботыПриАктивизацииОбластиНаСервере(

да? БезКонтекста?
54 RomaH
 
naïve
15.07.22
10:43
да без контекста
55 Конструктор1С
 
15.07.22
10:49
(52) а ты уверен, что время тратится именно на передачу таб.документа на клиент? Как выяснял? Вполне возможно, время ухряпывается на получение 100500 представлений ссылок, которые ты выводишь в таб.документ
56 Ёпрст
 
15.07.22
10:52
В where пихать дистиникт..ага, всё в топку
57 lodger
 
15.07.22
15:44
(52) СеткаПриема на форме как элемент формы? тогда выполняй вызов с контекстом и присваивание ТД НаСервере.
58 RomaH
 
naïve
17.07.22
21:27
(57) а в чем магия?
59 RomaH
 
naïve
17.07.22
21:28
(57) тогда у меня сначала на сервер уйдет предыдущие два ТД ка минимум
60 lodger
 
18.07.22
10:34
(58)
а)сперва оптимизируй наполнение ТД (в параметр суй представление, в параметр расшифровки ссылку).
б) потом перекладывать ТД на форму в серверном контексте.

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

ссылку на доку уже не помню как найти, это что-то на уровне "знания". если я не прав, прошу опровергнуть со ссылками на доку.