Имя: Пароль:
1C
1С v8
Периодичность регистра накопления в запросе
,
0 MAPATNK2
 
naïve
27.03.22
21:14
Всем доброго дня.
Нужно за каждый год получить по несколько документов из регистра партий. Число не важно.
Писал так, но не знаю, как сделать, чтобы получать по несколько документов каждый год.

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

А нужно, чтобы было так: 30 доков в 2018, 30 доков 2019, 30 доков 2020.
1 acht
 
27.03.22
21:17
2018, 2019, 2020 откуда берутся?
2 MAPATNK2
 
naïve
27.03.22
21:17
(1) Как понять откуда?
3 acht
 
27.03.22
21:19
(2) Параметры снаружи? Все годы из оборотов?
4 MAPATNK2
 
naïve
27.03.22
21:21
(3) обороты я приплел для примера, т.к. не знаю, как получать документы оприходования по определенному количеству за каждый год. Друг за другом.
5 acht
 
27.03.22
21:23
(4) > каждый год
Еще раз. Это ограничивается снаружи, или надо выбрать все годы всех документов, а потом для каждого из них отобрать нужное число документов?
6 MAPATNK2
 
naïve
27.03.22
21:25
(5) Не понимаю.
7 MAPATNK2
 
naïve
27.03.22
21:27
Как сделать, чтобы выводились доки по определенному количеству за каждый год?
8 MAPATNK2
 
naïve
27.03.22
21:33
Я так понимаю, "выбрать Первые" в таком случае использовать нельзя.
9 acht
 
27.03.22
21:50
Если я правильно понимаю, что ты хочешь, то если особо не включать голову и использовать коррелируемый подзапрос, то как-то так:

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


Производительность, конечно, так себе будет. Не проверял.
10 MAPATNK2
 
naïve
27.03.22
21:52
(9) База умерла после запуска с критической ошибкой XD
11 MAPATNK2
 
naïve
27.03.22
21:55
Причем, как я понял в SQL можно обойтись группировкой по периоду.
12 MAPATNK2
 
naïve
27.03.22
21:56
типа такого.
ВЫБРАТЬ ПЕРВЫЕ 10
    ПартииТоваровНаСкладахОбороты.ДокументОприходования,
    ГОД(ПартииТоваровНаСкладахОбороты.Период)
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
            ,
            ,
            Год,
            ТИПЗНАЧЕНИЯ(ДокументОприходования) = ТИП(Документ.ПоступлениеТоваровУслуг)
                И Организация = &ОрганизацияПоиска) КАК ПартииТоваровНаСкладахОбороты

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладахОбороты.ДокументОприходования,
    ГОД(ПартииТоваровНаСкладахОбороты.Период)

Но в 1С не отрабатывает подобный код.  С запросами все тяжело у меня.
13 RetardedToBoot
 
27.03.22
21:57
(9) интересно, а такое вообще должно работать? хоть как-нибудь...
14 Йохохо
 
27.03.22
22:02
(13) создай текст запроса динамически и не мучайся
15 MAPATNK2
 
naïve
27.03.22
22:06
(14) Мне нужно запросом (одним), на обычных формах упп)
16 MAPATNK2
 
naïve
27.03.22
22:08
Может в инете где есть инфа такая? Я даже не понимаю, как верно в поисковик вбить, что мне нужно.
17 Йохохо
 
27.03.22
22:08
(0) годы ты знаешь заранее? до выполнения запроса
18 hhhh
 
27.03.22
22:09
(0) выбрать первые 30
...
Поместить Год18
...
;

выбрать первые 30
...

Поместить Год19
...

;

выбрать первые 30
...

Поместить Год2020
...

;

и дальше объединяешь эти три таблицы
19 MAPATNK2
 
naïve
27.03.22
22:11
(18) не, годов много с 2000 по текущий и они будут увеличиваться. Иногда нужно будет по месяцам тянуть.
20 Йохохо
 
27.03.22
22:12
(19) не важно сколько, важно что ты можешь сгенерировать текст запроса
21 MAPATNK2
 
naïve
27.03.22
22:14
(20) Как понять неважно? Он ( текст запроса) каждый раз будет увеличиваться.
22 MAPATNK2
 
naïve
27.03.22
22:14
(20) И без изменения кода никто за новый период отчет не получит.
23 acht
 
27.03.22
22:15
(13) Должно и будет. Но медленно и печально. Можно, правда, попробовать выбросить УПОРЯДОЧИТЬ ПО, вынести периоды в индексированную времянку...
24 hhhh
 
27.03.22
22:16
(22) да всё получится, если текст динамически формировать. Просто вам лениво.
25 acht
 
27.03.22
22:17
(17) Перейти ~(1) =)
26 Йохохо
 
27.03.22
22:18
(22) задал начало, задал окончание, сгенерировал текст для новых дат, и все будет
(25) ну да
27 MAPATNK2
 
naïve
27.03.22
22:18
(25) Я не знаю года заранее.
28 MAPATNK2
 
naïve
27.03.22
22:19
(26) Ты же рофлиш надо мной?
29 Йохохо
 
27.03.22
22:20
(27) о, ответил
30 acht
 
27.03.22
22:20
(27) > Я не знаю года заранее
(19) > с 2000 по текущий

Ну да, ну да.
31 MAPATNK2
 
naïve
27.03.22
22:24
(30) Пример.
32 acht
 
27.03.22
22:33
(31) Чего
33 MAPATNK2
 
naïve
27.03.22
22:40
(32) годов. Не не вариант же для каждого года отдельный запрос писать.

Просто вот этот запрос:

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

Выводит то что нужно на скд, если ставить Группировку по Году.
Но я получаю так все документы. А мне нужно определенное кол-во, которое зададут позже.
34 Йохохо
 
27.03.22
22:44
35 MAPATNK2
 
naïve
27.03.22
22:52
(34) Спасибо! Попробую.
36 MAPATNK2
 
naïve
28.03.22
00:01
(34) Есть инфа о том, как нумеровать строки. Это научился. Но остается проблема в периодичности. Он нумерует все подряд, не зависимо от года, таким образом пробелма не решается...
37 MAPATNK2
 
naïve
28.03.22
00:06
Т.е. теперь бы понять, как осуществить нумерацию строк по периодам.
38 MAPATNK2
 
naïve
28.03.22
00:18
Вот пример присвоения номера строк. Но нужна периодичность присвоения данного номера.

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

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладахОбороты.ДокументОприходования.Ссылка,
    ПартииТоваровНаСкладахОбороты.ПериодГод
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИсходнаяТаблица.Ссылка КАК Ссылка,
    ИсходнаяТаблица.Номер КАК Номер
ИЗ
    ИсходнаяТаблица КАК ИсходнаяТаблица

УПОРЯДОЧИТЬ ПО
    Номер
39 MAPATNK2
 
naïve
28.03.22
00:55
Все получилось. Тема закрыта (34)   "Йохохо"  ОГРОМНОЕ СПАСИБО ЗА ИНФУ!!!
40 rudnitskij
 
28.03.22
16:25
(9) ВНУТРЕННЕЕ СОЕДИНЕНИЕ
  Документ.ПоступлениеТоваровУслуг КАК Документы
ПО  
  Документы.Ссылка В (...
------------------------------------
Так будет долго работать - если нужны только поступления. Будет все документы перелопачивать для соединения. Ускорить можно так:
------------------------------------
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
  Документ.ПоступлениеТоваровУслуг КАК Документы
ПО  
  ВЫРАЗИТЬ(Документы.Ссылка КАК Документ.ПоступлениеТоваровУслуг) В (...
41 Said_We
 
28.03.22
17:21
Столько сложностей в 1С:

А всего-лишь надо было написать запрос примерно такого вида:
select t.*
from (select
         t.Год
        ,t.СсылкаНаДокумент
        ,row_number() over (partition by t.Год ORDER BY t.Год, t.СсылкаНаДокумент) as NPP
    from
        utB as t
    )
where
    t.npp >=30
42 Said_We
 
28.03.22
17:34
(40) Не нужно тут сложного соединение...
Находите минимальный номер для каждого раздела в подзапросе. В качестве раздела из задачи (0) это год.
Для каждой записи из номера по порядку вычитаете этот минимум. Получаете нумерацию для каждого раздела с 1. Все что более 30 фильтруете. Связь простая по разделу.
43 rudnitskij
 
04.04.22
11:42
(42) Если для вас внутреннее соединение СЛОЖНОЕ - у меня для вас плохие новости...
44 Said_We
 
04.04.22
13:32
(43) Сложное - читать как использующие сложные индексы и составные типы. Не сложные - это использующие простые типы. Год - это простое число. Поэтому соединение не сложное, а простое.

И да.. я вам оценку не давал и не оскорблял.
Меня не интересуют ваши амбиции.