Имя: Пароль:
1C
1С v8
В запросе выбрать первые записи
0 olbir
 
08.08.14
11:16
Добрый день!
Подскажите, пожалуйста, как в запросе выбрать первые записи по каждой номенклатуре
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Счет,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокДт КАК КоличествоНач,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНач,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт,
    Реализация.Количество,
    Реализация.Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода,  , ,Счет =&Счет, , )  КАК ХозрасчетныйОстаткиИОбороты
    ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Реализация
    ПО     ХозрасчетныйОстаткиИОбороты.Субконто1 =  Реализация.Номенклатура
ГДЕ    
    Реализация.Ссылка.Дата >= &НачалоПериода и Реализация.Ссылка.Дата <= &КонецПериода        
УПОРЯДОЧИТЬ ПО  Реализация.Номенклатура, Реализация.Ссылка.Дата
1 PR
 
08.08.14
11:18
ИТОГИ
2 olbir
 
08.08.14
11:30
?
Мне нужны первые записи по каждой номенклатуре
3 PR
 
08.08.14
11:31
(2) !
Да
4 Господин ПЖ
 
08.08.14
11:31
ам/кг

кривой запрос
5 PR
 
08.08.14
11:32
+(3) Подсказка из серии "А не в амперах ли измеряется сила тока?".
ИТОГИ по номенклатуре.
6 olbir
 
08.08.14
11:35
(5) Я вас поняла, но не получается то что нужно
ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Счет,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокДт КАК КоличествоНач,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНач,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт,
    Реализация.Количество,
    Реализация.Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода,  , ,Счет =&Счет, , )  КАК ХозрасчетныйОстаткиИОбороты
    ПРАВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Реализация
    ПО     ХозрасчетныйОстаткиИОбороты.Субконто1 =  Реализация.Номенклатура
ГДЕ    
    Реализация.Ссылка.Дата >= &НачалоПериода и Реализация.Ссылка.Дата <= &КонецПериода        
УПОРЯДОЧИТЬ ПО  Реализация.Номенклатура, Реализация.Ссылка.Дата
    ИТОГИ ПО Реализация.Номенклатура
7 PR
 
08.08.14
11:35
(6) Плохо.
Фото опять же нет.
Лучше всего вызвать программиста.
8 salvator
 
08.08.14
11:38
(6) Выбрать первые 1 номенклатура, ссылка из документ реализация упорядочить по дата реализации убыв.
Затем соединить с регистром бухгалтерии
9 salvator
 
08.08.14
11:39
тьфу, не первые 1, а сгруппировать по номенклатуре с функцией минимум по дате документа
10 Крошка Ру
 
08.08.14
11:39
(1)(5) А теперь я что-то не въезжаю... При чем здесь ИТОГИ?
11 PR
 
08.08.14
11:41
(10) Рукалицо
А как ты предлагаешь делать?
12 RomanYS
 
08.08.14
11:45
смущает, что ТС выбирает количество и сумму, а говорит про первые записи
(0)Вопрос: нужно вывести количество и сумму из наиболее ранней накладной? Если там несколько строчек с одной номенклатурой?
13 mikecool
 
08.08.14
11:47
(11) как итогами выбрать первые 5 записей по каждой номенклатуре?
14 Крошка Ру
 
08.08.14
11:47
(11) Рукалицо в ответочку.
Как ИТОГИ помогут получить первые записи по каждой номенклатуре из регистра, начиная с НачалаПериода?
В (9) вполне работающий вариант.
15 olbir
 
08.08.14
11:49
(12)  количество и сумму из наиболее ранней накладной
16 olbir
 
08.08.14
11:50
(9) можно поподробнее..
17 RomanYS
 
08.08.14
11:52
(15) варианта 2:
1)"Коррелированные запросы" - поиск в помощ
2) из (9), только там придется учесть, что у накладных может быть одинаовое время
18 PR
 
08.08.14
11:54
(14) И как спрашивается группировать остальные поля, кроме номенклатуры и даты документа?
19 Леха Дум
 
08.08.14
12:01
(18) смотри (9) - там получится таблица, ее по дате и нужно будет и остальным значимым полям соединять с исходной таблицей
20 Крошка Ру
 
08.08.14
12:05
(18) Соединяем ТЧ документа и обороты регистра по номенклатуре, группируем по номенклатуре, по периоду - минимум; выгружаем в ВТ. Соединяем ВТ и регистр по номенклатуре и периоду - и вуаля, первые записи из регистра по каждой номенклатуре.
21 RomanYS
 
08.08.14
12:07
(20) если у двух ранних документов будет одинаковое время - получишь задвоение
22 RomanYS
 
08.08.14
12:07
+(17) к 1)
ВЫБРАТЬ
    ТЧ.Ссылка,
    ТЧ.НомерСтроки,
    ТЧ.Номенклатура,
    ТЧ.Количество,
    ТЧ.Сумма,
    ТЧ.Ссылка.Дата
ПОМЕСТИТЬ Релизации
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
ГДЕ
    ТЧ.Ссылка.Проведен
    И ТЧ.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Релизации.Ссылка,
    Релизации.НомерСтроки,
    Релизации.Номенклатура,
    Релизации.Количество,
    Релизации.Сумма,
    Релизации.Дата
ИЗ
    Релизации КАК Релизации
ГДЕ
    (Релизации.Ссылка, Релизации.НомерСтроки) В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                Релизации.Ссылка КАК Ссылка,
                Релизации.НомерСтроки КАК НомерСтроки
            ИЗ
                Релизации КАК Релизации
            ГДЕ
                Релизации.Номенклатура = &Номенклатура
            УПОРЯДОЧИТЬ ПО
                Релизации.Дата,
                Ссылка,
                НомерСтроки)
23 salvator
 
08.08.14
12:08
(16) _примерно_ так

ВЫБРАТЬ
    Вл.Номенклатура,
    Вл.Количество,
    Вл.Сумма,
    Вл.Ссылка,
    ХозрасчетныйОстаткиИОбороты.Субконто1,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,
    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт
ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        НоменклатураПоследнееПоступление.Номенклатура КАК Номенклатура,
        Док.Количество КАК Количество,
        Док.Сумма КАК Сумма,
        Док.Ссылка КАК Ссылка
    ИЗ
        (ВЫБРАТЬ
            НоменклатураМаксДата.Номенклатура КАК Номенклатура,
            МАКСИМУМ(Док.Ссылка) КАК Ссылка
        ИЗ
            (ВЫБРАТЬ
                Док.Номенклатура КАК Номенклатура,
                МАКСИМУМ(Док.Ссылка.Дата) КАК Дата
            ИЗ
                Документ.РеализацияТоваровУслуг.Товары КАК Док
            
            СГРУППИРОВАТЬ ПО
                Док.Номенклатура) КАК НоменклатураМаксДата
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Док
                ПО НоменклатураМаксДата.Номенклатура = Док.Номенклатура
                    И НоменклатураМаксДата.Дата = Док.Ссылка.Дата
        
        СГРУППИРОВАТЬ ПО
            НоменклатураМаксДата.Номенклатура,
            НоменклатураМаксДата.Дата) КАК НоменклатураПоследнееПоступление
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Док
            ПО НоменклатураПоследнееПоступление.Номенклатура = Док.Номенклатура
                И НоменклатураПоследнееПоступление.Ссылка = Док.Ссылка) КАК Вл
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаН, &ДатаО, Запись, , Счет = &Счет, , ) КАК ХозрасчетныйОстаткиИОбороты
        ПО Вл.Номенклатура = ХозрасчетныйОстаткиИОбороты.Субконто1
            И Вл.Ссылка = ХозрасчетныйОстаткиИОбороты.Регистратор
24 Крошка Ру
 
08.08.14
12:13
(21) Если у двух документов время одинаковое, то и первых записей - две. А по номеру строки - да, группировать нужно.
(22) Вложенные запросы... Фи, какая гадость...
25 PR
 
08.08.14
12:16
(19) Охренеть новинка отечественного программирования.
Ну пусть так.
Можно было просто выбрать первый проход по группировке, да.
Меньше данных в запросе да, хорошо наверное.
26 PR
 
08.08.14
12:17
(20) Не по периоду, а по периоду и регистратору.
27 Крошка Ру
 
08.08.14
12:19
(25) Да вариантов-то много существует, выбирай любой. Никто и не говорил, что здесь предложены оптимальные решения
28 RomanYS
 
08.08.14
12:21
в (22) поспешил, должно быть так

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

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


(24)насчет вложенных запросов - в целом согласен, но в данном случае (коррелированный запрос) это исключение. По другому нельзя выбрать, например, первые 10 записей по номенклатуре
29 RomanYS
 
08.08.14
12:25
(26) так нельзя: минимум по регистратору может не совпасть с минимумом по дате, в итоге при последующем соединении ничего не получишь
30 Леха Дум
 
08.08.14
12:28
(28) выбрать первые 10 записей по номенклатуре при наличии даты можно без кор. запроса
31 RomanYS
 
08.08.14
12:29
(30) по каждой номенклатуре, покажи
32 Крошка Ру
 
08.08.14
12:34
33 RomanYS
 
08.08.14
12:41
(32) да, вариант
Но при наличии 3 полей упорядочивания(дата, ссылка, номер строки) условие соединения будет довольно громозким
34 Крошка Ру
 
08.08.14
12:44
(33) Да это вообще пипец, какой неоптимальный вариант, выполняться будет кучу времени. Он интересен только с чисто теоретической точки зрения. На практике - лично я такой бы не использовал.
35 RomanYS
 
08.08.14
12:46
(32) кстати первый пример из ссылки неправильно отработает ситуацию с одинаковым временем документов
Данный способ удобно применять, когда есть одно поле упорядочивания с уникальными значениями
36 Крошка Ру
 
08.08.14
12:52
(35) И возвращаясь к твоему запросу из (28)... Мне кажется или он выдаст записи только по одному регистратору?
В частности - смущает строка "ВЫБРАТЬ ПЕРВЫЕ 1".
Первые записи по каждой номенклатуре могут ведь и разными регистраторами делаться.
37 RomanYS
 
08.08.14
12:57
(36) корень сути (коррелированного запроса) в

"ГДЕ
                Реализации.Номенклатура = Реал.Номенклатура"

Сам был удивлен, что подобное работает в 1С
38 Крошка Ру
 
08.08.14
13:03
(37) Смотри:

ВЫБРАТЬ ПЕРВЫЕ 1
    Реализации.Ссылка КАК Ссылка
ИЗ
    Реализации КАК Реализации
ГДЕ
    Реализации.Номенклатура = Реал.Номенклатура
УПОРЯДОЧИТЬ ПО
                Реализации.Дата,
                Ссылка,
                Реализации.НомерСтроки


выдаст только 1 ссылку.
Соответственно, условие

ГДЕ
    Реал.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 1...

выполнится только для одного документа.

И итоговый результат будет тоже только по одному документу.
39 Крошка Ру
 
08.08.14
13:05
(38)Ааааа!!! Дошло!
40 RomanYS
 
08.08.14
13:06
(38) "= Реал.Номенклатура" - это поле из внешнего запроса, т.е. для каждой номенклатуры будет свой документ
41 Крошка Ру
 
08.08.14
13:08
(40) Да, понял. Но ведь это не оптимально. Вложенный запрос делается для каждой записи отдельно.
42 RomanYS
 
08.08.14
13:19
(41) хз как это внутри работает, но для таких целей имхо это оптимальней (32)
43 Крошка Ру
 
08.08.14
13:26
(42) Ну хорошо, получили таблицу с номенклатурой и реализацией, где она первый раз за период упоминается.
А в регистре первая запись по номенклатуре может появиться-то с другим регистратором. Или другими.
44 RomanYS
 
08.08.14
13:29
(43) смотри (15)
на мой взгляд постановка задачи несколько странная, зачем такое может быть нужно?
45 Крошка Ру
 
08.08.14
13:37
(44) >> смотри (15)

Так, а если несколько первых записей с разными документами(не реализациями) и одинаковыми датами?

А мне такие задачи попадалась: найти первые приходы за период по номенклатуре из списка, последние расходы и т.д.
46 RomanYS
 
08.08.14
13:48
(45) "Так, а если несколько первых записей с разными документами(не реализациями) и одинаковыми датами?"
вроде нужно найти именно из первых накладных (РТиУ)

"А мне такие задачи попадалась: найти первые приходы за период по номенклатуре из списка, последние расходы и т.д."
странно что из (первой) накладной берутся количественные показатели, а не , например, дата или контрагент
47 Крошка Ру
 
08.08.14
13:58
(46) Не, найти именно первое движение в регистре по номенклатуре, а из реализаций - берется только список номенклатур(почему именно оттуда - вопрос к ТСу).

А у меня была задача: по списку номенклатур, и списку складов найти первые поступления(не только покупка) и последние движения за период. Списки формировались отдельно и в процедуру формирования отчета попадали в готовом виде, в качестве входящих данных. Правда, не было задачи найти только одну первую запись. Если несколько одновременных движений - значит несколько.
48 RomanYS
 
08.08.14
14:06
(47) "Не, найти именно первое движение в регистре по номенклатуре, а из реализаций - берется только список номенклатур(почему именно оттуда - вопрос к ТСу)."
посмотри запрос (0), ТС явно не это имела в виду

Для твоего случая делать тоже самое, но с таблицей регистра
49 olbir
 
08.08.14
15:12
(16) Спасибо!
То что нужно - добавила только в выборке документов условие по датам и МАКСИМУМ на МИНИМУМ заменила
50 EvgeniuXP
 
08.08.14
19:23
(49) по документам никто не шарит - плохая реализация.