Тормозит ВыполнитьЗапрос по счёту, созданному в режиме "Предприятие"
Добрый день, не знаю как найти что-то похожее, поэтому создаю тему. Есть отчёт, который сравнивает остатки по 4 счетам. На двух счетах ("41" и "002")просто остатки товара, на третьем ("ПР") в разрезе производителей, на 4м ("СРО.КИ") в разрезе сроков годности с субконто производители.
Вообщем когда делаю сверку даже по одному товару, то происходит всё как-то долго, сделал замер почему-то ВыполнитьЗапрос(кондата,кондата,"ПР") занимает около 95% времени, в то время как две других строчки с ВыполнитьЗапрос занимают 0,10% или 0,20% времени.
Обратил внимание что счёт "СРО.КИ" сделан через конфигуратор, а счёт "ПР" был сделан не в конфигураторе, а в режиме "1С:предприятие", может от этого зависит? можно что-то сделать не потеряв обороты?
Вообщем когда делаю сверку даже по одному товару, то происходит всё как-то долго, сделал замер почему-то ВыполнитьЗапрос(кондата,кондата,"ПР") занимает около 95% времени, в то время как две других строчки с ВыполнитьЗапрос занимают 0,10% или 0,20% времени.
Обратил внимание что счёт "СРО.КИ" сделан через конфигуратор, а счёт "ПР" был сделан не в конфигураторе, а в режиме "1С:предприятие", может от этого зависит? можно что-то сделать не потеряв обороты?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Уверенно скажу: от того, какой счет в Конфигураторе или руками внесенный, не зависит. У меня в Конф было создано только 2-3 счета.
Что попробуйте:
- в свойстве вида Субконто есть галочка "Отбор". Я не включал, но, по аналогии, это подключение индекса.
- В разделе "Журналы" пункт "Графы отбора". Я создал графу "Клиент" и вписал туда: реквизиты "Клиент" у документов. Измерение "Клиент" у регистра.
В Вашем случает это Товары.
В ходе эксперимента у убедился - ускоряет выборку в разы.
Что попробуйте:
- в свойстве вида Субконто есть галочка "Отбор". Я не включал, но, по аналогии, это подключение индекса.
- В разделе "Журналы" пункт "Графы отбора". Я создал графу "Клиент" и вписал туда: реквизиты "Клиент" у документов. Измерение "Клиент" у регистра.
В Вашем случает это Товары.
В ходе эксперимента у убедился - ускоряет выборку в разы.
только сейчас добрался сюда, спасибо за ответы, да незакрытых остатков куча, но не закрываются они по третьему виду субконто "ДокументДвижения"(не знаю зачем его создавали).
при выполнении запроса я его не использую, смотрю только по 2м субконто, это значения не имеет?
при выполнении запроса я его не использую, смотрю только по 2м субконто, это значения не имеет?
(6) warlock, ну да, именно так у меня и есть:
(3) чем поможет отбор, если я перебираю всех? почему счёт сроки не тупит, у которого тоже есть субконто без галки отбор ?
и ещё не понятно чем поможетграфы отбора в журнале и можно ли там использовать табличную часть документа? там вроде обычно графы шапки
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
Ит.ИспользоватьСубконто(ВидыСубконто.Производитель);
Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К");
(3) чем поможет отбор, если я перебираю всех? почему счёт сроки не тупит, у которого тоже есть субконто без галки отбор ?
и ещё не понятно чем поможетграфы отбора в журнале и можно ли там использовать табличную часть документа? там вроде обычно графы шапки
(7) GrafB, нужно разделять два случая:
1. Запрос по всем товарам, как в примере из (7). Такой запрос может выполняться долго просто из-за большого количества остатков. (Хорошо бы понимать количество разрезов остатков по Вашим счетам)
2.
А вообще, приведите код полностью. Тот факт, что счет создан в режиме предприятия, не должен влиять на производительность.
1. Запрос по всем товарам, как в примере из (7). Такой запрос может выполняться долго просто из-за большого количества остатков. (Хорошо бы понимать количество разрезов остатков по Вашим счетам)
2.
когда делаю сверку даже по одному товару
вот тут уже вопрос - почему медленно. Как вариант, индекс мог бы помочь
А вообще, приведите код полностью. Тот факт, что счет создан в режиме предприятия, не должен влиять на производительность.
(8) warlock,
без отборки получаю вот что в замере:
ТабСрок = СоздатьОбъект("ТаблицаЗначений");
ТабСрок.НоваяКолонка("МПЗ");
ТабСрок.НоваяКолонка("Производитель");
ТабСрок.НоваяКолонка("Срок");
ТабСрок.НоваяКолонка("ОстатокСрок");
ТабСрок.НоваяКолонка("ДатаКон");
ТабСрок.НоваяКолонка("ДатаНач");
Ит = СоздатьОбъект("БухгалтерскиеИтоги");
Если СписокТоваров.РазмерСписка()>0 Тогда
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров);
Иначе
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
КонецЕсли;
Ит.ИспользоватьСубконто(ВидыСубконто.Сроки);
Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад);
Ит.ВыполнитьЗапрос(КонДата,КонДата,"СРО.КИ",,,,,"К");
Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура);
ИтКолВсего=0;
Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
ТекМПЗ = Ит.Субконто(1);
Ит.ВыбратьСубконто(ВидыСубконто.Сроки);
Пока Ит.ПолучитьСубконто(ВидыСубконто.Сроки) = 1 Цикл
ТабСрок.НоваяСтрока();
ТабСрок.МПЗ = ТекМПЗ;
ТабСрок.Срок = Ит.Субконто(2);
ТабСрок.Производитель = ТабСрок.Срок.Производитель;
ТабСрок.ОстатокСрок=Ит.СКД("К")-Ит.СКК("К");
ТабСрок.ДатаКон=Ит.Субконто(ВидыСубконто.Сроки).ДатаКонца;
ТабСрок.ДатаНач=Ит.Субконто(ВидыСубконто.Сроки).ДатаНачала;
КонецЦикла;
КонецЦикла;
ТабПроизв = СоздатьОбъект("ТаблицаЗначений");
ТабПроизв.НоваяКолонка("МПЗ");
ТабПроизв.НоваяКолонка("ИндексПоиска");
ТабПроизв.НоваяКолонка("ОстатокПроизв");
Если СписокТоваров.РазмерСписка()>0 Тогда
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров);
Иначе
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
КонецЕсли;
Ит.ИспользоватьСубконто(ВидыСубконто.Производитель);
Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К");
Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура);
ИтКолВсего=0;
Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
ТекМПЗ = Ит.Субконто(1);
Ит.ВыбратьСубконто(ВидыСубконто.Производитель);
Пока Ит.ПолучитьСубконто(ВидыСубконто.Производитель) = 1 Цикл
ТабПроизв.НоваяСтрока();
ТабПроизв.МПЗ = ТекМПЗ;
ТабПроизв.ИндексПоиска = "" + ТекМПЗ + Ит.Субконто(2);
ТабПроизв.ОстатокПроизв = Ит.СКД("К")-Ит.СКК("К");
КонецЦикла;
КонецЦикла;
ТабПроизвИТНом = СоздатьОбъект("ТаблицаЗначений");// для хранения итогов по номенклатуре по счёту ПР
ТабПроизв.Выгрузить(ТабПроизвИТНом,,,"МПЗ, ОстатокПроизв");
ТабПроизвИТНом.Свернуть("МПЗ", "ОстатокПроизв");
Таб41 = СоздатьОбъект("ТаблицаЗначений");
Таб41.НоваяКолонка("МПЗ");
Таб41.НоваяКолонка("ОстатокНом");
Если СписокТоваров.РазмерСписка()>0 Тогда
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура,СписокТоваров);
Иначе
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
КонецЕсли;
Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад);
Ит.ВыполнитьЗапрос(КонДата,КонДата,"41,002.2",,,,,"К");
Ит.ВыбратьСубконто(ВидыСубконто.Номенклатура);
ИтКолВсего=0;
Пока Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
Таб41.НоваяСтрока();
Таб41.МПЗ = Ит.Субконто(1);
ТекОст = 0;
Ит.ВыбратьСчета();
Пока Ит.ПолучитьСчет()=1 Цикл
ТекОст = ТекОст + Ит.СКД("К")-Ит.СКК("К");
КонецЦикла;
Таб41.ОстатокНом = ТекОст;
КонецЦикла;
Показатьбез отборки получаю вот что в замере:
Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К"); 1 24.097960 74.76
Ит.ВыполнитьЗапрос(КонДата,КонДата,"СРО.КИ",,,,,"К"); 1 5.413555 16.80
Ит.ВыполнитьЗапрос(КонДата,КонДата,"41,002.2",,,,,"К"); 1 1.331659 4.13
(11) warlock, не думаю, иначе он бы ругался когда я второй раз применял одно и то же субконто "Номенклатура".
попробовал просто ОСВ по счёту замерить, тоже третье субконто отключил
замер для "СРО.КИ":
замер для "ПР":
в 10 раз дольше...
попробовал просто ОСВ по счёту замерить, тоже третье субконто отключил
замер для "СРО.КИ":
Если Ит.ВыполнитьЗапрос(Дата1, Дата2, Счет) = 0 Тогда 1 2.425104 36.67
замер для "ПР":
Если Ит.ВыполнитьЗапрос(Дата1, Дата2, Счет) = 0 Тогда 1 22.789747 92.56
в 10 раз дольше...
(13) warlock, возвращается как раз наоборот по "СРО.КИ" больше строк, именно в отчёте осв: 1800 по "ПР" и 2400 по "СРО.КИ".
база dbf
"ПР" не группа
(14) Dnki, я всё ещё не согласен с вами. запроса 3, а тормозит только второй. плюс я уже написал что проверил на ОСВ. а ещё вот попробовал просто подряд написать использоватьсубконто():
база dbf
"ПР" не группа
(14) Dnki, я всё ещё не согласен с вами. запроса 3, а тормозит только второй. плюс я уже написал что проверил на ОСВ. а ещё вот попробовал просто подряд написать использоватьсубконто():
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
{УДАЛИТЬ.ERT(6)}: Повторное использование вида субконто "Номенклатура" в запросе!
(11) warlock писал: "У вас используется один и тот же объект Ит во всех запросах".
Точно! А я бегло не заметил. Надо обнулять ИТ перед каждым запросом.
К моменту выполнения по "ПР" к запросу применились все указанные ранее Субконто:
а нужны только
я даже не знаю как повлияет повторное (2 раза).
А вдруг делает 2 вложенных цикла по товарам?
Но дефекта в запросе Вы не видите, т.к. программа говорит запросу: мне плевать сколько субкантов ты там навертела, дай мне цикл только по "ВидыСубконто.Производитель".
Кстати, Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) можно написать и так
Ит.ПолучитьСубконто(). Тогда сразу будут видна истинная вложенность данных.
Короче, проверьте.
Второе: во всех запросах стоят 2 даты: ВыполнитьЗапрос(КонДата,КонДата)
А данные берете только на конец. Наличие первой даты теоретически снижает (на малых не видно, и когда дата не конец месяца). Надо или:
ВыполнитьЗапрос(,КонДата)
или
ВыполнитьЗапрос(НачМесяца(КонДата),КонДата)
Третье: если в ОСВ Вы выбрали только нужные субконто и оно тормозит, то нефиг дергаться - просто много данных. Может мусорных (некорректно закрытых)
Точно! А я бегло не заметил. Надо обнулять ИТ перед каждым запросом.
К моменту выполнения по "ПР" к запросу применились все указанные ранее Субконто:
Ит.ИспользоватьСубконто(ВидыСубконто.Сроки);
Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад);
а нужны только
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
Ит.ИспользоватьСубконто(ВидыСубконто.Производитель);
я даже не знаю как повлияет повторное (2 раза).
Ит.ИспользоватьСубконто(ВидыСубконто.Номенклатура);
А вдруг делает 2 вложенных цикла по товарам?
Но дефекта в запросе Вы не видите, т.к. программа говорит запросу: мне плевать сколько субкантов ты там навертела, дай мне цикл только по "ВидыСубконто.Производитель".
Кстати, Ит.ПолучитьСубконто(ВидыСубконто.Номенклатура) можно написать и так
Ит.ПолучитьСубконто(). Тогда сразу будут видна истинная вложенность данных.
Короче, проверьте.
Второе: во всех запросах стоят 2 даты: ВыполнитьЗапрос(КонДата,КонДата)
А данные берете только на конец. Наличие первой даты теоретически снижает (на малых не видно, и когда дата не конец месяца). Надо или:
ВыполнитьЗапрос(,КонДата)
или
ВыполнитьЗапрос(НачМесяца(КонДата),КонДата)
Третье: если в ОСВ Вы выбрали только нужные субконто и оно тормозит, то нефиг дергаться - просто много данных. Может мусорных (некорректно закрытых)
(14) Dnki,
вот это всё же основная проблема я думаю и не смотря на то что я не обращаюсь к третьему субконто объём то больше из которого выбирается, надо скорей всего почикать это субконто, сейчас я даже не могу точно понять зачем оно было добавлено.
Третье: если в ОСВ Вы выбрали только нужные субконто и оно тормозит, то нефиг дергаться - просто много данных. Может мусорных (некорректно закрытых)
вот это всё же основная проблема я думаю и не смотря на то что я не обращаюсь к третьему субконто объём то больше из которого выбирается, надо скорей всего почикать это субконто, сейчас я даже не могу точно понять зачем оно было добавлено.
(16), да так и есть. удалил на копии третье субконто, производительность скорость сразу возросла:
теперь надо искать хвосты этого субконто и целесообразность его использования.
Ит.ВыполнитьЗапрос(КонДата,КонДата,"СРО.КИ",,,,,"К"); 1 0.776550 21.55
Ит.ВыполнитьЗапрос(КонДата,КонДата,"41,002.2",,,,,"К"); 1 0.727047 20.18
Ит.ВыполнитьЗапрос(КонДата,КонДата,"ПР",,,,,"К"); 1 0.673886 18.70
теперь надо искать хвосты этого субконто и целесообразность его использования.
По поводу падения производительности. Есть такой нюанс: если Порядок вызовов метода ИспользоватьСубконто() отличен от порядка субконто в самом счете, то производительность будет падать.
Например первое субконто в счете СРО.КИ - срок, а второе номенклатура. Тогда запрос выполнится гораздо быстрее если верхняя группировка будет Срок, нижняя - Номенклатура, чем наоборот.
Например первое субконто в счете СРО.КИ - срок, а второе номенклатура. Тогда запрос выполнится гораздо быстрее если верхняя группировка будет Срок, нижняя - Номенклатура, чем наоборот.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот