Имя: Пароль:
1C
1С v8
Выбрать последние записи регистра накопления запросом
,
0 prilforreal
 
27.09.18
11:02
Доброе утро! 1с 8.3, конфа самописная. Подскажите, как получить последнюю запись в регистре накопления по каждому контрагенту?
1 s03
 
27.09.18
11:04
масимум по периоду, затем соединение по полученному максимуму
2 RomanYS
 
27.09.18
11:07
(1)
+затем макс по регистратору, затем соединение,
затем макс по номеру строки, затем соединение,
и вот она последняя Запись!

Можно еще коррелированный запрос
3 prilforreal
 
27.09.18
11:08
(1) С документом так получалось, с регистром испытываю затруднение
4 nicxxx
 
27.09.18
11:09
(2) "Можно еще коррелированный запрос", которых нет в 1С
5 Джинн
 
27.09.18
11:13
"Регистр накопления" и "последняя запись" - термины мало совместимые.
6 prilforreal
 
27.09.18
11:14
(5) Последнее движение в регистре
7 Buster007
 
27.09.18
11:15
(4) хм, лень смотреть в план, но по описанию текста запроса в 1С, то он на все 100 коррелированный
8 Buster007
 
27.09.18
11:16
(4) на основании чего ты утверждаешь так?
9 s03
 
27.09.18
11:16
(3) и то и другое обычные таблицы, никакой разницы
10 Джинн
 
27.09.18
11:18
(6) Если это регистр накопления, то он по определению агрегирует данные. В этом его смысл. А "последнее движение" - штука очень размытая. Что за задача вообще?
11 Гипервизор
 
27.09.18
11:21
(10) Последняя закупка или продажа поди)
12 prilforreal
 
27.09.18
11:22
(10) Написать обработку, которая пробегает по регистру и проверяет когда последний раз контрагент заказывал фотопечать, если прошло > 3х месяцев в карточке контрагента сбрасывает поле ОтветственныйДизайнер. (11) Так точно)
13 prilforreal
 
27.09.18
11:22
(11) На то и Гипервизор =)
14 Джинн
 
27.09.18
11:24
(12) Тю! Таблица оборотов Вам в помощь.
15 s03
 
27.09.18
11:29
(12) берешь контрагентов с установленным ответственным дизайнером, соединяешь (левым) с оборотами за 3 последних месяца с условием по наличию фотопечати, обрабатываешь результат если из соединения у тебя null
16 Serg_1960
 
27.09.18
11:31
Не  совсем то, что надо - как выбрать 1 документ поступления по каждой номенклатуре , но надеюсь пнул автора в нужном направлении :)
17 prilforreal
 
27.09.18
11:40
(14) Спасибо, через обороты и хотел делать. (15) Хочется сделать через максимум, выгрести последние движения и если они старше 3х месяцев убирать ответственного.
18 bolobol
 
27.09.18
11:48
(17) Ну тут нужно определиться, через обороты хотел или через максимум. Но люди, совсем не глупые, советуют решать задачу правильным способом.
19 prilforreal
 
27.09.18
11:54
(18) А разве нельзя обороты с МАКСИМУМ Регистратор.Дата соединить, а после условие поставить на проверку даты?
20 bolobol
 
27.09.18
11:56
(19) Можно. Только если в заданном периоде будет оборот, то смысл искать последнее в нём? А если оборота не будет, то и последнего не найдётся.
21 prilforreal
 
27.09.18
11:56
(15) А можно же и все последние записи выгрести каждого с условием по фотопечати? Просто как обработать  если из соединения null не совсем понимаю..
22 bolobol
 
27.09.18
11:57
Таким образом, последующую проверку даты уже будет не к чему применить.
23 bolobol
 
27.09.18
11:58
(21) Об этом вам в (1) ответили. Но это другая, какая-то более широкая задача.
24 bolobol
 
27.09.18
11:59
И тяжёлая для системы.
25 s03
 
27.09.18
12:07
(21) обороты возьми с периодичностью день, вытаскиваешь период (максимум), это соединяешь с твоими контрагентами и в конечном итоге условие где период есть null
26 prilforreal
 
27.09.18
12:48
(25) Таким образом у меня в выборке будут контрагенты, которые в этот день не заказывали фотопечать?
27 s03
 
27.09.18
13:03
(26) таким образом ты можешь получить контрагентов у которых установлен ответственный дизайнер, но у которых не было заказа печати за последние 3 месяца, что и требуется по твоему условию
28 prilforreal
 
27.09.18
13:13
(27) Высыпает всех контрагентов такой запрос...

"ВЫБРАТЬ
        |    Контрагент.Ссылка КАК Контрагент,
        |    ВЫБОР
        |        КОГДА МАКСИМУМ(ПотолкиОбороты.Период) ЕСТЬ NULL
        |            ТОГДА 0
        |    КОНЕЦ КАК Период
        |ИЗ
        |    РегистрНакопления.Потолки.Обороты(, , Месяц, ) КАК ПотолкиОбороты
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагент КАК Контрагент
        |        ПО ПотолкиОбороты.Заказчик = Контрагент.Ссылка
        |ГДЕ
        |    ПотолкиОбороты.КолФотоПечать > 0
        |
        |СГРУППИРОВАТЬ ПО
        |    Контрагент.Ссылка
        |
        |УПОРЯДОЧИТЬ ПО
        |    Период,
        |    Контрагент";
29 s03
 
27.09.18
13:23
(28) возьми контрагентов с условием по заполненному дизайнеру, левым соединением обороты (соединение по контрагенту) за период 3 месяца с периодичностью день и максимум по периоду с группировкой по контрагентам
30 s03
 
27.09.18
13:24
т.е. всё то же самое, что ещё в (15) было написано
31 s03
 
27.09.18
13:26
Взяв обороты за весь период (без начала и конца периода) ты получишь дату последнего заказа, а если взять только за последние 3 месяца, то проверку более старших уже делать не надо, зачем знать что дата заказа была полгода назад, если это можно сразу отсечь при выборке
32 prilforreal
 
27.09.18
13:57
(31) Верно, нужно взять за 3 месяца только тех контрагентов, которые не совершали заказов и у которых заполнено поле печатник.
33 prilforreal
 
27.09.18
13:58
(31) Не получается все равно, ручки кривоваты((

НачДата=(ТекущаяДата()-7776000);
    КонДата=ТекущаяДата();
    ПустаяСсылка=Справочники.Контрагент.ПустаяСсылка();
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    МАКСИМУМ(ПотолкиОбороты.Период) КАК Период,
        |    Контрагент.Ссылка КАК Контрагент
        |ИЗ
        |    РегистрНакопления.Потолки.Обороты(, , День, ) КАК ПотолкиОбороты
        |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагент КАК Контрагент
        |        ПО ПотолкиОбороты.Заказчик = Контрагент.Ссылка
        |ГДЕ
        |    ПотолкиОбороты.КолФотоПечать > 0
        |    И ПотолкиОбороты.Период ЕСТЬ NULL
        |    И Контрагент.Печатник <> &ПустаяСсылка
        |    И ПотолкиОбороты.Период МЕЖДУ &НачДата И &КонДата
        |
        |СГРУППИРОВАТЬ ПО
        |    Контрагент.Ссылка
        |
        |УПОРЯДОЧИТЬ ПО
        |    Период";
        Запрос.УстановитьПараметр("НачДата",НачДата);
        Запрос.УстановитьПараметр("КонДата",КонецДня(КонДата));
        Запрос.УстановитьПараметр("ПустаяСсылка",ПустаяСсылка);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Сообщить(ВыборкаДетальныеЗаписи.Контрагент);
        Сообщить(ВыборкаДетальныеЗаписи.Период);
    КонецЦикла;


Пустой результат
34 s03
 
27.09.18
14:10
Выбрать
    Контрагент.Ссылка,
    МАКСИМУМ(ПотолкиОбороты.Период) КАК Период
ИЗ Справочник.Контрагенты КАК Контрагенты
    Левое Соединение РегистрНакопления.ПотолкиОбороты(&НачДата, &КонДата, ДЕНЬ) КАК ПотолкиОбороты
    ПО Контрагент.Ссылка = ПотолкиОбороты.Контрагент
ГДЕ
    Контрагент.Печатник<>&ПустаяСсылка
СГРУППИРОВАТЬ ПО
    Контрагент.Ссылка

Посмотри результат такого запроса, те строки, где период не будет указан это твои контрагенты, которым надо убрать дизайнера
(я запрос писал руками здесь, на форуме, поэтому проверь его орфографию)
35 s03
 
27.09.18
14:11
ну и условие по заказу печати ещё добавить надо
36 prilforreal
 
27.09.18
14:57
(34) Замечательно! Как вы и сказали, Таким запросом сначала высыпется список контрагентов, которым необходимо убрать ответственного, после контрагенты с периодом менее 3х месяцев.
37 s03
 
27.09.18
15:08
(36) можешь добавить условие ПотолкиОбороты.Период Есть NULL и тогда контрагентов с периодом менее 3-х месяцев тоже отсеешь. В общем смысл не искать дату последней операции по контрагенту, а какие отборы/условия будешь добавлять уже сам играйся
38 prilforreal
 
27.09.18
15:22
(37) Только вот при условии
ПотолкиОбороты.КолФотоПечать > 0
В результате ничего нет
39 prilforreal
 
27.09.18
15:25
(37) Точнее есть только те, у кого заказы были, а с условием ПотолкиОбороты.Период Есть NULL они естественно пропадают
40 s03
 
27.09.18
15:30
(39) угу, потому что одновременно и Количество>0 и Период есть NULL не может быть. Поэтому или сначала запрос по оборотам во временную таблицу (с отбором по количеству>0) и последующее уже соединение с контрагентами или не делать отбор по период есть null, а проверять это при обходе результата запроса
41 prilforreal
 
27.09.18
15:32
(40) Так я убрал условие Период есть NULL, и все равно в результате только те кого нужно оставить

"ВЫБРАТЬ
    |    Контрагент.Ссылка,
    |    МАКСИМУМ(ПотолкиОбороты.Период) КАК Период
    |ИЗ
    |    Справочник.Контрагент КАК Контрагент
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Потолки.Обороты(&НачДата, &КонДата, ДЕНЬ, ) КАК ПотолкиОбороты
    |        ПО Контрагент.Ссылка = ПотолкиОбороты.Заказчик
    |ГДЕ
    |    Контрагент.Печатник <> &ПустаяСсылка
    |    И ПотолкиОбороты.КолФотоПечать <> 0
    |
    |СГРУППИРОВАТЬ ПО
    |    Контрагент.Ссылка
    |
    |УПОРЯДОЧИТЬ ПО
    |    Период";
42 s03
 
27.09.18
15:46
А если так?


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПотолкиОбороты.Контрагент
ПОМЕСТИТЬ врТЗ
ИЗ
    РегистрНакопления.Потолки.Обороты(&НачДата, &КонДата, , ) КАК ПотолкиОбороты
ГДЕ
    ПотолкиОбороты.КолФотоПечать <> 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Контрагенты.Ссылка
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ
        ПО Контрагенты.Ссылка = врТЗ.Контрагент
ГДЕ
    Контрагенты.Печатник <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    И врТЗ.Контрагент ЕСТЬ NULL
43 nicxxx
 
27.09.18
15:57
(8)  drop table t1
drop table t2

create table t1 (f1 nvarchar, f2 int)
create table t2 (f1 nvarchar, f2 int)

insert into t1 values (1,2),(2,3),(3,4),(3,5)
insert into t2 values (1,7),(2,3),(3,4)

select
    t1.f1
    ,sum(t1.f2)    
from
    t1
group by
    t1.f1
having
    sum(t1.f2) >    (
                    SELECT avg(t2.f2)
                    FROM t2
                    where t2.f1 = t1.f1
                    )

А теперь на 1С

выбрать
1 как f1
,2 как f2
поместить t1
Union all
выбрать
2,
3
Union all
выбрать
3,
4
Union all
выбрать
3,
5
;
выбрать
1 как f1
,7 как f2
поместить t2
Union all
выбрать
2,
3
Union all
выбрать
3,
4
;
select
    t1.f1
    ,sum(t1.f2)    
from
    t1
group by
    t1.f1
having
    sum(t1.f2) >    (
                    ВЫБРАТЬ среднее(t2.f2)
                    ИЗ t2
                    ГДЕ t2.f1 = t1.f1
                    )
44 prilforreal
 
27.09.18
16:01
(42) То же самое, в результате список контрагентов, сработавших в указанном периоде
45 s03
 
27.09.18
16:04
(44) точно? временная таблица это контрагенты у которых есть печать, а в результирующем запросе уже как раз их не должно быть
46 s03
 
27.09.18
16:09
Условие, заданное в Контрагент.Печатник<>... проверь, плиз, я то по памяти тут пишу, может я там не тот тип указал в сравнении
47 prilforreal
 
27.09.18
16:22
(42) Это вложенный запрос, или 2 разных?
48 s03
 
27.09.18
16:26
(47) это один запрос со временной таблицей (ну т.е. пакет запросов в первом собирается временная, а во втором используется) и выполняется как одно целое.

смоделировал, создал пару справочников, документ, регистр, - работает
49 prilforreal
 
27.09.18
17:00
(48) Спасибо огромное, Плюсище к карме!) Сделал как вы говорили пакетом запросов, на выходе список контрагентов, сработавших последний раз больше 3х месяцев назад.

    НачДата=(ТекущаяДата()-7776000);
    КонДата=ТекущаяДата();
    ПустаяСсылка=Справочники.Контрагент.ПустаяСсылка();
    Запрос = Новый Запрос;
    Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ПотолкиОбороты.Заказчик
|ПОМЕСТИТЬ врТЗ
|ИЗ
|    РегистрНакопления.Потолки.Обороты(&НачДата, &КонДата, , ) КАК ПотолкиОбороты
|ГДЕ
|    ПотолкиОбороты.КолФотоПечать <> 0
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Контрагент.Ссылка КАК Ссылка
|ИЗ
|    Справочник.Контрагент КАК Контрагент
|        ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ
|        ПО Контрагент.Ссылка = врТЗ.Заказчик
|ГДЕ
|    Контрагент.Печатник <> ЗНАЧЕНИЕ(Справочник.Контрагент.ПустаяСсылка)
|    И врТЗ.Заказчик ЕСТЬ NULL
|
|УПОРЯДОЧИТЬ ПО
|    Ссылка";
    
        Запрос.УстановитьПараметр("НачДата",НачДата);
        Запрос.УстановитьПараметр("КонДата",КонецДня(КонДата));
        Запрос.УстановитьПараметр("ПустаяСсылка",ПустаяСсылка);
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Сообщить(ВыборкаДетальныеЗаписи.Ссылка);
    КонецЦикла;
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой