|
Кэпо-отчёт валит программу с ошибкой "Недостаточно памяти" | ☑ | ||
---|---|---|---|---|
0
Artificial
27.04.16
✎
13:43
|
УТП для Украины, есть несложный отчёт на СКД, входных данных немного, три вложенные группировки, одна из которых "Детальные записи". Что может быть не так, куда копать?
|
|||
1
butterbean
27.04.16
✎
13:45
|
может там 3 миллиона строк
|
|||
2
Artificial
27.04.16
✎
13:45
|
(1) Данных мало.
|
|||
3
dka80
27.04.16
✎
14:08
|
Ну может у вас в условиях указано "Где Реквизит В (тут подзапрос)", или в выбираемых полях указано значение реквизита через точку и реквизит имеет составной тип данных с кучей вариантов или, что еще хуже, может иметь тип Хранилище значений
|
|||
4
Artificial
27.04.16
✎
14:09
|
(3) Нет, ничего такого нет. И не в железе проблема, на разных компьютерах пробовал. Могу кинуть запрос, если интересно.
|
|||
5
Optan
27.04.16
✎
14:10
|
(4) Кидай конечно!
|
|||
6
Artificial
27.04.16
✎
14:10
|
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ПлатежноеПоручениеВходящее.Дата, ДЕНЬ) КАК ДатаОплаты, ПлатежноеПоручениеВходящее.СуммаДокумента КАК СуммаОплаты, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата КАК Дата, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.СуммаДокумента КАК Сумма, РеализацияТоваровУслуг.Организация.Префикс, ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(РеализацияТоваровУслуг.Сделка) = ТИП(Документ.ЗаказПокупателя) И РеализацияТоваровУслуг.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА РеализацияТоваровУслуг.Сделка.Ответственный ИНАЧЕ РеализацияТоваровУслуг.Ответственный КОНЕЦ КАК Менеджер ИЗ Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ПО ПлатежноеПоручениеВходящее.ДокументОснование = РеализацияТоваровУслуг.Ссылка ГДЕ ПлатежноеПоручениеВходящее.Дата МЕЖДУ &НачалоПериода И &КонецПериода И РеализацияТоваровУслуг.Организация = &Организация И &ВключатьППВ = ИСТИНА ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПриходныйКассовыйОрдер.Дата, ДЕНЬ), ПриходныйКассовыйОрдер.СуммаДокумента, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.СуммаДокумента, РеализацияТоваровУслуг.Организация.Префикс, ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(РеализацияТоваровУслуг.Сделка) = ТИП(Документ.ЗаказПокупателя) И РеализацияТоваровУслуг.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА РеализацияТоваровУслуг.Сделка.Ответственный ИНАЧЕ РеализацияТоваровУслуг.Ответственный КОНЕЦ ИЗ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ПО (РеализацияТоваровУслуг.Сделка = ПриходныйКассовыйОрдер.ДокументОснование) ГДЕ РеализацияТоваровУслуг.Организация = &Организация |
|||
7
Artificial
27.04.16
✎
14:13
|
И ещё. На демо-базе УТП летало, на клиентской падает. Может, дело в базе?
|
|||
8
FIXXXL
27.04.16
✎
14:13
|
(6) для начала Реализации во временную таблицу свали, а затем ее юзай для соединений
ну и и вариант с получением этой требухи из регистров рассмотри тащить из документов - моветон |
|||
9
dka80
27.04.16
✎
14:18
|
Во втором запросе период отбора ПКО ограничить не хочешь?
|
|||
10
Optan
27.04.16
✎
14:19
|
(6) Может ПКОшек в базе много? А у тебя условия отбора по периоду нет.
Какие ссылки могут стоять в поле РеализацияТоваровУслуг.Сделка - тоже тип ограничить не лишним будет... |
|||
11
Artificial
27.04.16
✎
14:23
|
(9) Не стоит, они разбросаны как попало.
(10) Мало. Насчёт второго. Как сделать, чтоб имелись ввиду только ЗаказПокупателя? |
|||
12
Optan
27.04.16
✎
14:26
|
(11) ТИПЗНАЧЕНИЯ(РеализацияТоваровУслуг.Сделка) = ТИП(Документ.ЗаказПокупателя)
или так РеализацияТоваровУслуг.Сделка ССЫЛКА Документ.ЗаказПокупателя |
|||
13
Optan
27.04.16
✎
14:29
|
(12) Но это имеет смысл только если тип многосоставной, к сожалению, конфигурации под рукой нет...
|
|||
14
Artificial
27.04.16
✎
14:33
|
Переписал через ВТ. Не помогло. На демо-базе и ещё одной УТП отрабатывает песня.
|
|||
15
Optan
27.04.16
✎
14:36
|
(14) Ну значит проблема в данных, подозреваю что именно в объеме.Попробуй через консоль запросов сначала первый запрос прогони, потом второй, затем попробуй объединить, потом добавь какие нибудь ограничения...так хоть понятно будет конкретнее где проблема...
|
|||
16
dka80
27.04.16
✎
14:43
|
Применяется RLS? Если да, то попробуй оставить одну роль пользователю.
|
|||
17
Artificial
27.04.16
✎
14:45
|
(16) Нет.
(15) Ограничил период выборки ППВ и ПКО. Тепреь выводит. Только мне сдаётся, что задваивает. |
|||
18
Fragster
гуру
27.04.16
✎
14:51
|
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО (РеализацияТоваровУслуг.Сделка = ПриходныйКассовыйОрдер.ДокументОснование) ГДЕ РеализацияТоваровУслуг.Организация = &Организация тут прям видно, что это внутреннее соединение |
|||
19
Fragster
гуру
27.04.16
✎
14:52
|
КОГДА ТИПЗНАЧЕНИЯ(РеализацияТоваровУслуг.Сделка) = ТИП(Документ.ЗаказПокупателя)
И РеализацияТоваровУслуг.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА РеализацияТоваровУслуг.Сделка.Ответственный тут выразить не хватает |
|||
20
Fragster
гуру
27.04.16
✎
14:53
|
также нужно посмотреть итоговый запрос, который выдает СКД, может там условие из соединения пропадает (мало ли что)
|
|||
21
Artificial
27.04.16
✎
14:54
|
(18) Исправил.
(19) Где именно? Вот что сейчас получилось. ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслуг.СуммаДокумента КАК Сумма, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата КАК Дата, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.Организация.Префикс, РеализацияТоваровУслуг.Сделка КАК Сделка, РеализацияТоваровУслуг.Сделка.Ответственный КАК СделкаОтветственный ПОМЕСТИТЬ ВТ_Реализация ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Организация = &Организация ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПлатежноеПоручениеВходящее.Дата, ДЕНЬ) КАК ДатаОплаты, ПлатежноеПоручениеВходящее.СуммаДокумента КАК СуммаОплаты, ВТ_Реализация.Номер, ВТ_Реализация.Дата, ВТ_Реализация.Контрагент, ВТ_Реализация.ОрганизацияПрефикс, ВТ_Реализация.Сделка, ВТ_Реализация.СделкаОтветственный, ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ВТ_Реализация.Сделка) = ТИП(Документ.ЗаказПокупателя) И ВТ_Реализация.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА ВТ_Реализация.СделкаОтветственный ИНАЧЕ ВТ_Реализация.СделкаОтветственный КОНЕЦ КАК Менеджер, ВТ_Реализация.Сумма ИЗ ВТ_Реализация КАК ВТ_Реализация ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее ПО ВТ_Реализация.Сделка = ПлатежноеПоручениеВходящее.ДокументОснование ГДЕ &ВключатьППВ = ИСТИНА И ПлатежноеПоручениеВходящее.Дата МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПриходныйКассовыйОрдер.Дата, ДЕНЬ), ПриходныйКассовыйОрдер.СуммаДокумента, ВТ_Реализация.Номер, ВТ_Реализация.Дата, ВТ_Реализация.Контрагент, ВТ_Реализация.ОрганизацияПрефикс, ВТ_Реализация.Сделка, ВТ_Реализация.СделкаОтветственный, ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ВТ_Реализация.Сделка) = ТИП(Документ.ЗаказПокупателя) И ВТ_Реализация.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА ВТ_Реализация.СделкаОтветственный ИНАЧЕ ВТ_Реализация.СделкаОтветственный КОНЕЦ, ВТ_Реализация.Сумма ИЗ ВТ_Реализация КАК ВТ_Реализация ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер ПО ВТ_Реализация.Сделка = ПриходныйКассовыйОрдер.ДокументОснование ГДЕ ПриходныйКассовыйОрдер.Дата МЕЖДУ &НачалоПериода И &КонецПериода |
|||
22
Fragster
гуру
27.04.16
✎
14:55
|
вот этот кусок надо получить в первой таблице
ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ВТ_Реализация.Сделка) = ТИП(Документ.ЗаказПокупателя) И ВТ_Реализация.Сделка <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА ВТ_Реализация.СделкаОтветственный ИНАЧЕ ВТ_Реализация.СделкаОтветственный КОНЕЦ КАК Менеджер, |
|||
23
Fragster
гуру
27.04.16
✎
14:57
|
и лучше через
ЕстьNULL(ЗаказПокупателя.Ответственный, РеализацияТоваровУслуг.Ответственный) КАК Ответственный Из Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг Левое соединение Документ.ЗаказПокупателя КАК ЗаказПокупателя по РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка |
|||
24
Fragster
гуру
27.04.16
✎
14:57
|
условие из ГДЕ в условия соединения
|
|||
25
Fragster
гуру
27.04.16
✎
14:58
|
и потерялось условие по организации
|
|||
26
Artificial
27.04.16
✎
15:24
|
ВЫБРАТЬ РАЗЛИЧНЫЕ
РеализацияТоваровУслуг.СуммаДокумента КАК Сумма, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата КАК Дата, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.Организация.Префикс, РеализацияТоваровУслуг.Сделка КАК Сделка, ЕСТЬNULL(ЗаказПокупателя.Ответственный, РеализацияТоваровУслуг.Ответственный) КАК Менеджер ПОМЕСТИТЬ ВТ_Реализация ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя ПО РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка ГДЕ РеализацияТоваровУслуг.Организация = &Организация ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПлатежноеПоручениеВходящее.Дата, ДЕНЬ) КАК ДатаОплаты, ПлатежноеПоручениеВходящее.СуммаДокумента КАК СуммаОплаты, ВТ_Реализация.Номер, ВТ_Реализация.Дата, ВТ_Реализация.Контрагент, ВТ_Реализация.ОрганизацияПрефикс, ВТ_Реализация.Сделка, ВТ_Реализация.Сумма, ВТ_Реализация.Менеджер КАК Менеджер ИЗ ВТ_Реализация КАК ВТ_Реализация ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее ПО ВТ_Реализация.Сделка = ПлатежноеПоручениеВходящее.ДокументОснование ГДЕ &ВключатьППВ = ИСТИНА И ПлатежноеПоручениеВходящее.Дата МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПриходныйКассовыйОрдер.Дата, ДЕНЬ), ПриходныйКассовыйОрдер.СуммаДокумента, ВТ_Реализация.Номер, ВТ_Реализация.Дата, ВТ_Реализация.Контрагент, ВТ_Реализация.ОрганизацияПрефикс, ВТ_Реализация.Сделка, ВТ_Реализация.Сумма, ВТ_Реализация.Менеджер ИЗ ВТ_Реализация КАК ВТ_Реализация ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер ПО ВТ_Реализация.Сделка = ПриходныйКассовыйОрдер.ДокументОснование ГДЕ ПриходныйКассовыйОрдер.Дата МЕЖДУ &НачалоПериода И &КонецПериода |
|||
27
Artificial
27.04.16
✎
15:36
|
ВЫБРАТЬ РАЗЛИЧНЫЕ
РеализацияТоваровУслуг.СуммаДокумента КАК Сумма, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата КАК Дата, РеализацияТоваровУслуг.Контрагент, РеализацияТоваровУслуг.Организация.Префикс, РеализацияТоваровУслуг.Сделка КАК Сделка, ЕСТЬNULL(ЗаказПокупателя.Ответственный, РеализацияТоваровУслуг.Ответственный) КАК Менеджер ПОМЕСТИТЬ ВТ_Реализация ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя ПО РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка ГДЕ РеализацияТоваровУслуг.Организация = &Организация ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПлатежноеПоручениеВходящее.Дата, ДЕНЬ) КАК ДатаОплаты, ПлатежноеПоручениеВходящее.СуммаДокумента КАК СуммаОплаты, ВТ_Реализация.Номер, ВТ_Реализация.Дата, ВТ_Реализация.Контрагент, ВТ_Реализация.ОрганизацияПрефикс, ВТ_Реализация.Сделка, ВТ_Реализация.Сумма, ВТ_Реализация.Менеджер КАК Менеджер ИЗ Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Реализация КАК ВТ_Реализация ПО (ВТ_Реализация.Сделка = ПлатежноеПоручениеВходящее.ДокументОснование) ГДЕ &ВключатьППВ = ИСТИНА И ПлатежноеПоручениеВходящее.Дата МЕЖДУ &НачалоПериода И &КонецПериода ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(ПриходныйКассовыйОрдер.Дата, ДЕНЬ), ПриходныйКассовыйОрдер.СуммаДокумента, ВТ_Реализация.Номер, ВТ_Реализация.Дата, ВТ_Реализация.Контрагент, ВТ_Реализация.ОрганизацияПрефикс, ВТ_Реализация.Сделка, ВТ_Реализация.Сумма, ВТ_Реализация.Менеджер ИЗ Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Реализация КАК ВТ_Реализация ПО (ВТ_Реализация.Сделка = ПриходныйКассовыйОрдер.ДокументОснование) ГДЕ ПриходныйКассовыйОрдер.Дата МЕЖДУ &НачалоПериода И &КонецПериода Вроде меньше уже, но что-то не так с соединениями. |
|||
28
Artificial
27.04.16
✎
16:06
|
Ап.
|
|||
29
Artificial
27.04.16
✎
22:53
|
Ап.
|
|||
30
Cyberhawk
27.04.16
✎
23:24
|
Что такое "Кэпо"?
|
|||
31
H A D G E H O G s
27.04.16
✎
23:26
|
Кэш чистил?
|
|||
32
4St
27.04.16
✎
23:38
|
(27) В первом запросе добавляй
ИНДЕКСИРОВАТЬ ПО Сделка Это ускорит соединение в следующем запросе. Там же: определись, какой тип значения будет в "РеализацияТоваровУслуг.Сделка" в твоем случае. Если там планируется только "ЗаказПокупателя", то так и пиши: вместо "РеализацияТоваровУслуг.Сделка как Сделка" - "Выразить(РеализацияТоваровУслуг.Сделка как Документ.Заказпокупателя) как Сделка". Или даже "Заказпокупателя.Ссылка как Сделка" |
|||
33
4St
27.04.16
✎
23:42
|
(27) Это какой-то контроль отгрузок и оплат по заказам? Меня сильно напрягает вот что:
ЕСТЬNULL(ЗаказПокупателя.Ответственный, РеализацияТоваровУслуг.Ответственный) КАК Менеджер ПОМЕСТИТЬ ВТ_Реализация ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя ПО РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка Т.е. предполагаем, что Заказа может и не быть в структуре подчиненности. Но при этом упорно стараемся группировать Реализации, Платежки и ПКО именно по полю "РеализацияТоваровУслуг.Сделка". Что может быть в этом поле в конфигурации, на которой исполняется отчет? И какой смысл в группировке по пустому полю для заказчика данного отчета? |
|||
34
4St
27.04.16
✎
23:47
|
(27) кстати, вот тебе и ответ, почему отчет валит сервер.
Смотри внимательно: ВТ_Реализация КАК ВТ_Реализация ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеВходящее КАК ПлатежноеПоручениеВходящее ПО ВТ_Реализация.Сделка = ПлатежноеПоручениеВходящее.ДокументОснование Представь, что в базе есть 1000 Реализаций, где пустое поле "Сделка". И 1000 ПлатежноеПоручениеВходящее, где пустое поле "ДокументОснование". Итого получаем 1000*1000 записей в выборке. Дальше разберешься? |
|||
35
4St
27.04.16
✎
23:54
|
Хотя дальше становится интереснее. Ок, можно элегантно обрубить пустые значения, заменив Левое соединение в первом запросе на Внутреннее (кто-то вроде уже советовал).
Но дальше ты уткнешься в дубли строк, если на основании одного Заказа создано более 1 Реализации. Решение: из первой временной таблицы выбрать только уникальные Заказы, и уже именно их соединять с ПКО и ППВ в следующих запросах. А еще более правильно, скорей всего, настроить использование типового регистра "ВзаиморасчетыСКонтрагентами", т.к. речь, похоже, идет всего лишь об учете дебиторки по заказам, а не по договорам. И тогда есть вероятность, что можно будет использовать какой-нибудь штатный отчет в конфигурации, а не писать свой. Но вангую, что твой заказчик на это не пойдет, т.к. операторам надо будет немного переучиваться, а они этого не хотят, а цифры нужны вчера, а тыжпрограммист.... ну ты понял )) |
|||
36
4St
27.04.16
✎
23:59
|
Едрен батон, мы сильно ушли от изначального варианта запроса. А там было так:
(первая часть) ...ПО ПлатежноеПоручениеВходящее.ДокументОснование = РеализацияТоваровУслуг.Ссылка... (вторая часть) ...ПО (РеализацияТоваровУслуг.Сделка = ПриходныйКассовыйОрдер.ДокументОснование)... Вот вторая часть тебе базу валила, похоже. И тут какое-то противоречие между первой и второй частью запроса. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |