|
Таблица Значений, отбор по Подразделению | ☑ | ||
---|---|---|---|---|
0
Айвонттубифри
12.03.20
✎
20:13
|
Есть таблица значений, содержащая ФИО, Подразделение:
Иванов, Продажи Петров, Закупка Сидоров, Ремонт Кузнецов, Закупка Мне надо обработать эту таблицу значений таким образом, чтобы разложить сотрудников по подразделениям и затем по каждому подразделению сформировать отдельное письмо, вот так: Письмо1: Иванов, Продажи Письмо2: Петров, Закупка и Кузнецов, Закупка Письмо3: Сидоров, Ремонт А мой код, формирует столько писем, сколько сотрудников в отборе, что неверно: Письмо1: Иванов, Продажи Письмо2: Петров, Закупка и Кузнецов, Закупка Письмо3: Петров, Закупка и Кузнецов, Закупка Письмо4: Сидоров, Ремонт Процедура ПодготовитьПисьмоРуководителю(ТЗ1, ТЗ2) //ТЗ1 и ТЗ2 - идентичные таблицы значений мОтобранныеСтроки = Новый Массив; ТекПодразделение = ""; Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл ТекПодразделение = СтрокаТЗ.ТекущееПодразделение; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение); СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала); мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора); ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); мОтобранныеСтроки.Очистить(); КонецЦикла; КонецПроцедуры |
|||
1
Айвонттубифри
12.03.20
✎
20:14
|
+(0) Код некрасиво вставился, дублирую:
Процедура ПодготовитьПисьмоРуководителю(ТЗ1, ТЗ2) //ТЗ1 и ТЗ2 - идентичные таблицы значений мОтобранныеСтроки = Новый Массив; ТекПодразделение = ""; Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл ТекПодразделение = СтрокаТЗ.ТекущееПодразделение; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение); СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала); мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора); ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); мОтобранныеСтроки.Очистить(); КонецЦикла; КонецПроцедуры |
|||
2
Злопчинский
12.03.20
✎
20:21
|
А где в коде что-то похожее на "разложить сотрудников по подразделениям" - ткни меня носом, пожалуйста...
|
|||
3
Злопчинский
12.03.20
✎
20:22
|
даже еще упрощу тебе вопрос:
где в коде "по подразделениями"...? |
|||
4
ReaLg
12.03.20
✎
20:23
|
Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл
... ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); ... Писем отправится столько, сколько строк в ТЗ1 |
|||
5
Злопчинский
12.03.20
✎
20:24
|
ты ж что - культ карго проповедуешь?
комп он тупой. вот и ты - сделай себя тупым и верифицируй код, выполняя его ТУПО как тупой механизм, не внедряя в верификацию "выполнения кода" свои ожидания/хотелки/смутныенадеждывдругоносамо - выполняй код построчно.. записывай на бумажке состояние тових данных после исполнения каждой строчки... |
|||
6
Злопчинский
12.03.20
✎
20:25
|
(4) ну вот нахрена ты это ;-)
дал рыбу человеку... а я ему удочку хотел дать... |
|||
7
ReaLg
12.03.20
✎
20:26
|
В постановке задачи ничего про дату начала не сказано, так что хз что там у тебя отберется :))
А вообще - получаешь список подразделений, потом цикл по этому списку с НайтиСтроки, формированием и отправкой письма. Цикл должен быть по списку подразделений именно. Его можно получить методом Свернуть(...), например, копии ТЗ. |
|||
8
ReaLg
12.03.20
✎
20:27
|
(6) Это удочка :)) Я ж код не написал :)) Просто показал, что 1Ска все делает как и просят ее :))
|
|||
9
Айвонттубифри
12.03.20
✎
20:27
|
(2) Я делаю отбор по подразделению и полученный отбор с нужным мне подразделением и сотрудниками помещаю в массив (мОтобранныеСтроки):
ТекПодразделение = СтрокаТЗ.ТекущееПодразделение; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение); мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора); |
|||
10
Айвонттубифри
12.03.20
✎
20:28
|
(4) Писем отправится столько, сколько строк в ТЗ1. Все верно! Вот как мне это в коде исправить?
|
|||
11
ReaLg
12.03.20
✎
20:29
|
(9) Ну... А цикл у тебя по найденным строкам или нет?
|
|||
12
Айвонттубифри
12.03.20
✎
20:30
|
(11) В отладчике, в мОтобранныеСтроки уже установлен нужный мне отбор. А вот дальше как?
|
|||
13
ReaLg
12.03.20
✎
20:30
|
Цикл должен быть не по ТЗ1. А по списку с подразделениями, в котором каждое подразделение встречается один раз. Проще всего такой список получить сверткой копии твоей первоначальной ТЗ.
|
|||
14
Айвонттубифри
12.03.20
✎
20:31
|
(7) Дату не смотрите, ее там нет, забыла убрать строчку СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала);
|
|||
15
ReaLg
12.03.20
✎
20:32
|
(12) не важно на данный момент что у тебя в мОтобранныеСтроки. Ты отправляешь письма нв цикле по ТЗ1. Это неверно.
|
|||
16
ReaLg
12.03.20
✎
20:32
|
нв цикле = в цикле
|
|||
17
Айвонттубифри
12.03.20
✎
20:32
|
(7), (13) я примерно так себе и представляла. А у вас есть пример, чтобы я подобно сделала?
|
|||
18
ReaLg
12.03.20
✎
20:38
|
(17) Хех... А вот теперь ты просишь рыбу а не удочку :))
Я не знаю, зачем тебе две ТЗ, поэтому предположим, что есть ТЗ1, в которой есть сотрудник и подразделение. Шаги: Делаешь копию ТЗ1//Назовем ее ТЗПодразделения Сворачиваешь копию по подразделению //В этот момент у тебя в ТЗПодразделения будут все подразделения без повторений Делаешь цикл по ТЗПодразделения в цикле по ТЗПодразделения ищешь методом НайтиСтроки в ТЗ1 строки с текущим подразделением. Делаешь цикл по НайденнымСтрокам Формируешь письмо (я не знаю, что там должно быть, ну,например, в строку плюсуешь всех сотрудников) Цикл по НайденнымСтрокам заканчивается Отправляешь письмо //!!Здесь ты уже опять в цикле по ТЗПодразделения Как то так :)) |
|||
19
Злопчинский
12.03.20
✎
21:05
|
(9) "Я делаю отбор по подразделению"
вопрос. ТУПОЙ. ты должен как программист сам уметь задавать себе ВОПРОСЫ (правильные! это сложно, но с опытом придет) - и давать правильные ответы. Не те ответы, которые у тебя в башке вертятяс и уже висят на языке.а - ПРАВИЛЬНЫЕ. . "по подразделению" - по какому? откуда берется это "подразделение"..? |
|||
20
Злопчинский
12.03.20
✎
21:05
|
ну, в (18) уже и рыбку пожарили
|
|||
21
Mihasya
12.03.20
✎
23:41
|
// свернуть нужно ТЗ...
Процедура ПодготовитьПисьмоРуководителю(ТЗ1, ТЗ2) //ТЗ1 и ТЗ2 - идентичные таблицы значений ТЗ1.Свернуть("ТекущееПодразделение"); мОтобранныеСтроки = Новый Массив; ТекПодразделение = ""; Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл ТекПодразделение = СтрокаТЗ.ТекущееПодразделение; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение); СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала); мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора); ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); мОтобранныеСтроки.Очистить(); КонецЦикла; КонецПроцедуры |
|||
22
Айвонттубифри
13.03.20
✎
11:42
|
(18) Спасибо! Написала код, по Вашей подсказке - все получилось как надо!!!
ТЗ.Сортировать("ТекущееПодразделение"); ТЗПодразделения = ТЗ.Скопировать(); ТЗПодразделения.Свернуть("ТекущееПодразделение"); Для каждого СтрПодразделение ИЗ ТЗПодразделения Цикл ТекПодразделение = СтрПодразделение.ТекущееПодразделение; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ТекущееПодразделение", СтрПодразделение.ТекущееПодразделение); мОтобранныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора); ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); мОтобранныеСтроки.Очистить(); КонецЦикла; |
|||
23
Злопчинский
13.03.20
✎
12:06
|
(22) а это что за неиспользуемый в теле цикла хвост болтается? на коленке лепим? тяп-ляп, х..к х..як и в продакшн?
ТекПодразделение = СтрПодразделение.ТекущееПодразделение; |
|||
24
catena
13.03.20
✎
12:13
|
(23)Он используется, но не везде :) Это когда копипастнул, пару переменных переименовал - и уже свое.
|
|||
25
Злопчинский
13.03.20
✎
12:18
|
(24) и я вот нихрена не 8-ик, но нихрена не понимаю зачем внутри цикла каждый раз
мОтобранныеСтроки.Очистить(); ...? разве мОтобранныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора); - не заново полностью формирует содержимое мОтобранныеСтроки..? . и зачем ТЗ.Сортировать("ТекущееПодразделение"); ...? после Свернуть в копии скорее всего вся сортировка своя будет... |
|||
26
Злопчинский
13.03.20
✎
12:20
|
//
ТЗПодразделения = ТЗ.Скопировать(); ТЗПодразделения.Свернуть("ТекущееПодразделение"); ТЗПодразделения.Сортировать("ТекущееПодразделение"); мОтобранныеСтроки = ""; Для каждого СтрПодразделение ИЗ ТЗПодразделения Цикл ТекПодразделение = СтрПодразделение.ТекущееПодразделение; СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение); мОтобранныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора); ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); КонецЦикла; // ...??? |
|||
27
Simod
13.03.20
✎
13:45
|
(26) Ещё можно так:
ТЗПодразделения = ТЗ.Скопировать(); ТЗПодразделения.Свернуть("ТекущееПодразделение"); Для каждого СтрПодразделение ИЗ ТЗПодразделения Цикл ОтправитьПисьмоРуководителю(ТЗ.НайтиСтроки(Новый Структура("ТекущееПодразделение", СтрПодразделение.ТекущееПодразделение)), СтрПодразделение.ТекущееПодразделение); КонецЦикла; А вообще задача решается без дополнительной ТЗ. |
|||
28
Злопчинский
13.03.20
✎
13:47
|
(27) не, ну можно по оригинальной ТЗ идти и смотреть поменялось подразделение или нет..
или как-то иначе? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |