Имя: Пароль:
1C
1С v8
Помогите с запросом
,
0 repin_mike
 
21.02.23
12:21
Надо запросом выдернуть 10 последние поступлений от каждого контрагента. Запрос за меня писать не надо, натолкните на мысль просто как это можно сделать.
1 Bigbro
 
21.02.23
12:22
выбрать первые 10..
2 repin_mike
 
21.02.23
12:22
(1) Внимательно читал условия, молодец
3 H A D G E H O G s
 
21.02.23
12:23
Никак.
Запрос в цикле, либо полная выборка и обработка кодом.
4 Bigbro
 
21.02.23
12:27
пожалуйста.
5 hockeyist
 
21.02.23
12:32
(0) Автонумерация откроет тебе дверь в окно ))) Т.е. в оконные функции
6 magicSan
 
21.02.23
12:37
(3) жестки ты тип
7 unenu
 
21.02.23
12:38
(0) как-то уже кидал. запустил в консоли последней УТ - работает. ПЕРВЫЕ 100 в последнем пакете, чтобы увидеть результат на большой базе.

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтДокументыПоПорядкуВсе.Партнер КАК Партнер,
    МАКСИМУМ(ВтДокументыПоПорядкуВсе.Порядок) КАК ПорядокМакс
ПОМЕСТИТЬ ВтПорядокМаксПоПартнеру
ИЗ
    ВтДокументыПоПорядкуВсе КАК ВтДокументыПоПорядкуВсе

СГРУППИРОВАТЬ ПО
    ВтДокументыПоПорядкуВсе.Партнер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтДокументыПоПорядкуВсе.Партнер КАК Партнер,
    ВтДокументыПоПорядкуВсе.Документ КАК Документ
ПОМЕСТИТЬ ВтДокументыПоПартнеруПоследние
ИЗ
    ВтДокументыПоПорядкуВсе КАК ВтДокументыПоПорядкуВсе
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтПорядокМаксПоПартнеру КАК ВтПорядокМаксПоПартнеру
        ПО ВтДокументыПоПорядкуВсе.Партнер = ВтПорядокМаксПоПартнеру.Партнер
ГДЕ
    ВтДокументыПоПорядкуВсе.Порядок > ВтПорядокМаксПоПартнеру.ПорядокМакс - &КоличествоПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 100
    ВтДокументыПоПартнеруПоследние.Партнер КАК Партнер,
    ВтДокументыПоПартнеруПоследние.Документ КАК Документ,
    РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
    ВтДокументыПоПартнеруПоследние КАК ВтДокументыПоПартнеруПоследние
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ВтДокументыПоПартнеруПоследние.Документ = РеализацияТоваровУслуг.Ссылка
ИТОГИ
    СУММА(СуммаДокумента)
ПО
    Партнер
8 Гипервизор
 
21.02.23
12:41
(7) Решение всего миллиард реализаций поддерживает? )
9 unenu
 
21.02.23
12:43
(8) Попробуйте, почему нет?
10 H A D G E H O G s
 
21.02.23
12:43
11 repin_mike
 
21.02.23
12:50
(3) Почему невозможно-то? Вроде ниже даже решение выложили
(7) Спасибо, сейчас вчитаюсь
12 unenu
 
21.02.23
12:54
(11) просто по тексту делаем замену РеализацияТоваровУслуг на ПриобретениеТоваровУслуг и все.
13 H A D G E H O G s
 
21.02.23
12:58
(11) Не забудь запомнить этот момент изменения в конфе, чтобы потом копать причину тормозов
14 Garykom
 
гуру
21.02.23
12:59
Идиотизм

Нумерация да еще и через СГРУППИРОВАТЬ в запросах это дичайшая нагрузка на СУБД
15 Гипервизор
 
21.02.23
13:01
(12) Ну если вы даёте настолько подробные инструкции, то не мешает ещё и конфу уточнить. А то Партнеры не только лишь в каждой конфе есть.
16 Garykom
 
гуру
21.02.23
13:01
Делай запрос в цикле, это самое простое и банальное
На больших данных это будет самое оптимальное
17 PLUT
 
21.02.23
13:07
(7) это "произвольный запрос" для динамического списка?
18 Garykom
 
гуру
21.02.23
13:08
Имхо я бы завел отдельный РС, в который писал ссылки не "последние 10" документов по каждому контрагенту
И тупо соединял с ним
19 Said_We
 
21.02.23
13:08
(14) "Нумерация" одна из самых быстрых операций в стандартном SQL. 1С конечно могли изобрести велосипед с тормозами, но вероятность этого мала.
В стандартном SQL задача решается одним подзапросом без создания временных таблиц.
20 Garykom
 
гуру
21.02.23
13:08
(18) *на
21 Garykom
 
гуру
21.02.23
13:10
(19) в том то и дело что вряд ли 1С использует ROW_NUMBER
22 unenu
 
21.02.23
13:11
(14) (13) Пока в типовом в обмене УТ > БП, при обмене каждого прихода читают в Вт весь регистр себестоимости и это всех устраивает, то, думаю, автонумерация одного вида документа это вообще ни о чем.

ну замеряйте нагрузки на терабайтных базах и покажите стат, что более узко типовые грабли или эти.
мне самому лень)
23 Said_We
 
21.02.23
13:12
(21) Это почему? Данная функция есть во всех SQL, которые поддерживает 1С. DB2 не проверял. Но кто им пользуется не знаю.
24 unenu
 
21.02.23
13:12
(17) нет, отчет ес-но
25 Garykom
 
гуру
21.02.23
13:24
(23) в sql субд есть много чего что 1С не использует
26 РусКомп
 
21.02.23
13:38
(0) Берешь таблицу реализаций соединяешь саму собой Контагент=Контрагент, Регистратр<=Регистратор

И добавить параметр НПП = 1. Сумма(НПП) и у тебя для Регистратор будет номер.

Типовой варинат нумерации строк в запросе: https://1cguide.ru/programmirovanie-1s/nomera-strok-v-zaprose-1s.html

А потом отбираешь НПП <= 10.
27 H A D G E H O G s
 
21.02.23
13:39
После того, как я увидел, что 1С для ПолучитьРазмерДанных()  делает перебор таблицы и DataLength() вместо DMV, я ничему не удивлюсь.
28 Said_We
 
21.02.23
13:42
(0) Данная задача в 1С решается и через нумерацию и без нумерации. Но оба варианта глаз не радуют.
29 magicSan
 
21.02.23
13:43
(26) старый кастыль, но вот вроде автонумерация его обходит
30 Garykom
 
гуру
21.02.23
13:44
Задачка на запросы в 1С

Как для Динамического списка (по документам) сделать итоги?
31 Garykom
 
гуру
21.02.23
13:45
(30)+ выводить в подвале кол-во документов и их сумму
учитывая отборы ))
32 repin_mike
 
21.02.23
13:59
(28) Через нумерацию понял, а без неё как?
33 Said_We
 
21.02.23
14:00
(32) Примерно так:
https://imageup.ru/img22/4222235/snimok-ekrana-ot-2023-02-21-13-52-24.png

Под рукой сейчас только ЗиУП. Поэтому сделал для этой базы. Но важна суть. Внутренняя таблица не нужна для задачи в (0) - нужна из-за РН по НДФЛ, бывает много доходов за один и тот же период. Предварительно свернул чтобы было нагляднее. Вместо 10 взял 3. В вашем случае будет ссылка - она уникальна.
34 magicSan
 
21.02.23
14:02
(33) выглядит как самое не оптимальное
35 Garykom
 
гуру
21.02.23
14:09
(34) классический запрос в цикле, только средствами скуля
36 Lexandr
 
21.02.23
14:10
Если бы это это была бы реальная задача, то лучше использовать скд. Я даже попробовал на базе с 3000 клиентами, за 10 сек сформировало.
37 Said_We
 
21.02.23
14:15
(34) В 1С всегда так. Держи оптимальное - только Вы же такое не любите. Кстати есть ещё боле быстрый вариант для MS SQL

WITH vt_data as (
select 100 as kontr, 10 as doc
UNION ALL  select 100, 20
UNION ALL  select 100, 110
UNION ALL  select 100, 120
UNION ALL  select 100, 140
UNION ALL  select 50, 20
UNION ALL  select 50, 60
UNION ALL  select 50, 100
UNION ALL  select 200, 10
UNION ALL  select 200, 20
UNION ALL  select 200, 50
UNION ALL  select 200, 80
)

SELECT *
FROM (SELECT t.kontr, t.doc, row_number() over(PARTITION by t.kontr ORDER BY t.doc) as npp FROM vt_data as t) as t
WHERE t.npp <= 3
order by t.kontr, t.npp
38 Said_We
 
21.02.23
15:15
(7) Можно проще с нумерацией. Фактически сначала делается нумерация для каждого контрагента отдельно. Фактически это "row_number() over(PARTITION by t.kontr ..."
А далее только условие на <= 10.

https://imageup.ru/img86/4222290/snimok-ekrana-ot-2023-02-21-15-11-03.png
39 Said_We
 
21.02.23
16:09
(0) Вариантов накидали - осталось применить к своей задаче. :-)
40 mistеr
 
21.02.23
16:30
(16) На действительно больших данных вместо цикла пул фоновых заданий
41 magicSan
 
21.02.23
20:13
(37) опять вставляешь запросы которые никому не упали? Потому как НЕ КОМПИЛИРУЮТСЯ НА 1С
42 Said_We
 
21.02.23
22:00
(41) Акстись. Компиляция (37) в (38).
43 Said_We
 
21.02.23
22:03
(41) И о том, что компиляция (37) в (38) прямым текстом и написано.
И да раздражает это только Вас. Я даже не знаю и не догадываюсь почему.
44 magicSan
 
21.02.23
22:04
(42) что в голове у человека который текст запроса вставляет картинкой?
45 Said_We
 
21.02.23
22:09
(44) Всё проще. 1С только в терминале. С терминала взять можно только картинку - безопасность однако, закрыто всё.
А локально есть, например SQLite. Так что всё логично. Ставить 1С локально нет желания - надоедает на работе. В свободное время 1С точно нет желания заниматься.
46 Said_We
 
21.02.23
22:13
(44) И да в настройках аккаунта в форуме пропиши уже себе что бы отображались картинки:

$(function()
  {
    $(
        "a[target][href$='png'],[href$='jpg'],[href$='jpeg'],[href$='gif'] "
     ).each(function(ix,el)
             {
                var t=$(el);
                t.html('<img width="300" src="'+t.html()+'">')
             }
           )
  }
)
47 magicSan
 
21.02.23
22:23
(45) научись уже через ssh пробрасывать тонкого. (46) нахера  мне отображение картинки? думаешь делать нечего как перепечатывать текст  картинки?
48 Said_We
 
21.02.23
23:34
(47) Зачем перепечатывать? Достаточно посмотреть и понять смысл. Там коду на несколько строк. Тем более у автора совсем другая конфигурация и совсем другие объекты.
49 Said_We
 
21.02.23
23:45
(47) У меня подключение через Citrix и двухфакторная авторизация. Каждый раз прилетает файл *.isa (имя разное каждый раз, системности нет), в котором прописаны параметры подключения. Каждый раз разные. Запарюсь я пробрасывать.
50 Said_We
 
21.02.23
23:54
(47) Повторюсь.
"И да раздражает это только Вас. Я даже не знаю и не догадываюсь почему."
51 magicSan
 
22.02.23
04:14
(50) другие просто пропускают.


большая база картошки раз такая безопасность?
52 Said_We
 
22.02.23
09:32
(51) Много разных, в том числе не 1С.