Имя: Пароль:
1C
1С v8
Определить актуальность контрагентов посредством запроса
0 Benevalete
 
25.02.15
10:35
Необходимо определить "мертвые души" - контрагенты, по которым уже давно нет движений, либо было единичное в прошлом, либо не было вообще в базе бухгалтерии 1.6. Предлагается в консоли запросов соединить обороты бух регистра(имеющие субконто контрагенты) со справочником, причем по каждому контрагенту вывести три последних регистратора движения для наглядности. Регистратор делаю вложенным запросом, сортирую по дате по убыванию, ругается на вложенный запрос при соединении.

А как бы сделали вы? Возможно есть какой-то другой способ, такое ощущение, что изобретаю велосипед, а истина где-то рядом)
1 Остап Сулейманович
 
25.02.15
10:37
(0) Подход в общем виде правильный. Допиливайте запрос до состояния взлета.
2 butterbean
 
25.02.15
10:38
для отбора последних трёх по каждому контрагенту запрос будет просто чудовищный... оно того не стоит
3 SeraFim
 
25.02.15
10:40
это же разовое. Так что сделай кодом.
Запросом выгребаешь всех, а в коде отсеиваешь по 3.
4 Остап Сулейманович
 
25.02.15
10:41
(3) В запросе вполне можно указать ПЕРВЫЕ 3. И получить профит от неистершихся кнопочек на клавиатуре.
5 butterbean
 
25.02.15
10:43
(4) подумай еще разок над своим предложением
6 Ненавижу 1С
 
гуру
25.02.15
10:51
(5) смотри

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

УПОРЯДОЧИТЬ ПО
    Контрагент,
    Регистратор
АВТОУПОРЯДОЧИВАНИЕ
7 SeraFim
 
25.02.15
10:58
(6) Шайтааан о_О
8 D_E_S_131
 
25.02.15
11:05
(6) А просто выбрать из таблицы продажи с условием по периоду нельзя?
9 Ненавижу 1С
 
гуру
25.02.15
11:05
(8) можно, а как там заюзать ПЕРВЫЕ 3?
10 D_E_S_131
 
25.02.15
11:06
(9) Сортиронуть.
11 Ненавижу 1С
 
гуру
25.02.15
11:08
(10) ну и получишь всего 3 записи, а надо 3 по каждому клиенту
12 D_E_S_131
 
25.02.15
11:14
(11) Я думаю, что запрос в цикле будет работать гораздо быстрее этого чуда в (6).
13 ejikbeznojek
 
25.02.15
11:23
Чёт у меня подобный запрос завис))) (6)
14 D_E_S_131
 
25.02.15
11:26
(13) я предупреждал.
15 ejikbeznojek
 
25.02.15
11:27
ВЫБРАТЬ
    ОстаткиТМЦОбороты.Склад,
    ОстаткиТМЦОбороты.Регистратор
ИЗ
    РегистрНакопления.ОстаткиТМЦ.Обороты(&Дата1, &Дата2, Авто, ) КАК ОстаткиТМЦОбороты
ГДЕ
    ОстаткиТМЦОбороты.Регистратор В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                т1.Регистратор
            ИЗ
                РегистрНакопления.ОстаткиТМЦ.Обороты(&Дата1, &Дата2, Авто, ) КАК т1
            ГДЕ
                т1.Склад = ОстаткиТМЦОбороты.Склад
            УПОРЯДОЧИТЬ ПО
                т1.Регистратор.Дата УБЫВ)


Выполнялось примерно минуту с интервалом дат в 1 день.
С циклом думаю таки быстрее, зато тут красивее
16 Ненавижу 1С
 
гуру
25.02.15
11:27
разово нормуль
17 D_E_S_131
 
25.02.15
11:30
(16) Так "быдлокодерство" на Руси и распространяется...
18 Ненавижу 1С
 
гуру
25.02.15
11:37
(17) истина твоя
19 Benevalete
 
25.02.15
11:44
(2) Результат нужен разово, неважно сколько будет выполняться запрос) (6) В упор не могу найти в бух 1.6 регистр накопления продажи, вы на какой версии? Сделала подобный, но с оборотами регистра бухгалтерии, наложила условие субконто = контрагент, и все по аналогии - вылетело с ошибкой памяти http://prntscr.com/69kcdd (локальная копия базы), на сервере(SQL) че-то страшно пробовать, куча народу сидит( Есть сложности с указанием типа субконто, подскажите пожалуйста как его указать грамотно (платформа 8.1)? Буду пробовать завтра обрабатывать запрос в цикле
(17) Это правильный подход писать грамотный производительный код, но думаю также играет роль приоритет: если задача не приоритетная, не стоит тратить время на ее "причесывание", иначе будет мало времени на более приоритетные вещи имхо
20 тарам пам пам
 
25.02.15
12:10
(15) упорядочивание лучше по периоду делать, а не по дате регистратора - там же составной тип.
21 ejikbeznojek
 
25.02.15
12:30
(20) Вроде чуть быстрее стало.
Но что-то я последнее время стал опасаться вложенные запросы использовать. Всегда можно придумать как сделать, чтобы работало по быстрее.
22 тарам пам пам
 
25.02.15
13:42
(0) можно еще вот так сделать, этот способ был где-то в книге знаний здесь описан:

ВЫБРАТЬ
    ПродажиОбороты.Контрагент,
    ПродажиОбороты.Регистратор,
    ПродажиОбороты.ПериодСекунда
ПОМЕСТИТЬ Обороты
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Обороты.Контрагент КАК Контрагент,
    Обороты.Регистратор,
    Обороты.ПериодСекунда КАК ПериодСекунда,
    КОЛИЧЕСТВО(Обороты1.Регистратор) КАК НомерПоПорядку
ИЗ
    Обороты КАК Обороты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Обороты КАК Обороты1
        ПО Обороты.Контрагент = Обороты1.Контрагент
            И Обороты.ПериодСекунда <= Обороты1.ПериодСекунда

СГРУППИРОВАТЬ ПО
    Обороты.Контрагент,
    Обороты.Регистратор,
    Обороты.ПериодСекунда

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Обороты1.Регистратор) <= 3

УПОРЯДОЧИТЬ ПО
    Контрагент,
    ПериодСекунда
23 тарам пам пам
 
25.02.15
13:50
(22)+ только там не внутреннее соединение должно быть, а левое
24 тарам пам пам
 
25.02.15
13:52
(22)+ и сравнение не <=, а просто "меньше" <
25 ejikbeznojek
 
25.02.15
14:09
(24) Не соглашусь. Как минимум не учитываются регистраторы имеющие одинаковую секунду.
26 ejikbeznojek
 
25.02.15
14:12
(24) Да и в целом что-то тут не то.
27 тарам пам пам
 
25.02.15
14:13
(25) проверил - вместо периода можно сравнивать по моменту времени, тогда нумерация строк в запросе правильная
28 тарам пам пам
 
25.02.15
14:26
(26), проверил сейчас на небольшой базе - работает правильно. Для 5к записей в регистре "Продажи" отрабатывает за ~5 секунд. Для сравнения - результата запроса из (6) я вообще не дождался.

Итоговый запрос получился такой:

ВЫБРАТЬ
    ПродажиОбороты.Контрагент,
    ПродажиОбороты.Регистратор,
    ПродажиОбороты.Регистратор.МоментВремени КАК МоментВремени
ПОМЕСТИТЬ Обороты
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Обороты.Контрагент КАК Контрагент,
    Обороты.Регистратор,
    Обороты.МоментВремени КАК МоментВремени,
    КОЛИЧЕСТВО(Обороты1.Регистратор) КАК НомерПоПорядку
ИЗ
    Обороты КАК Обороты
        ЛЕВОЕ СОЕДИНЕНИЕ Обороты КАК Обороты1
        ПО Обороты.Контрагент = Обороты1.Контрагент
            И Обороты.МоментВремени < Обороты1.МоментВремени

СГРУППИРОВАТЬ ПО
    Обороты.Контрагент,
    Обороты.Регистратор,
    Обороты.МоментВремени

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Обороты1.Регистратор) < 3

УПОРЯДОЧИТЬ ПО
    Контрагент,
    МоментВремени
АВТОУПОРЯДОЧИВАНИЕ
29 Benevalete
 
26.02.15
03:30
(22) (28) Это конечно здорово, но ведь у меня нет регистра продажи!) Бухгалтерия 1.6.8.3. Кто найдет этот регистр в таком же релизе может кинуть в меня тапок
30 Benevalete
 
26.02.15
03:31
Сделала что-то подобное как у Ненавижу 1С  (6) Спасибо кстати за идею! Но выдает пустой результат(

ВЫБРАТЬ
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.Регистратор
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, , , Субконто1 = &контрагенты, , ) КАК ХозрасчетныйОбороты
ГДЕ
    ХозрасчетныйОбороты.Регистратор В
            (ВЫБРАТЬ ПЕРВЫЕ 3
                Т.Регистратор
            ИЗ
                РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, , , Субконто1 = &контрагенты, , ) КАК Т
            ГДЕ
                Т.Субконто1 = ХозрасчетныйОбороты.Субконто1
            УПОРЯДОЧИТЬ ПО
                Т.Регистратор.Дата)

Упорядочить ПО
Субконто1,
регистратор
автоупорядочивание
31 Лодырь
 
26.02.15
04:51
(30) Скажи, а зачем у тебя везде Субконто1 = &контрагенты
32 Benevalete
 
26.02.15
05:08
(31) Так я обозначаю, что речь идет о контрагенте, а не о другом виде субконто, т.к. счет я не ограничиваю(для точности эксперимента), а в некоторых счетах субконто 1 это основные средства, в других статьи ДДС и тд.
&контрагенты = ПВХ.ВидыСубконтоХозрасчетные.Контрагенты

Как иначе отловить движение именно по контрагентам пока не не представляю, может есть идеи?
33 Benevalete
 
26.02.15
05:09
(32) Отловить именнно без помощи регистра продажи, у меня его в конфигураторе нет
34 Лодырь
 
26.02.15
05:21
(32) Ну, и нафига ты сравниваешь значение субконто с типом?
35 VladZ
 
26.02.15
06:17
(0) Я бы делал так: запрос сделал бы по документам. Посмотрел, в каких документах "проходят" контрагенты. Таких документов, на самом деле, не так уж и много. Поступление/реализация (возвраты можно не смотреть - это не активность). Период запроса - последние несколько месяцев. т.е. получаем всех клиентов по данным документам, запихиваем во временную таблицу. Делаем запрос по всем контрагентам, кроме тех, которые во временной таблице.
36 VladZ
 
26.02.15
06:23
ИМХО, делать запросы вида "выбрать обороты за весь период и показать только первые три" считаю неэффективным способом.

По аналогии: привези мне камаз кирпичей. Привез? Молодец! Теперь дай  мне первые три кирпича (все остальные не нужны).
37 Benevalete
 
26.02.15
08:08
(34) Ок, свою ошибку поняла. Значение = справочник контрагенты. Но, прошло уже больше часа, а он так и не выполнился (35) Запрос по документам имеется ввиду Выбрать различные "Регистратор"?
38 samozvanec
 
26.02.15
08:44
(6) представляю, как бы я обрадовался, встретив такой запрос в базе
39 Лодырь
 
26.02.15
08:47
(37) Поверь, нарисованный тобой запрос будет ОЧЕНЬ долго выполнятся.
40 VladZ
 
26.02.15
08:58
(37) Регистратор у регистра. Я говорю про документы.

Выбрать различные
Док.Контрагент как Контрагент
из документ.ПоступлениеТМЦ и т.д.
41 Benevalete
 
26.02.15
09:33
(38) Понимаю вашу радость, но как уже неоднократно было сказано, результат нужен разово. В любом случае тот вариант уже отпал
42 Benevalete
 
26.02.15
09:36
(40) Спасибо, подумаю над этой идеей
43 Ник второй
 
26.02.15
09:38
(6) Не рабочий запрос.
44 тарам пам пам
 
26.02.15
09:58
(29) а в чем сложность сделать аналогичный запрос для регистра бухгалтерии?
45 Benevalete
 
26.02.15
11:46
(44) Я и сделала, читайте выше, но ничего хорошего из это не получилось) Тему можно закрыть