Имя: Пароль:
1C
1С v8
Таблица Значений, отбор по Подразделению
,
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) не, ну можно по оригинальной ТЗ идти и смотреть поменялось подразделение или нет..
или как-то иначе?