Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Выбрать последние записи регистра накопления запросом

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

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

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

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


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

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

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


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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Контрагенты.Ссылка
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ врТЗ КАК врТЗ
        ПО Контрагенты.Ссылка = врТЗ.Контрагент
ГДЕ
    Контрагенты.Печатник <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    И врТЗ.Контрагент ЕСТЬ NULL
   nicxxx
 
43 - 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
                    )
   prilforreal
 
44 - 27.09.18 - 16:01
(42) То же самое, в результате список контрагентов, сработавших в указанном периоде
   s03
 
45 - 27.09.18 - 16:04
(44) точно? временная таблица это контрагенты у которых есть печать, а в результирующем запросе уже как раз их не должно быть
   s03
 
46 - 27.09.18 - 16:09
Условие, заданное в Контрагент.Печатник<>... проверь, плиз, я то по памяти тут пишу, может я там не тот тип указал в сравнении
   prilforreal
 
47 - 27.09.18 - 16:22
(42) Это вложенный запрос, или 2 разных?
   s03
 
48 - 27.09.18 - 16:26
(47) это один запрос со временной таблицей (ну т.е. пакет запросов в первом собирается временная, а во втором используется) и выполняется как одно целое.

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует