Имя: Пароль:
1C
 
Прошу подтвердить неоптимальность УТ11.5.22.137
0 H A D G E H O G s
 
30.03.26
16:30
День добрый.
Проведение отгрузочного документа, например, РТУ, при онлайн взаиморасчетах вызывает тормоза.

Тормоза возникают в процедуре
РегистрСведений.ВспомогательнаяИнформацияВзаиморасчетов.ЗаполнитьВспомогательнуюИнформацию() при выполнении запроса.

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

Прошу подтвердить ситуацию, если не лениво.
1 H A D G E H O G s
 
30.03.26
16:32
Собственно, посмотрел, 11.5.25.72 - точно также.

Поправить то просто - просто не ожидаешь такого встретить в типовой и нет ли тут хитрого смысла.
2 toypaul
 
гуру
30.03.26
16:35
"просто не ожидаешь такого встретить в типовой" шо? в типовой как раз очень даже ожидаем.
3 toypaul
 
гуру
30.03.26
16:36
Они УТ наверное тестируют только на объемах демо базы. И производительность вряд ли отслеживают.
4 H A D G E H O G s
 
30.03.26
16:38
(2) Типовая - образчик чистоты среди говноподелий, с которыми сталкиваешься.
5 Мультук
 
гуру
30.03.26
16:55
(0)

ЕРП 2.5.25.85

1) Код точно такой же.
2) Это вы просто "нарвались", это еще не самое худшее.


Там связь
ПО Изменения.РасчетныйДокумент = Расчеты.Регистратор

И я был уверен что тут играет индекс

[ОРНР1 + ... +] Регистратор + НомерСтроки


А вовсе не (ибо поля "Период" я в запросе не вижу)
[ОРРХ | ОРНР1 +] Период + Регистратор + НомерСтроки (Кластерный)



https://its.1c.ru/db/metod8dev/content/1590/hdoc

3) А по полям РН.РасчетыСКлиентами.ДатаРегистратора и РН.РасчетыСКлиентами.ДатаРегистратора и РН.РасчетыСКлиентами.ДатаПлатежа индексов нет


Если вы ускорили этот запрос, объясните мне, где я ошибся в своих рассуждениях.
(если не сложно)
6 H A D G E H O G s
 
30.03.26
18:28
Вот так решается


&ИзменениеИКонтроль("ЗаполнитьВспомогательнуюИнформацию")
Процедура АСФЗаполнитьВспомогательнуюИнформацию(МенеджерВТ, ЭтоРасчетыСКлиентами)

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