Имя: Пароль:
   
1C
1С v8
Одним запросом получить пять последних документов по всем контрагентам
0 Victor111
 
26.10.17
22:04
Посоветуйте как лучше реализовать идею.
Нужно по каждому контрагенту получить последние пять документов СчетНаОплатуПокупателю
Пробивал через левое соединение, не то, получим всех контрагентов и по одной записи

ВЫБРАТЬ
    Контрагенты.Наименование КАК Наименование,
    ВложенныйЗапрос.Ссылка,
    ВложенныйЗапрос.Контрагент
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 5
            СчетНаОплатуПокупателю.Ссылка КАК Ссылка,
            СчетНаОплатуПокупателю.Контрагент КАК Контрагент,
            СчетНаОплатуПокупателю.Дата КАК Дата
        ИЗ
            Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
        
        УПОРЯДОЧИТЬ ПО
            Дата УБЫВ) КАК ВложенныйЗапрос
        ПО Контрагенты.Ссылка = ВложенныйЗапрос.Контрагент
ГДЕ
    Контрагенты.ПометкаУдаления = ЛОЖЬ
    И Контрагенты.ЭтоГруппа = ЛОЖЬ

СГРУППИРОВАТЬ ПО
    Контрагенты.Наименование,
    ВложенныйЗапрос.Ссылка,
    ВложенныйЗапрос.Контрагент

УПОРЯДОЧИТЬ ПО
    Наименование
1 Fragster
 
26.10.17
22:10
гугли "коррелированный запрос 1с"
2 Franchiser
 
naïve
27.10.17
00:39
Сделай на скд
3 Franchiser
 
naïve
27.10.17
00:47
Во вложенном запросе попробуй
Где счетнаоплатупокупателя.контрагент = контрагент.ссылка
4 Tateossian
 
27.10.17
01:00
Держи

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

СГРУППИРОВАТЬ ПО
    ЗаказПокупателя.Ссылка,
    ЗаказПокупателя.Номер,
    ЗаказПокупателя.Контрагент

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЗаказПокупателя1.Ссылка) <= 5

УПОРЯДОЧИТЬ ПО
    Контрагент,
    НПП


;)
5 youalex
 
27.10.17
05:59
Как-то так, согласно (1):
ВЫБРАТЬ  ПЕРВЫЕ 100
    СпрКонтрагенты.Ссылка,
    ЗаказПокупателя.Ссылка
ИЗ
    Справочник.Контрагенты КАК СпрКонтрагенты
         СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
        ПО СпрКонтрагенты.Ссылка = ЗаказПокупателя.Контрагент
            И (ЗаказПокупателя.Ссылка В
                (ВЫБРАТЬ ПЕРВЫЕ 5
                    Документ.ЗаказПокупателя.Ссылка
                ИЗ
                    Документ.ЗаказПокупателя
                ГДЕ
                    Документ.ЗаказПокупателя.Контрагент = СпрКонтрагенты.Ссылка))
6 wondkind
 
27.10.17
07:31
(5) первые 5 это не последние 5 оплат) но идея правильная. Может автор и догадается
7 wondkind
 
27.10.17
07:32
(6) но у тебя наиболее правильный вариант, чем в (4), в котором не поняли что нужно сделать
8 craxx
 
27.10.17
07:49
(6) и последние станут первые)) смотря как сортировать))
9 wondkind
 
27.10.17
07:58
(8) сейчас проверил - по убыванию норм получится
10 Tateossian
 
27.10.17
11:54
(7) ТЫ пустозвон, насчет вот этого
"в котором не поняли что нужно сделать"

Проверь вот этот вариант

ВЫБРАТЬ ПЕРВЫЕ 100
    ЗаказПокупателя.Ссылка КАК Ссылка,
    СпрКонтрагенты.Ссылка КАК Контрагент,
    ЗаказПокупателя.Номер
ИЗ
    Справочник.Контрагенты КАК СпрКонтрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
        ПО СпрКонтрагенты.Ссылка = ЗаказПокупателя.Контрагент
            И (ЗаказПокупателя.Ссылка В
                (ВЫБРАТЬ ПЕРВЫЕ 5
                    Документ.ЗаказПокупателя.Ссылка
                ИЗ
                    Документ.ЗаказПокупателя
                ГДЕ
                    Документ.ЗаказПокупателя.Контрагент = СпрКонтрагенты.Ссылка
                    И Документ.ЗаказПокупателя.Проведен
                УПОРЯДОЧИТЬ ПО
                    Документ.ЗаказПокупателя.МоментВремени УБЫВ))

УПОРЯДОЧИТЬ ПО
    Контрагент

И мой и попробуй найти  пять отличий. А, еще можешь параметры добавить, чтобы было вообще идеально.
11 Victor111
 
27.10.17
12:18
Спасибо всем за совет, все получилось :)
12 mistеr
 
27.10.17
12:21
Оба варианта очень тяжелые будут, на большой базе. "ПЕРВЫЕ 5" будет не по индексу. Тут надо подумать.

Например, получить сначала в ВТ даты отсечения по каждому контру, после которых будут эти 5 заказов.
13 toypaul
 
27.10.17
12:28
а давно у 1С "коррелированный запрос" можно делать? чот пробовал - вроде не получалось.


или в соединении давно можно?
14 Tateossian
 
27.10.17
12:30
(12) Там куча мест по оптимизации, если уже дальше дорабатывать оба эти запроса.

(13) В RLS это активно используется, если посмотреть запросы => давно.
15 Dzenn
 
27.10.17
12:59
Я сначала совершенно не понял, как работает запрос в (4), и уже списал себя в тупые, но немного повтыкал — действительно шикарный запрос :-)
16 Dzenn
 
27.10.17
13:00
Tateossian, насколько хорошо твой запрос из (4) будет работать на больших данных?