|
История менеджеров: как соединить запросы? | ☑ | ||
---|---|---|---|---|
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В, т.е. оформляться автоматически, а менеджера менять задним числом. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |