Имя: Пароль:
1C
1С v8
Помогите с запросом
0 newbas
 
17.05.13
15:39
Реальную задачу долго объяснять - возьмем пример:
Нужно вывести таблицу с 2 колонками:
- клиент
- датой последней реализации
На SQL я бы написал так:

SELECT
  Спр.Ссылка AS Контрагент
 ,(SELECT TOP 1 Док.ДатаFROM Документ.РеализацияТоОваровУслуг AS Док
   WHERE Док.Контрагент = Спр.Ссылка) AS Дата

FROM Справочник.Контрагенты AS Спр

ВОПРОС:
А как будет выглядеть аналог на языке запросов 1С?
1 Renat11111
 
17.05.13
15:41
МАКСИМУМ используй
2 vvp91
 
17.05.13
15:42
(1) Твой запрос ошибочен, он вернет дату случайной реализации, а не дату последней, ты забыл упорядочить.

В 1С коррелированных подзапросов нет. Перепиши свой запрос на соединение контрагентов и реализаций и получишь то, что будет в 1С.
3 Ёпрст
 
17.05.13
15:42
в 7-ке аналогисно, в 8-ке
левое соединение + максимум по дате дока
4 newbas
 
17.05.13
15:42
(2) Согласен, забыл про ORDER BY Док.Дата DESC
5 newbas
 
17.05.13
15:43
(3) Лучшая документация для программиста - ИСХОДНИК!
Можно пример
6 palpetrovich
 
17.05.13
15:46
выбрать док.контрагент, МАКСИМУМ(док.Дата) из...
7 newbas
 
17.05.13
15:47
ВЫБРАТЬ
 Спр.Ссылка AS Контрагент
ИЗ Справочник.Контрагенты AS Спр

ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ Док.Контрагент, MAX(Док.Дата)
 ИЗ Документ.РеализацияТоОваровУслуг AS Док
) КАК Доки ПО Доки.Контрагент = Спр.Ссылка

Все верно?
8 User_Agronom
 
17.05.13
15:48
СГруппировать?
9 newbas
 
17.05.13
15:48
Спр.Ссылка КАК Контрагент
,Доки.Дата
ИЗ Справочник.Контрагенты КАК Спр

ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ Док.Контрагент, MAX(Док.Дата) КАК Дата
 ИЗ Документ.РеализацияТоваровУслуг КАК Док
) КАК Доки ПО Доки.Контрагент = Спр.Ссылка
10 newbas
 
17.05.13
15:49
ВЫБРАТЬ
Спр.Ссылка КАК Контрагент
,Доки.Дата
ИЗ Справочник.Контрагенты КАК Спр

ЛЕВОЕ СОЕДИНЕНИЕ
(ВЫБРАТЬ Док.Контрагент, MAX(Док.Дата) КАК Дата
 ИЗ Документ.РеализацияТоОваровУслуг КАК Док
 СГРУППИРОВАТЬ ПО Док.Контрагент
) КАК Доки ПО Доки.Контрагент = Спр.Ссылка
11 mr_K
 
17.05.13
15:50
(9) А две таблицы зачем? Не проще ли сразу брать контрагента из документа?
12 newbas
 
17.05.13
15:50
(9) А если не было отгрузки у контрагента?
13 palpetrovich
 
17.05.13
15:52
(12) а в (0) про это ничего нет :)
14 newbas
 
17.05.13
15:53
А если усложнить задание и вывести еще сумму этой последней накладной?
15 User_Agronom
 
17.05.13
15:53
ВЫБРАТЬ
   Контрагенты.Ссылка,
   Док.Дата1
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК Дата1,
           РеализацияТоваровУслуг.Контрагент КАК Контрагент
       ИЗ
           Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
       
       СГРУППИРОВАТЬ ПО
           РеализацияТоваровУслуг.Контрагент) КАК Док
       ПО (Док.Контрагент = Контрагенты.Ссылка)
16 User_Agronom
 
17.05.13
15:54
(11) Проще. Но тут соединения ради соединения))
17 User_Agronom
 
17.05.13
15:55
(14) Тогда точно упростить и по одной таблице шариться))
18 newbas
 
17.05.13
15:56
(15) так не пойдет, т.к. группировка в основной выборке не нужна. Я первый запрос привел  для того, чтобы показать, что нужно поле, получаемое подзапросом
19 newbas
 
17.05.13
15:58
(17) Хорошо. Еще более конкретизируем задачу.
Нужно вывести:
-Контрагента (Всегда)
-Сумма продаж за период (нет проблем)
-Дату и сумму последней отгрузки
-контактная информация и т.д.
20 User_Agronom
 
17.05.13
15:58
(18) Тебе нужно выбрать поле с максимальной датой. А как выбирать, из какой группы? Вот я и показал, что нужно поле с макс датой но группы делать по контрагенту
21 User_Agronom
 
17.05.13
15:59
И у меня второе поле получаемо подзапросом
22 newbas
 
17.05.13
16:00
(20) согласен, я в (10) написал так, как меня устроит.
Вопрос темы был в том, чем заменить поля-подзапросы?
23 User_Agronom
 
17.05.13
16:01
Пакетный запрос.
ПОМЕСТИТЬ
24 User_Agronom
 
17.05.13
16:02
Но от соединения можно уйти только по (11)
25 StanislawJack
 
17.05.13
16:03
(19) Сначала в подзапросе получаешь максимальную дату, потом соединяешь результат опять с документами, только по контрагенту и полученной дате с ПЕРВЫЕ 1
26 newbas
 
17.05.13
16:12
(25) ПЕРВЫЕ 1 - выборка только одного документа, а мне надо для всех контрагентов.
27 User_Agronom
 
17.05.13
16:19
Подзапросы мутить лениво как-то((
28 newbas
 
17.05.13
16:19
(27) а выход какой?
29 User_Agronom
 
17.05.13
16:21
Сейчас напишу. Минут через 10
30 User_Agronom
 
17.05.13
16:37
ВЫБРАТЬ
   ТолпаКонтагентов.Ссылка,
   Док.Дата1 КАК ДатаДокумента,
   ДанныеДока.СуммаДокумента
ИЗ
   Справочник.Контрагенты КАК ТолпаКонтагентов
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           МАКСИМУМ(РТУслуг.Дата) КАК Дата1,
           РТУслуг.Контрагент КАК Контрагент
       ИЗ
           Документ.РеализацияТоваровУслуг КАК РТУслуг
       
       СГРУППИРОВАТЬ ПО
           РТУслуг.Контрагент) КАК Док
       ПО ТолпаКонтагентов.Ссылка = Док.Контрагент
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Докс.Контрагент КАК Контрагент,
           Докс.Дата КАК Дата,
           Докс.СуммаДокумента КАК СуммаДокумента
       ИЗ
           Документ.РеализацияТоваровУслуг КАК Докс) КАК ДанныеДока
       ПО (ДанныеДока.Дата = Док.Дата1)
           И ТолпаКонтагентов.Ссылка = ДанныеДока.Контрагент
31 User_Agronom
 
17.05.13
16:38
как-то так. Не тестил еще. Но вроде некогда.
32 viktor_vv
 
17.05.13
16:43
Вот еще вариант, правда может тормозить, но думаю не медленне коррелированного подзапроса в селекте.

    |        Выбрать
    |            СпрКонтр.Ссылка КАК Контрагент,
    |            РеализацияТоваровУслуг.Ссылка КАК ДокПродажи,
    |            РеализацияТоваровУслуг.Дата КАК ДатаДок
    |            
    |        ИЗ
    |            Справочник.Контрагенты КАК СпрКонтр
    |            Левое соединение Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |            
    |            ПО РеализацияТоваровУслуг.Контрагент = СпрКонтр.Ссылка  
    |                И РеализацияТоваровУслуг.Ссылка В (Выбрать Первые 1
    |                                            РеализацияТоваровУслуг2.Ссылка
   |
    |                                            ИЗ
    |                                                Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг2
    |                                            Где РеализацияТоваровУслуг2.Контрагент =  СпрКонтр.Ссылка
    |                                            Упорядочить ПО РеализацияТоваровУслуг2.Дата УБЫВ, РеализацияТоваровУслуг2.Ссылка УБЫВ
    |                                            )
    |";
33 viktor_vv
 
17.05.13
16:45
Есть таки вариант с временной таблицей или подзапросом как выше, но вкурть никак не могу с условием соедиенния, на случай если в одной секунде несколько доков.
34 User_Agronom
 
17.05.13
16:49
ВЫБРАТЬ
   ТолпаКонтагентов.Ссылка,
   Док.Дата1 КАК ДатаДокумента,
   ДанныеДока.СуммаДокумента
ИЗ
   Справочник.Контрагенты КАК ТолпаКонтагентов
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           МАКСИМУМ(РТУслуг.Дата) КАК Дата1,
           РТУслуг.Контрагент КАК Контрагент
       ИЗ
           Документ.РеализацияТоваровУслуг КАК РТУслуг
       
       СГРУППИРОВАТЬ ПО
           РТУслуг.Контрагент) КАК Док
       ПО ТолпаКонтагентов.Ссылка = Док.Контрагент
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           Докс.Контрагент КАК Контрагент,
           Докс.Дата КАК Дата,
           Докс.СуммаДокумента КАК СуммаДокумента
       ИЗ
           Документ.РеализацияТоваровУслуг КАК Докс) КАК ДанныеДока
       ПО (ДанныеДока.Дата = Док.Дата1)
           И ТолпаКонтагентов.Ссылка = ДанныеДока.Контрагент
ГДЕ
   НЕ ДанныеДока.СуммаДокумента ЕСТЬ NULL
Вот так в итоге.
(33) Ну да. Это я не учел
35 sttt
 
17.05.13
17:01
36 newbas
 
17.05.13
17:07
(34) спасибо - ощущения извращения никак не проходят. Что мешало 1С сделать поля-подзапросы?
37 StanislawJack
 
17.05.13
17:44
(33) Если в секунде несколько документов, надо выбрать МАКСИМУМ для Документ.Ссылка, в результате будет получен документ, GUID которого был создан самым последним из находящихся в этой секунде.
38 viktor_vv
 
17.05.13
17:59
(37) А, получается к подзапросу по максимальной дате цепляем еще раз таблицу дока по контру и дате и отсюда уже берем максимальную ссылку группируя опять по контрагенту.
39 kiruha
 
17.05.13
18:21
(36)
Потому что коррелированные подзапросы грузят базу не по детски
А ежели последняя реализация была 2001 г и индекса по клиенту в реализации нету ?

Если Вам нужна дата последней реализации(или обращения клиента более точно) - в 1С заводят регистр сведений и там хранят
40 viktor_vv
 
17.05.13
18:23
(38)+ Получилась такая хрень, вроде работает, но как-то тоже красотой не блещет

   ТекстЗапроса = "
    |Выбрать
    |    РеализацияТоваровУслуг.Контрагент КАК Контрагент,
    |    Максимум(РеализацияТоваровУслуг.Ссылка) КАК СсылкаДок
    |Поместить ПоследниеДокументы
    |ИЗ
   |    (ВЫБРАТЬ
   |        РеализацияТоваровУслуг.Контрагент КАК Контрагент,
    |        Максимум(РеализацияТоваровУслуг.Дата) КАК ДатаДок
    |    ИЗ
    |        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |    Сгруппировать ПО
    |        РеализацияТоваровУслуг.Контрагент
    |    ) КАК ПодзапросПоДате
    |    Внутреннее соединение
    |        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |            ПО ПодзапросПоДате.Контрагент = РеализацияТоваровУслуг.Контрагент
    |                И ПодзапросПоДате.ДатаДок = РеализацияТоваровУслуг.Дата
    |Сгруппировать ПО
    |    РеализацияТоваровУслуг.Контрагент
    |                
    |;
    |Выбрать
    |    СпрКонтр.Ссылка КАК Контрагент,
    |    РеализацияТоваровУслуг.Ссылка КАК ДокПродажи,
    |    РеализацияТоваровУслуг.Дата КАК ДатаДок
    |ИЗ
    |    Справочник.Контрагенты КАК СпрКонтр
    |    Левое соединение ПоследниеДокументы КАК ПоследниеДокументы
    |        ПО ПоследниеДокументы.Контрагент = СпрКонтр.Ссылка
    |    Левое соединение Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |        ПО ПоследниеДокументы.СсылкаДок = РеализацияТоваровУслуг.Ссылка
    |";