Имя: Пароль:
1C
1С v8
Помогите с решением задачи (грамотная рассылка адресатам)
0 AneJIbcuH
 
02.06.18
11:39
Добрый день! Прошу накидать идей, как грамотно решить такую задачу (не хотелось бы "влоб").

Есть регистр сведений, с измерениями: Подразделение, ЭлектроннаяПочта.
Для каждого подразделения собирается выручка, необходимо её разослать.

1. Если в регистре подразделение не заполнено, значит на этот электронный адрес отправляем выручку по всем подразделениям.

2. Если заполнены подразделения, то выручка только по выбранным.

3. Может быть такой момент, что в регистре подразделение не заполнено, и ниже строка, где заполнено. В этом случае срабатывает пункт 1.

Проблема в чем. Выручка собирается в табличный документ. Как говорил, решение "влоб", для каждого электронного адреса собирать свой табличный документ (с доступными подразделениями) и отправлять на эл. адрес.
Но если, у некоторых электронных адресов одинаковый набор подразделений, хотелось бы сформировать один табдок и отправить сразу на эти эл. адреса.
Кто и как эффективно бы решил такую задачу?
Кручу, верчу в голове.. запрос красивый не очень срастается.. Для каждого электронного адреса собрать массив подразделений, а потом эти массивы сравнивать, как-то вообще ерундово..
Вообщем всё сводится к тому, как дать программе понять, что в регистре есть электронные адреса, с одинаковым набором подразделений.
1 Cyberhawk
 
02.06.18
11:43
Запросом получаешт таблицу из двух колонок "Подразделение - Сумма", в чем дальше-то проблема?
2 Cyberhawk
 
02.06.18
11:44
Добавь в запросе третью колонку "МИНИМУМ(АдресЭП)"
3 Cyberhawk
 
02.06.18
11:45
И перед этим построй соответствие адресов ЭП и подразделений
4 Cyberhawk
 
02.06.18
11:45
(с учетом твоего пункта 3)
5 Cyberhawk
 
02.06.18
11:46
В конечном запросе итоги по адресу ЭП
6 Cyberhawk
 
02.06.18
11:48
Альтернативный вариант, если хочешь оптимизации - строишь таблицу соответствия "набор подразделений" - "набор адресов ЭП"
7 Злопчинский
 
02.06.18
11:53
Правильно (в рамках постановки задачи) организовать "процесс так" чтобы пункт 3 убрать из постановки задачи.
8 RomanYS
 
02.06.18
11:58
(0) Итоги по адресам, внутри сортировка по подразделению. Если первое подразделение пустое - формируем по всем и Прервать, иначе - собираем подразделения в массив - формируем отчет по массиву.
Формирование отчета можно оптимизировать, предварительно собрав нужное во временные таблицы или источник данных и построитель
9 AneJIbcuH
 
02.06.18
11:58
(6)  "таблицу соответствия "набор подразделений" - "набор адресов ЭП""
Вот, как её эффективно построить.
10 AneJIbcuH
 
02.06.18
12:02
(8) "Итоги по адресам, внутри сортировка по подразделению. Если первое подразделение пустое - формируем по всем и Прервать, иначе - собираем подразделения в массив - формируем отчет по массиву. "

Вот так прям сейчас работает. Вопрос как раз в том, что например, по определенному массиву подразделений, уже строился отчет и снова строить надо. Искать массивы с одинаковым набором подразделений каждый раз, не рационально.
11 RomanYS
 
02.06.18
12:03
(10) посчитай хеш от массива и сохраняй соответствие хеш-результат(табдок)
12 RomanYS
 
02.06.18
12:05
(11) можно даже придумать хеш чтобы в запросе считать, тогда можно итог по нему сделать
13 RomanYS
 
02.06.18
12:11
(10) кстати сколько сейчас занимает эта процедура, что ты собрался её оптимизировать?
Можно позавидовать такой выручке, что для её отправки нужная столь красивая оптимизация))
14 AneJIbcuH
 
02.06.18
12:14
(13) Наверное, больше для себя алгоритм интересен ))
15 RomanYS
 
02.06.18
12:16
+(12) самый простой вариант:
нумеруем подразделения,
за хеш подразделения берем 2^N, где N - номер (или индекс),
в запросе берем сумму это хеша - получаем хеш массива.

На каждые 10 подразделений - нужно 3 десятичных знака, так что разрядности 1с должно хватить на 50+ подразделений.
16 RomanYS
 
02.06.18
12:18
+(15) пустые придется обработать заранее и исключить по ним адреса
17 AneJIbcuH
 
02.06.18
12:20
(15) Идею я понял. Она более менее подходит для решения момента "уже строился отчет и снова строить .."
Но тут всё равно, для каждого Адреса ЭП отправляется письмо. А лучше в одном письме сразу необходимые адреса.
18 RomanYS
 
02.06.18
12:24
(17) так верхний итог делаешь по хешу и вуаля у тебя набор адресов с с одинаковым набором подразделений. Даже сохранять ТД не придется.

Можно проще: держать письма в  соответствии/структуре добавляя адреса. Потом всё отправлять
19 SweetaAngel
 
02.06.18
12:52
(0)

Добавить два соответствия
соотНачалоОбластиПодраздлеения(
соотКонецОбластиПодраздлеения(

Вывести отчет по всем подразделениям.

При выводе области подраздлеения пишим
соотНачалоОбластиПодраздлеения.Вставить(ВыборкаПодразделение.Подраздление, ТабДок.ВысотаТаблицы)
ТабДок.Вывести(ОбластьПодраздленеие)
ДелальныеЗаписи = ВыборкаПодразделение.Выбрать(...
....
...
соотКонецОбластиПодраздлеения.Вставить(ВыборкаПодразделение.Подраздление, ТабДок.ВысотаТаблицы)

Дальше перебираем электронные адреса и их подразделения.

Выбирая данные из соответсвий и ТабДок клеим новый табДок по частям.
20 RomanYS
 
02.06.18
13:03
После (14) вопрос больше теоретический.
(19) а если подразделение не является верхним уровнем группировки?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой