helpf.pro
Регистрация

v8: Запрос вешает комп :) Недостаточно памяти :(

Onotoley
06.02.2012 15:26Прочитано: 6074
Доброго времени суток!
Есть запрос следующего вида:

Код 1C v 8.х
 
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Номенклатура,
Продажи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),
СУММА(ОборотВсего),
СУММА(ОборотЗаГод),
СУММА(ОборотЗаГодТек),
СУММА(ОборотСНачалаПродаж),
СУММА(Остаток),
СУММА(ЧистыйОстаток)
ПО
ОБЩИЕ,
Номенклатура ИЕРАРХИЯ


Работает не очень быстро, но все-же работает ) Теперь к запросу добавили еще условий:

Код 1C v 8.х
 
И (НЕ Продажи1.Контрагент.Код В (&Клиенты))
И (НЕ Продажи2.Контрагент.Код В (&Клиенты))
И (НЕ Продажи3.Контрагент.Код В (&Клиенты))
И (НЕ Продажи4.Контрагент.Код В (&Клиенты))
И (НЕ ПродажиВсего.Контрагент.Код В (&Клиенты))
И (НЕ ПродажиЗаГод.Контрагент.Код В (&Клиенты))
И (НЕ ПродажиЗаГодТек.Контрагент.Код В (&Клиенты))
И (НЕ СНачалаПродаж.Контрагент.Код В (&Клиенты))

В Массиве "Клиенты" всего два контрагента, но этого вполне достаточно )) На компе 6гиг оперативы, выполнение обработки медленно, но верно жрет оперативку до самого конца. В итоге выдает сообщение "Недостаточно памяти" и 1С закрывается )
Можно как-то оптимизировать данный запрос? Или выполнить его каким-то образом на сервере? Ускорит-ли это выполнение запроса?
Yandex
Возможно, вас также заинтересует
Реклама на портале
odinson
06.02.2012 17:47Ответ № 1
(0) Onotoley, а какой размер базы?
Onotoley
06.02.2012 17:56Ответ № 2
База на SQL. mdf уже перевалил за 10 гиг.
odinson
06.02.2012 18:40Ответ № 3
хм... диллема-то в чём? результат запроса, каким бы он ни был огромным, не может забить оперативку. ибо он не выгружается в неё, а транслируется на порт 1443 (если не ошибаюсь). Натолкать мусора в оперативку может цикл, в котором не NULL-ятся значения переменных и создаются новые (с точки зрения кучи ОЗУ) переменные. Т.о., я бы смотрел на обработку результата запроса.
И ещё вопрос: какой именно процесс хавает оперативу, 1С?
Onotoley
06.02.2012 19:01Ответ № 4
Да, память жрет "1cv8.exe". Да, результат запроса обрабатывается в цикле, но! До цикла даже не доходит дело )

Код 1C v 8.х
 
Выборка = Запрос.Выполнить().Выбрать();
пока Выборка.Следующий() цикл


Запускал через отладчик - память "уходит" именно в процессе выполнения запроса. На вторую строчку обработка не переходит.
Изменено 06.02.12 19:05:55
odinson
06.02.2012 19:07Ответ № 5
Тээээк... делаем следующее. В режиме отладки ставим точку остановки на строке
Код 1C v 8.2 УП
 
Запрос.Выполнить();

и на строчке, следующей за ней.
После остановки на первой точке жмём Фэ5 и смотрим на результат.
Если процесс начинает жрать память и не происходит остановка на следующей точке, то тут какой-то серьёзный касяк на уровне СКуЛьной БД.
Если же запрос выполняется и отладка останавливается на второй точке, то вставляй в вену капельницу с кофеином и начинай аццкий дебаг. Проблема в обработке результата.
odinson
06.02.2012 19:13Ответ № 6
(4) Onotoley, разбей
Код 1C v 8.2 УП
 Выборка = Запрос.Выполнить().Выбрать();   

на две строчки:
Код 1C v 8.2 УП
 
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

и посмотри, на каком из этих этапов происходит лажа
Если на втором, то попробуй (в качестве научного эксперимента) не "Выбрать()", а выгрузить результат в таблицу значений.
И ещё одно. Пробовал выполнять этот запрос в консоли запросов?
Изменено 06.02.12 19:15:04
Onotoley
06.02.2012 19:16Ответ № 7
Запустил. Пока что пройдена первая точка останова. Памяти схавал немного, но до второй точки еще не дошел. i7 опять напрягся на 2,9 гигагерца ) Посмотрим - чем это закончится.

Сек - попробую второй вариант.
В каонсоли запускал без новых условий. Все работало. Ща попробую с условиями запустить.
Изменено 06.02.12 19:19:48
odinson
06.02.2012 19:21Ответ № 8
(7) Onotoley, эхЪ... мне бы ваши мощностя - я бы боеголовки на штаты с помощью 1С запускал бы )
З.Ы. я думал, что этот ресурс поактивнее, чем оказалось на самом деле
Onotoley
06.02.2012 19:30Ответ № 9
Интересно... Запустил параллельно - через отладчик и, в другой копии базы, через консоль запросов. Обе поперли хавать память, но через консоль гораздо прожорливее! Запустил одновременно, на данный момент:
отладчик захавал 307 метров
консоль 760 метров
З.Ы. Да, уточню - сейчас провожу эксперимент на локальной копии базы.
odinson
06.02.2012 19:47Ответ № 10
Так же можно попробовать в запросе сделать "ВЫБРАТЬ ПЕРВЫЕ 100 ...". Если выберет и выведет, то тут уж все претензии к 1Сному недоСКЛю )
Onotoley
06.02.2012 20:47Ответ № 11
title

Вот чем закончилось одновременное выполнение. Оба экземпляра 1ски вывалили "Недостаточно памяти".
А "ВЫБРАТЬ ПЕРВЫЕ 100 ..." выдало результат *18
odinson
07.02.2012 13:22Ответ № 12
Эээээээээээээээ!!!!!!!!!!! Да Вы, батенька, седьмые форточки юзаете...
1Ску лучше запускать под 32-х разрядными ОС. Попробуй поднять виртуальную машину, откуси ей два (или три) гига мозгов и должно всё быть нормально
Onotoley
07.02.2012 13:33Ответ № 13
Хм... Боюсь, что дело не в форточках. Ибо на работе юзаецца ХР.
Onotoley
07.02.2012 15:06Ответ № 14
Странно. Запустил запрос на серваке, уже час чота там считает, но память не жрет и ошибок пока что никаких не было. Жду результатов.
Onotoley
07.02.2012 16:01Ответ № 15
На серваке запрос пашет уже два часа. Пока конца не видно.
Попробовал переделать запрос (с подсказки BabySG). Не уверен, что правильно составил. ) Работает 10 секунд )

Код 1C v 8.х
 
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент
ПОМЕСТИТЬ Клиенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Код В(&Клиенты)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот
ПОМЕСТИТЬ Оборот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)
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.