Имя: Пароль:
1C
1С v8
Вопрос по СКД
0 alexmobile
 
22.04.15
07:58
Помогите разобраться
Вот текст запроса

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

Во вложенном запросе собираются записи со всего регистра, так и есть если запустить запрос не через СКД. Через СКД на вложенный запрос накладываются ограничения по периоду, как и в выборке по остаткам и оборотам.
1 alexmobile
 
22.04.15
07:59
конфа УТ 10
2 Вася Чез
 
22.04.15
08:00
а в чем помочь разобраться?
3 alexmobile
 
22.04.15
08:01
почему в режиме СКД накладываются ограничения по периоду на вложенный запрос, если я явно этого не указываю.
4 Вася Чез
 
22.04.15
08:06
(3) может в настройках на вкладке "Параметры" задан период?
5 alexmobile
 
22.04.15
08:09
(4) да задан. во вложенном запросе параметры не используются
6 alexmobile
 
22.04.15
08:14
ВЫБРАТЬ
    ОстаткиИОбороты.Сделка,
    ОстаткиИОбороты.Сделка.СуммаДокумента КАК СуммаЗаказ,
    ЕСТЬNULL(Оплаты.СуммаВзаиморасчетовОборот, 0) КАК Оплата
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, Движения, ) КАК ОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            -1 * Обороты.СуммаВзаиморасчетовОборот КАК СуммаВзаиморасчетовОборот,
            Обороты.Сделка КАК Сделка
        ИЗ
            РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(, , Регистратор, ) КАК Обороты
        ГДЕ
            (Обороты.Регистратор ССЫЛКА Документ.ПриходныйКассовыйОрдер
                    ИЛИ Обороты.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее)) КАК Оплаты
        ПО ОстаткиИОбороты.Сделка = Оплаты.Сделка

Убрал лишнее чтобы читалось проще
7 Вася Чез
 
22.04.15
08:17
(6) ну судя по коду вложенный запрос выполняется для каждой строки внешнего запроса, поэтому и есть период
8 LordCMEPTb
 
22.04.15
08:20
СКД сама добавляет в параметры виртуальной таблицы оборотов параметры "НачалоПериода" и "КонецПериода", а потому для таких ситуаций можно использовать костыль: добавить параметры виртуальной таблицы и заполнить их такими значениями, чтобы охватывался весь период (1980-3999 гг).
Добавить параметры можно либо в кострукторе запроса на закладке "Построитель" для виртуальной таблицы, либо в самом тексте "РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты((&ОченьНачалоПериода),(&ОченьКонецПериода) , Регистратор, )"
9 anaed
 
22.04.15
08:20
датавремя(1,1,1) попробуй использовать в датах вложенных запросов
10 alexmobile
 
22.04.15
08:21
(7)Нет. Пробовал вложенный формировать во временную таблицу. Результат тот-же
11 LordCMEPTb
 
22.04.15
08:24
(8) ну всмысле через фигурные скобки
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(({&ОченьНачалоПериода}),({&ОченьКонецПериода}) , Регистратор, )
12 alexmobile
 
22.04.15
08:24
(9) помогло
13 Вася Чез
 
22.04.15
08:27
(12) (11) а что нет другого решения, кроме этого жуткого костыля?
14 alexmobile
 
22.04.15
08:29
(11) да, я понял. поставил

Обороты({(ДАТАВРЕМЯ(1, 1, 1)) КАК Поле2}, {(ДАТАВРЕМЯ(1, 1, 1)) КАК Поле2}, Регистратор, )

все записи стали попадать.

но есть еще другая проблема,
если запись из вложенного запроса попадает в период верхнего запроса, то она создает дублирующую строку.
15 LordCMEPTb
 
22.04.15
08:29
СКД - система для быстрого проектирования отчета, она как МТС, на шаг впереди.. вот только она не учитывает, что впереди может быть пропасть..
16 alexmobile
 
22.04.15
08:29
(13) я 2 часа убил, не нашел.
17 alexmobile
 
22.04.15
08:30
+(14) хотя явно указано левое соединение
18 LordCMEPTb
 
22.04.15
08:32
(14) а детальные записи по сделке уникальные или возможны дубли?
Судя по соединению такое возможно, если какая-то запись разбита на несколько
19 alexmobile
 
22.04.15
08:34
(18) да, косяк. детальные записи неуникальны.

спасибо всем.
20 GenAcid
 
22.04.15
08:44
(13) Правильное решение - снять галку "автозаполнение" в СКД и заполнить закладку "компоновка данных" в запросе или текстом явно описать нужные поля и отборы.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший