Имя: Пароль:
1C
1С v8
Запрос в цикле (обороты за разные периоды)
,
0 badboychik
 
05.04.12
10:21
Такая ситуация - надо получить таблицу
"Клиент, Долг клиента на сегодня, Обороты за период",
но период для оборотов у каждого клиента разный - число дней указано в договоре.

Коррелированные подзапросы в 1С не поддерживаются (нельзя во вложенном подставить поле из внешнего запроса), остается циклом?

Еще в СКД можно передать в набор параметр из другого, пробую пока
1 mirosh
 
05.04.12
10:22
придется вытаскивать на каждый день
2 Cube
 
05.04.12
10:24
(0) Возьми полную таблицу регистра, не виртуальную.
3 badboychik
 
05.04.12
10:26
(2) а дальше что с ней делать
4 Cube
 
05.04.12
10:27
(3) Условие по периоду накладывай и вперде
5 John83
 
05.04.12
10:29
(2) да можно и виртуальную, только периодичность поставить
6 John83
 
05.04.12
10:29
7 badboychik
 
05.04.12
10:34
(4) значение в условии оно одно для всех, а мне надо чтоб для каждого клиента обороты считались за разные периоды
8 Cube
 
05.04.12
10:37
(7) Да ты не в условия пихай свой отбор по периоду а делай вычисляемое поле запроса, типа такого:
ВЫБОР КОГДА Обороты.Период <= Договор.ДатаОкончания И Обороты.Период >= Договор.ДатаНачала ТОГДА
   Обороты.СуммаОборот
ИНАЧЕ
   0
КОНЕЦ
9 badboychik
 
05.04.12
10:55
хм.. похоже на решение, только надо выборку по регистру за 45 дней делать, т.к. период может колебаться от 5 до 45 дней
10 badboychik
 
05.04.12
12:35
удалось в СКД сделать
11 Kashemir
 
05.04.12
12:36
(0) Коррелированные запросы поддерживаются, но только для конструкций В ()
12 badboychik
 
05.04.12
12:50
Точно? Из этих скобок можно обращаться к полям главного запроса?
13 Cube
 
05.04.12
12:54
(12) Нет, можно туда вписать ещё один мини-запросик:
ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс,
   КурсыВалютСрезПоследних.Кратность
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(
           &Период,
           Валюта В
               (ВЫБРАТЬ
                   Валюты.Ссылка
               ИЗ
                   Справочник.Валюты КАК Валюты
               ГДЕ
                   Валюты.Код <> "643")) КАК КурсыВалютСрезПоследних
14 Kashemir
 
05.04.12
12:57
(12)Можно

В развитие примера (суть масло масленная)

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс,
   КурсыВалютСрезПоследних.Кратность
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(
           &Период,
           Валюта В
               (ВЫБРАТЬ
                   Валюты.Ссылка
               ИЗ
                   Справочник.Валюты КАК Валюты
               ГДЕ
                   Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта)) КАК КурсыВалютСрезПоследних
15 Cube
 
05.04.12
12:58
(14) Тупой копипастинг!!! :D
16 Cube
 
05.04.12
12:59
+(15) Так, что-то я поторопился с выводами... :)
17 badboychik
 
05.04.12
13:00
(13) это обычный подзапрос! Вот в (14) корреляция есть. Только я сомневаюсь что он заработает
18 Cube
 
05.04.12
13:00
(14) Не фурычит, ошибка:
Поле не найдено "КурсыВалютСрезПоследних.Валюта"
Валюты.Ссылка = <<?>>КурсыВалютСрезПоследних.Валюта)) КАК КурсыВалютСрезПоследних
19 badboychik
 
05.04.12
13:01
тото и оно :D
20 Kashemir
 
05.04.12
13:02
ВЫБРАТЬ
   КурсыВалют.Период,
   КурсыВалют.Валюта,
   КурсыВалют.Курс,
   КурсыВалют.Кратность
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
   КурсыВалют.Период В
           (ВЫБРАТЬ
               МАКСИМУМ(КВ.Период) КАК Период
           ИЗ
               РегистрСведений.КурсыВалют КАК КВ
           ГДЕ
               КВ.Валюта = КурсыВалют.Валюта)
21 ssh2006
 
05.04.12
13:02
(0) >...Коррелированные подзапросы в 1С не поддерживаются

Поддерживаются. Можно использовать поле внешней таблицы в подзапросе в условии соединения или в условии запроса.
22 Kashemir
 
05.04.12
13:02
(20) Имитация среза последних по физической таблице
23 badboychik
 
05.04.12
13:03
интересно... У 1С что, свой скуль-движок в ядре, который в корне отличается от MS SQL и не умеет такие вещи делать?
24 Kashemir
 
05.04.12
13:04
(23) Не - просто SDBL это упрощенная модель TSQL имеющая ряд ограничений, правда и плюсов (в читаемости)
25 badboychik
 
05.04.12
13:05
(21) "в условии запроса" ? в (14) это сделано и не пашет. А условие соединения это не корреляция
26 Kashemir
 
05.04.12
13:05
(25) В 14 просто виртуальная таблица ... я навскидку написал. Посмотри 20.
27 ssh2006
 
05.04.12
13:06
(25) > ... "в условии запроса"

секция ГДЕ
28 Cube
 
05.04.12
13:07
(20) Ну... Что ж вы нам тухлые помидоры под видом спелых мандарин продаете?))))
29 Kashemir
 
05.04.12
13:08
(28) Что не так ?
30 Axel2009
 
05.04.12
13:10
НАЧАЛОПЕРИОДА(Период, зависит от условий договора)
ОБОРОТЫ (, , День)
31 badboychik
 
05.04.12
13:17
На СКД медленно работает.
Кажется оно просто за меня выполняет в цикле запрос по второму набору
32 Cube
 
05.04.12
13:19
(31) Запрос в студию
33 badboychik
 
05.04.12
13:24
там два запроса и три связи между наборами
34 Cube
 
05.04.12
13:25
(33) А че в одном запросе не сделал?
35 badboychik
 
05.04.12
13:30
чтоб как в (8) ? Решил все таки СКД победить :)
36 badboychik
 
05.04.12
13:31
Вот пример запроса со вложенным кореллированным.
Тупой запрос, но все равно не работает.

ВЫБРАТЬ
   Т.Номенклатура,
   СУММА(Т.Количество) КАК Количество,
   СУММА(Т.Сумма) КАК Сумма
ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Т    
ГДЕ
   Т.Ссылка В(
   ВЫБРАТЬ  Документы.Ссылка КАК Ссылка
   ИЗ       Документ.РеализацияТоваровУслуг КАК Документы
   ГДЕ
       Документы.Контрагент = Т.Контрагент // ВОТ ССЫЛКА НА ВНЕШНЕЕ ПОЛЕ, ТУТ ОШИБКА ВЫЛАЗИТ
       И Документы.Дата > &Дата)
СГРУППИРОВАТЬ ПО
   Т.Номенклатура
37 ssh2006
 
05.04.12
13:34
(36) Нет такого поля во внешнем запросе - Т.Контрагент
38 badboychik
 
05.04.12
13:36
и что? в SQL будет работать, потому что Т это таблица и доступны все ее поля
39 badboychik
 
05.04.12
13:37
даже если добавить Т.Контрагент в главный, все равное не работает
40 Kashemir
 
05.04.12
13:39
(36) Ты ж к ТЧ обращаешся. Там нет контрагента. Так надо:

ВЫБРАТЬ
   Т.Номенклатура,
   СУММА(Т.Количество) КАК Количество,
   СУММА(Т.Сумма) КАК Сумма
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК Т
ГДЕ
   Т.Ссылка В
           (ВЫБРАТЬ
               Документы.Ссылка КАК Ссылка
           ИЗ
               Документ.РеализацияТоваровУслуг КАК Документы
           ГДЕ
               Документы.Контрагент = Т.Ссылка.Контрагент
               И Документы.Дата > &Дата)

СГРУППИРОВАТЬ ПО
   Т.Номенклатура
41 badboychik
 
05.04.12
13:40
оппппа! работает )
42 Cube
 
05.04.12
13:40
(35) Может я чего не догднал, но:

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

СГРУППИРОВАТЬ ПО
   ВзаиморасчетыСКонтрагентамиОстатки.Организация,
   ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
   ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента,
   ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток

Строк в запросе 1519, время выполнения меньше секунды...
43 ssh2006
 
05.04.12
13:41
(41) копи паст из документации на эту тему:

"Заметим, что из запроса операции В возможно обращение к полям таблиц, которые встречались во внешнем запросе до появления операции.
Пример:
Копировать в буфер обмена
// Выбрать названия товаров, которые присутствовали
// в расходных накладных
ВЫБРАТЬ
 Товары.Наименование
ИЗ
 Справочник.Номенклатура КАК Товары
ГДЕ
 Товары.Ссылка В
 (ВЫБРАТЬ
   РасходнаяНакладнаяСостав.Номенклатура
 ИЗ
 Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
 ГДЕ
   РасходнаяНакладнаяСостав.Номенклатура = Товары.Ссылка)"
44 Kashemir
 
05.04.12
13:43
+(40) Хотя нафига тут корреляционный запрос не пойму. Чем отличается результат от :

ВЫБРАТЬ
   Т.Номенклатура,
   СУММА(Т.Количество) КАК Количество,
   СУММА(Т.Сумма) КАК Сумма
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК Т
ГДЕ
   Т.Ссылка.Дата > &Дата

СГРУППИРОВАТЬ ПО
   Т.Номенклатура
45 badboychik
 
05.04.12
13:45
(44) я ж для примера привел, ничего лучше не придумал )
46 Kashemir
 
05.04.12
13:46
(45) Ааа ок :)
47 Cube
 
05.04.12
14:05
Так на чем остановились-то?
48 badboychik
 
05.04.12
14:08
Вот черт, похоже (42) это реально проще вариант
49 Kashemir
 
05.04.12
14:10
(48) Группировка по остатку - тебе так реально и надо ?
50 Cube
 
05.04.12
14:12
(49) Не вижу в этом ничего плохого. Задачу из (0) выполняет на ура.
51 Kashemir
 
05.04.12
14:13
(50) А чем к примеру агрегация через максимум хуже ?
52 Cube
 
05.04.12
14:14
(52) Отличия?
53 Kashemir
 
05.04.12
14:17
(52) Логичнее и наверняка быстрее (нет индексов для ресурса)
54 Cube
 
05.04.12
14:18
(53) Хз... Мне кажется без разницы. Да, к тому же, куда уж быстрее :)