8.х УТ Запрос вешает комп :( "Недостаточно памяти"

Тема в разделе ""1С:Управление торговлей УТ"", создана пользователем Gusev, 6 фев 2012.

  1. TopicStarter Overlay
    Gusev
    Offline

    Gusev Опытный в 1С

    Регистрация:
    4 авг 2011
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Доброго времени суток!
    Есть запрос следующего вида:

    Код:
    ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    Продажи1.КоличествоОборот КАК Оборот1,
    Продажи2.КоличествоОборот КАК Оборот2,
    Продажи3.КоличествоОборот КАК Оборот3,
    Продажи4.КоличествоОборот КАК Оборот4,
    ПродажиВсего.КоличествоОборот КАК ОборотВсего,
    ПродажиЗаГод.КоличествоОборот КАК ОборотЗаГод,
    ПродажиЗаГодТек.КоличествоОборот КАК ОборотЗаГодТек,
    СНачалаПродаж.КоличествоОборот КАК ОборотСНачалаПродаж,
    Остатки.КоличествоОстаток КАК Остаток,
    ОстаткиРезерв.КоличествоОстаток КАК ОстатокРезерв,
    Остатки.КоличествоОстаток - ОстаткиРезерв.КоличествоОстаток КАК ЧистыйОстаток
    ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач1, &ДатаКон1, Период, ) КАК Продажи1
    ПО (Продажи1.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач2, &ДатаКон2, Период, ) КАК Продажи2
    ПО (Продажи2.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач3, &ДатаКон3, Период, ) КАК Продажи3
    ПО (Продажи3.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач4, &ДатаКон4, Период, ) КАК Продажи4
    ПО (Продажи4.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ПериодНач, &ПериодКон, Период, ) КАК ПродажиВсего
    ПО (ПродажиВсего.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ГодНач, &ГодКон, Период, ) КАК ПродажиЗаГод
    ПО (ПродажиЗаГод.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ГодНачТек, &ГодКонТек, Период, ) КАК ПродажиЗаГодТек
    ПО (ПродажиЗаГодТек.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, , Период, ) КАК СНачалаПродаж
    ПО (СНачалаПродаж.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ПериодКон, ) КАК Остатки
    ПО (Остатки.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ПериодКон, ) КАК ОстаткиРезерв
    ПО (ОстаткиРезерв.Номенклатура = СпрНоменклатура.Ссылка)
    ГДЕ
    (ПродажиВсего.КоличествоОборот <> 0
    ИЛИ ПродажиЗаГод.КоличествоОборот <> 0
    ИЛИ ПродажиЗаГодТек.КоличествоОборот <> 0
    ИЛИ Остатки.КоличествоОстаток <> 0)
    и бла-бла-бла.
    Запрос работает не быстро, но работает.

    Добавили в него еще условий:

    Код:
    И (НЕ Продажи1.Контрагент.Код В (&Клиенты))
    И (НЕ Продажи2.Контрагент.Код В (&Клиенты))
    И (НЕ Продажи3.Контрагент.Код В (&Клиенты))
    И (НЕ Продажи4.Контрагент.Код В (&Клиенты))
    И (НЕ ПродажиВсего.Контрагент.Код В (&Клиенты))
    И (НЕ ПродажиЗаГод.Контрагент.Код В (&Клиенты))
    И (НЕ ПродажиЗаГодТек.Контрагент.Код В (&Клиенты))
    И (НЕ СНачалаПродаж.Контрагент.Код В (&Клиенты))
    В Массиве "Клиенты" всего два контрагента, но этого вполне достаточно :))) На компе 6гиг оперативы, выполнение обработки медленно, но верно жрет оперативку до самого конца. В итоге выдает сообщение "Недостаточно памяти" и 1С закрывается :(
    Можно как-то оптимизировать данный запрос? Или выполнить его каким-то образом на сервере? Ускорит-ли это выполнение запроса?
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    И запрос ужасный и условие просто ж..а для оптимизатора.
    Вердикт: выкинуть такой запроса вообще.

    Теперь давайте начнем с простого: что за задача?
    Вывести обороты за разные периоды? Чем не подходит СКД, где это все делается одним запросом и без левых соединений?

    ЗЫ. А этот запрос надо сразу было переписать на пакетные, условие сразу вынести в пакет и оперировать ссылками.
  3. TopicStarter Overlay
    Gusev
    Offline

    Gusev Опытный в 1С

    Регистрация:
    4 авг 2011
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Да, отчет показывает обороты за 4 месяца, за 4 месяца в сумме, за год текущий и за год прошлый.
    К сожалению, не очень силен в запросах, ибо самоучка :blush: Пока пытаюсь переделать то, что досталось. Позже буду делать все с нуля.
  4. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    чем больше условий на такой запрос наложите, тем быстрее память заканчиваться будет... Если вы будете все равно переделывать заново, то думаю, самое время начать сейчас. Поробуйте разбить запрос на пакеты - они побыстрее работают (по крайней мере мне так всегда казалось).

    З.Ы. не заметила, что вам уже посоветовали пакеты...
  5. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Правильно казалось.
    Вообще, самое первичное в таком запросе - устранение левых соеднинений с виртуальны таблицами. В реальности такие соединения в такое превращаются...
  6. TopicStarter Overlay
    Gusev
    Offline

    Gusev Опытный в 1С

    Регистрация:
    4 авг 2011
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Пример хотя-бы одного оборота можете привести?
  7. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Не понял вопроса. Этот как?
  8. Наташа
    Offline

    Наташа Опытный в 1С

    Регистрация:
    14 авг 2010
    Сообщения:
    1.442
    Симпатии:
    2
    Баллы:
    29
    Я бы еще условие по контрагенту добавила в параметр виртуальной таблицы.

    [CODE1c]РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Период, Контрагент В &Массив)[/CODE1c]
  9. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Пример с пакетом (на первую таблицу сразу с условием)
    Код:
    "ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент
    ПОМЕСТИТЬ Клиенты
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.Код В(&Клиенты)
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ Оборот1
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ДатаНач1,
    &ДатаКон1,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    Продажи1.КоличествоОборот КАК Оборот1,
    Продажи2.КоличествоОборот КАК Оборот2,
    Продажи3.КоличествоОборот КАК Оборот3,
    Продажи4.КоличествоОборот КАК Оборот4,
    ПродажиВсего.КоличествоОборот КАК ОборотВсего,
    ПродажиЗаГод.КоличествоОборот КАК ОборотЗаГод,
    ПродажиЗаГодТек.КоличествоОборот КАК ОборотЗаГодТек,
    СНачалаПродаж.КоличествоОборот КАК ОборотСНачалаПродаж,
    Остатки.КоличествоОстаток КАК Остаток,
    ОстаткиРезерв.КоличествоОстаток КАК ОстатокРезерв,
    Остатки.КоличествоОстаток - ОстаткиРезерв.КоличествоОстаток КАК ЧистыйОстаток
    ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ Оборот1 КАК Продажи1
    ПО (Продажи1.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач2, &ДатаКон2, Период, ) КАК Продажи2
    ПО (Продажи2.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач3, &ДатаКон3, Период, ) КАК Продажи3
    ПО (Продажи3.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач4, &ДатаКон4, Период, ) КАК Продажи4
    ПО (Продажи4.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ПериодНач, &ПериодКон, Период, ) КАК ПродажиВсего
    ПО (ПродажиВсего.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ГодНач, &ГодКон, Период, ) КАК ПродажиЗаГод
    ПО (ПродажиЗаГод.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ГодНачТек, &ГодКонТек, Период, ) КАК ПродажиЗаГодТек
    ПО (ПродажиЗаГодТек.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(, , Период, ) КАК СНачалаПродаж
    ПО (СНачалаПродаж.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ПериодКон, ) КАК Остатки
    ПО (Остатки.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ПериодКон, ) КАК ОстаткиРезерв
    ПО (ОстаткиРезерв.Номенклатура = СпрНоменклатура.Ссылка)
    ГДЕ
    (ПродажиВсего.КоличествоОборот <> 0
    ИЛИ ПродажиЗаГод.КоличествоОборот <> 0
    ИЛИ ПродажиЗаГодТек.КоличествоОборот <> 0
    ИЛИ Остатки.КоличествоОстаток <> 0)"
  10. TopicStarter Overlay
    Gusev
    Offline

    Gusev Опытный в 1С

    Регистрация:
    4 авг 2011
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Спасибо за пример! Буду пробовать разобраться :)
  11. TopicStarter Overlay
    Gusev
    Offline

    Gusev Опытный в 1С

    Регистрация:
    4 авг 2011
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Поругайте плиз то, что удалось сваять. Я правильно все понял?


    Код:
    "ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент
    ПОМЕСТИТЬ Клиенты
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.Код В(&Клиенты)
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ Оборот1
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ДатаНач1,
    &ДатаКон1,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ Оборот2
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ДатаНач2,
    &ДатаКон2,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ Оборот3
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ДатаНач3,
    &ДатаКон3,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ Оборот4
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ДатаНач4,
    &ДатаКон4,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ ОборотВсего
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ПериодНач,
    &ПериодКон,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ ОборотЗаГод
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ГодНач,
    &ГодКон,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ ОборотЗаГодТек
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    &ГодНачТек,
    &ГодКонТек,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
    ПОМЕСТИТЬ ОборотСНачалаПродаж
    ИЗ
    РегистрНакопления.Продажи.Обороты(
    ,
    ,
    Период,
    (НЕ Контрагент В
    (ВЫБРАТЬ
    Клиенты.Контрагент
    ИЗ
    Клиенты КАК Клиенты))) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    Продажи1.КоличествоОборот КАК Оборот1,
    Продажи2.КоличествоОборот КАК Оборот2,
    Продажи3.КоличествоОборот КАК Оборот3,
    Продажи4.КоличествоОборот КАК Оборот4,
    ПродажиВсего.КоличествоОборот КАК ОборотВсего,
    ПродажиЗаГод.КоличествоОборот КАК ОборотЗаГод,
    ПродажиЗаГодТек.КоличествоОборот КАК ОборотЗаГодТек,
    СНачалаПродаж.КоличествоОборот КАК ОборотСНачалаПродаж,
    Остатки.КоличествоОстаток КАК Остаток,
    ОстаткиРезерв.КоличествоОстаток КАК ОстатокРезерв,
    Остатки.КоличествоОстаток - ОстаткиРезерв.КоличествоОстаток КАК ЧистыйОстаток
    ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ Оборот1 КАК Продажи1
    ПО (Продажи1.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ Оборот2 КАК Продажи2
    ПО (Продажи2.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ Оборот3 КАК Продажи3
    ПО (Продажи3.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ Оборот4 КАК Продажи4
    ПО (Продажи4.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ ОборотВсего КАК ПродажиВсего
    ПО (ПродажиВсего.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ ОборотЗаГод КАК ПродажиЗаГод
    ПО (ПродажиЗаГод.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ ОборотЗаГодТек КАК ПродажиЗаГодТек
    ПО (ПродажиЗаГодТек.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ ОборотСНачалаПродаж КАК СНачалаПродаж
    ПО (СНачалаПродаж.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ПериодКон, ) КАК Остатки
    ПО (Остатки.Номенклатура = СпрНоменклатура.Ссылка)
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ПериодКон, ) КАК ОстаткиРезерв
    ПО (ОстаткиРезерв.Номенклатура = СпрНоменклатура.Ссылка)
    ГДЕ
    (ПродажиВсего.КоличествоОборот <> 0
    ИЛИ ПродажиЗаГод.КоличествоОборот <> 0
    ИЛИ ПродажиЗаГодТек.КоличествоОборот <> 0
    ИЛИ Остатки.КоличествоОстаток <> 0)"
    Результат выводится за 10 секунд.
  12. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    я бы первый запрос убрала и добавила в регистр условие как Наташа вам указала. Иначе вы тратите время на вложенные запросы в каждом пакете. Попробуйте, может так быстрее дело пойдет.
  13. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Таблицу остатков по такому же принципу сделайте
    Если 10 сек устраивает - то все нормально :)

    Передача массива в данном случае будет почти тоже самое.
    И еще обратите внимание, что там поиск по коду идет, а не по ссылке.
  14. TopicStarter Overlay
    Gusev
    Offline

    Gusev Опытный в 1С

    Регистрация:
    4 авг 2011
    Сообщения:
    81
    Симпатии:
    0
    Баллы:
    26
    Не просто устраивает, а - :yahoo: :yahoo: :yahoo:
    Еще раз пасиба за помощь!!!

Поделиться этой страницей