Имя: Пароль:
1C
 
История менеджеров: как соединить запросы?
,
0 BlackJack
 
07.12.22
22:30
Стандартная задача - сделать отчёт по продажам по менеджерам с учётом истории передачи клиентов между менеджерами. Брать данные из документов в данном случае нельзя. Есть периодический регистр сведений.
Не соображу, как оптимально в запросе соединить таблицы самих продаж и истории менеджеров?
1 НафНаф
 
07.12.22
22:36
Сначала построй таблицу периодов менеджеров по клиентам
2 BlackJack
 
07.12.22
22:45
(1) А как оптимально соединить?
3 Asmody
 
07.12.22
22:45
и чем это отличается от типовой задачи "получить курсы валюты на любую дату в запросе"?
4 BlackJack
 
07.12.22
22:48
(3) Наверное тем, что курс есть на каждый день, а менеджеры меняются не так часто?
5 BlackJack
 
07.12.22
22:49
В соединении "=" не поставить на период. Дата продажи д.б. >= даты смены менеджера. Но если менеджер до даты продажи менялся несколько раз, то подтянутся все более ранние записи, а нужна последняя.
6 BlackJack
 
07.12.22
23:31
(3) А не, подходит. Спасибо. Где тут класс?

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Продажи.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
    СУММА(Продажи.СуммаВыручкиРеглОборот - Продажи.СтоимостьРеглОборот - Продажи.ДопРасходыРеглОборот - Продажи.ТрудозатратыРеглОборот - Продажи.ПостатейныеПостоянныеРеглОборот - Продажи.ПостатейныеПеременныеРеглОборот) КАК Прибыль
ПОМЕСТИТЬ Партнеры
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоОтчета, &КонецОтчета, , АналитикаУчетаПоПартнерам.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие) {(АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер = &Менеджер), (АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер.Подразделение = &Подразделение)}) КАК Продажи

СГРУППИРОВАТЬ ПО
    Продажи.АналитикаУчетаПоПартнерам.Партнер

ИНДЕКСИРОВАТЬ ПО
    Партнер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Продажи.Период КАК Период,
    Продажи.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
    СУММА(Продажи.СуммаВыручкиРеглОборот - Продажи.СтоимостьРеглОборот - Продажи.ДопРасходыРеглОборот - Продажи.ТрудозатратыРеглОборот - Продажи.ПостатейныеПостоянныеРеглОборот - Продажи.ПостатейныеПеременныеРеглОборот) КАК Прибыль
ПОМЕСТИТЬ ДниПродаж
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоОтчета, &КонецОтчета, День, АналитикаУчетаПоПартнерам.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие) {(АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер = &Менеджер), (АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер.Подразделение = &Подразделение)}) КАК Продажи

СГРУППИРОВАТЬ ПО
    Продажи.Период,
    Продажи.АналитикаУчетаПоПартнерам.Партнер

ИНДЕКСИРОВАТЬ ПО
    Партнер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    НАЧАЛОПЕРИОДА(&НачалоОтчета, ДЕНЬ) КАК Период,
    ИсторияМенеджеровСрезПервых.Партнер КАК Партнер,
    ИсторияМенеджеровСрезПервых.Менеджер КАК Менеджер
ПОМЕСТИТЬ МенеджерыПоДням
ИЗ
    РегистрСведений.ИсторияМенеджеров.СрезПервых(
            &НачалоОтчета,
            Партнер В
                (ВЫБРАТЬ
                    Партнеры.Партнер
                ИЗ
                    Партнеры)) КАК ИсторияМенеджеровСрезПервых

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ИсторияМенеджеров.Период,
    ИсторияМенеджеров.Партнер,
    ИсторияМенеджеров.Менеджер
ИЗ
    РегистрСведений.ИсторияМенеджеров КАК ИсторияМенеджеров
ГДЕ
    ИсторияМенеджеров.Период МЕЖДУ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоОтчета, ДЕНЬ, 1), ДЕНЬ) И &КонецОтчета
    И ИсторияМенеджеров.Партнер В
            (ВЫБРАТЬ
                Партнеры.Партнер
            ИЗ
                Партнеры)

ИНДЕКСИРОВАТЬ ПО
    Партнер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДниПродаж.Период КАК Период,
    ДниПродаж.Партнер КАК Партнер,
    МАКСИМУМ(МенеджерыПоДням.Период) КАК ДатаМена
ПОМЕСТИТЬ ХешМен
ИЗ
    ДниПродаж КАК ДниПродаж
        ЛЕВОЕ СОЕДИНЕНИЕ МенеджерыПоДням КАК МенеджерыПоДням
        ПО ДниПродаж.Период >= МенеджерыПоДням.Период
            И ДниПродаж.Партнер = МенеджерыПоДням.Партнер

СГРУППИРОВАТЬ ПО
    ДниПродаж.Период,
    ДниПродаж.Партнер

ИНДЕКСИРОВАТЬ ПО
    Партнер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    МенеджерыПоДням.Менеджер КАК Менеджер,
    СУММА(Продажи.СуммаВыручкиРеглОборот - Продажи.СтоимостьРеглОборот - Продажи.ДопРасходыРеглОборот - Продажи.ТрудозатратыРеглОборот - Продажи.ПостатейныеПостоянныеРеглОборот - Продажи.ПостатейныеПеременныеРеглОборот) КАК Прибыль
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоОтчета, &КонецОтчета, День, АналитикаУчетаПоПартнерам.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие) {(АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер = &Менеджер), (АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер.Подразделение = &Подразделение)}) КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ ХешМен КАК ХешМен
            ЛЕВОЕ СОЕДИНЕНИЕ МенеджерыПоДням КАК МенеджерыПоДням
            ПО ХешМен.Партнер = МенеджерыПоДням.Партнер
                И ХешМен.ДатаМена = МенеджерыПоДням.Период
        ПО Продажи.Период = ХешМен.Период
            И Продажи.АналитикаУчетаПоПартнерам.Партнер = ХешМен.Партнер

СГРУППИРОВАТЬ ПО
    МенеджерыПоДням.Менеджер
7 BlackJack
 
08.12.22
15:56
Ошибка: СрезПоследних, а не СрезПервых
8 Said_We
 
08.12.22
16:25
(4) "Наверное тем, что курс есть на каждый день, а менеджеры меняются не так часто?" - ничем не отличается. Курсы валют в выходные тоже не меняются. :-)
9 Said_We
 
08.12.22
16:28
(0) Так же получаешь таблицу с периодами изменения менеджера для каждого клиента и потом продажи цепляешь продажи по равенству контрагента и вхождение в период.
10 mikecool
 
08.12.22
18:16
странно, что из документа брать нельзя - в документе и должна быть актуальная информация
11 Said_We
 
08.12.22
18:41
(10) Может он ещё и что-то из регистра тянет, чего в документе нет. Себестоимость какую-нибудь. Правда не понятно зачем, но системы мотивации бывают разные. :-)
12 BlackJack
 
08.12.22
23:04
(10) Документы делают другие пользователи.
13 НафНаф
 
09.12.22
07:37
(12) Менеджер в документе мог бы подставляться из значения текущий менеджер у клиента
14 Kigo_Kigo
 
09.12.22
08:51
Что то мне кажется на СКД этот отчет взлетит без особых усилий, а в жоках продаж есть менеджер?
15 Kigo_Kigo
 
09.12.22
10:05
жоках =*доках
16 Said_We
 
09.12.22
10:21
(14) А что есть какая-то принципиальная разница где запрос писать в СКД или в консоли?
Запрос как источник данных для СКД всё равно должен сделать всё что описано в (9).
17 Kigo_Kigo
 
09.12.22
10:27
(16) СКД или консол, без разница, скд сама группировки наложит
18 Said_We
 
09.12.22
11:17
(17) При чём тут группировки?
19 Said_We
 
09.12.22
11:58
(6) "ПОМЕСТИТЬ Партнеры" и "ПОМЕСТИТЬ ДниПродаж" - данные берутся из одной таблицы. Не понятно зачем брать практически одни и те же данные два раза.
Тем более, что "Партнеры" используется только как фильтр на партнеров и сумма выручки не используется. Можно и так "(выбрать различные Партнер из ДниПродаж)".

Из регистра "ИсторияМенеджеров" необходимо построить таблицу изменений: Партнер, Менеджер, ДатаН, ДатаК.
И к ней уже обороты цеплять.
20 Said_We
 
09.12.22
12:01
К (19) Но я бы обороты по дням не создавал и не использовал. Брал бы из движений. Нет смысла разбивать по дням, что бы потом разбитое по дням цеплять к разбитому на периоды. Я бы цеплял к разбитому на периоды непосредственно движения.
21 BlackJack
 
09.12.22
13:41
(19) Это был первый набросок, я потом всё переделал. Вообще убрал этот отбор по партнёру и из виртуальной таблицы убрал отбор по менеджеру/подразделению, т.к. он не соблюдает историю менеджеров.
22 Said_We
 
09.12.22
13:48
(21) "ИсторияМенеджеров" у тебя нет фильтра по менеджерам и не должно быть. А виртуальную таблицу можно вообще не использовать. Она не нужна.
Лучше один раз результат свернуть, чем свернуть в виртуальной таблице, а потом ещё раз до свернуть.
23 BlackJack
 
09.12.22
13:48
(13) Вариант, но тогда:
1. нет информации, кто создал документ (если не лезть в лог)
2. поле доступно для произвольного изменения
3. в отчёте нужна будет детализация до регистратора
4. это сложнее, чем докрутить запрос (но это не точно)
24 BlackJack
 
09.12.22
13:51
(20) Таблица дней нужна, чтобы подготовить таблицу соответствия - по какому дню продажи какую дату менеджера брать. Изначально мой вопрос об этом и был - можно ли как-то соединить "на лету" без предварительной подготовки доп.таблицы.
25 Kesim
 
09.12.22
14:04
(24) первый вариант таблица дней = график работы в связке с таблицей менеджеров

второй вариант Получаешь всех менеджеров с датой начала работы меньше даты продажи(или с датой окончания работы больше даты продажи), потом берешь максимум по дате менеджера, потом по этому максимуму соединяешься с таблицей менеджеров

с любом случае без доб таблиц не обойдешься.

а чтобы было красиво в момент проведения надо получать тек менеджера и записывать его в регистр по  документу, тогда будет налету
26 Said_We
 
09.12.22
15:10
(24) В 1С запросах нет. Только соединение таблицы сама с собой. SQL в 1С сильно обрезан. Можно сказать по самые не хочу.

В MS SQL, Oracle, PostgreSQL, My SQL, SQLlite и т.д.  можно "на лету" без предварительной подготовки доп.таблицы.
27 Мультук
 
гуру
09.12.22
16:23
(0)

1) Добавляем в нужный документ реквизит "ТотСамыйПравильныйМенеджер"
2) Пишем алгоритм заполнения, чтобы дальше автоматом
3) Пишем обработку, которая заполнит в старых документах этот реквизит
Тут можно писать любой говнокод (запросы в цикле и прочее) --всё равно это один раз заполнить.

P.S.
Но что-то мне подсказывает, что вы (ваше предприятия) всё-равно будете всё это считать в отчёте
28 Said_We
 
09.12.22
18:13
(27) Скорее всего не важно кто продал, а важно за кем числится данный клиент.
Запрос в отчете, который всё это разобьет будет быстро выполняться. Поэтому совать в данные и заставлять каждый раз заполнять не имеет смысла. Тем более что тот кто оформляет документы, может быть совсем не тем менеджером и документы могут приходить с В2В, т.е. оформляться автоматически, а менеджера менять задним числом.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.