Имя: Пароль:
1C
1С v8
Кэпо-отчёт валит программу с ошибкой "Недостаточно памяти"
,
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
Едрен батон, мы сильно ушли от изначального варианта запроса. А там было так:
(первая часть)
...ПО ПлатежноеПоручениеВходящее.ДокументОснование = РеализацияТоваровУслуг.Ссылка...

(вторая часть)
...ПО (РеализацияТоваровУслуг.Сделка = ПриходныйКассовыйОрдер.ДокументОснование)...

Вот вторая часть тебе базу валила, похоже. И тут какое-то противоречие между первой и второй частью запроса.