Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Таблица Значений, отбор по Подразделению

Таблица Значений, отбор по Подразделению
Я
   Айвонттубифри
 
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
даже еще упрощу тебе вопрос:
где в коде "по подразделениями"...?
   ReaLg
 
4 - 12.03.20 - 20:23
Для каждого СтрокаТЗ ИЗ ТЗ1 Цикл
...
   ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение); 
...
Писем отправится столько, сколько строк в ТЗ1
   Злопчинский
 
5 - 12.03.20 - 20:24
ты ж что - культ карго проповедуешь?
комп он тупой.
вот и ты - сделай себя тупым и верифицируй код, выполняя его ТУПО как тупой механизм, не внедряя в верификацию "выполнения кода" свои ожидания/хотелки/смутныенадеждывдругоносамо - выполняй код построчно.. записывай на бумажке состояние тових данных после исполнения каждой строчки...
   Злопчинский
 
6 - 12.03.20 - 20:25
(4) ну вот нахрена ты это ;-)
дал рыбу человеку... а я ему удочку хотел дать...
   ReaLg
 
7 - 12.03.20 - 20:26
В постановке задачи ничего про дату начала не сказано, так что хз что там у тебя отберется :))
А вообще - получаешь список подразделений, потом цикл по этому списку с НайтиСтроки, формированием и отправкой письма.
Цикл должен быть по списку подразделений именно. Его можно получить методом Свернуть(...), например, копии ТЗ.
   ReaLg
 
8 - 12.03.20 - 20:27
(6) Это удочка :)) Я ж код не написал :)) Просто показал, что 1Ска все делает как и просят ее :))
   Айвонттубифри
 
9 - 12.03.20 - 20:27
(2) Я делаю отбор по подразделению и полученный отбор с нужным мне подразделением и сотрудниками помещаю в массив (мОтобранныеСтроки):
ТекПодразделение = СтрокаТЗ.ТекущееПодразделение;
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение);
мОтобранныеСтроки = ТЗ2.НайтиСтроки(СтруктураОтбора);
   Айвонттубифри
 
10 - 12.03.20 - 20:28
(4) Писем отправится столько, сколько строк в ТЗ1. Все верно! Вот как мне это в коде исправить?
   ReaLg
 
11 - 12.03.20 - 20:29
(9) Ну... А цикл у тебя по найденным строкам или нет?
   Айвонттубифри
 
12 - 12.03.20 - 20:30
(11) В отладчике, в мОтобранныеСтроки уже установлен нужный мне отбор. А вот дальше как?
   ReaLg
 
13 - 12.03.20 - 20:30
Цикл должен быть не по ТЗ1. А по списку с подразделениями, в котором каждое подразделение встречается один раз. Проще всего такой список получить сверткой копии твоей первоначальной ТЗ.
   Айвонттубифри
 
14 - 12.03.20 - 20:31
(7) Дату не смотрите, ее там нет, забыла убрать строчку  СтруктураОтбора.Вставить("ДатаНачала", СтрокаТЗ.ДатаНачала);
   ReaLg
 
15 - 12.03.20 - 20:32
(12) не важно на данный момент что у тебя в мОтобранныеСтроки. Ты отправляешь письма нв цикле по ТЗ1. Это неверно.
   ReaLg
 
16 - 12.03.20 - 20:32
нв цикле = в цикле
   Айвонттубифри
 
17 - 12.03.20 - 20:32
(7), (13) я примерно так себе и представляла. А у вас есть пример, чтобы я подобно сделала?
   ReaLg
 
18 - 12.03.20 - 20:38
(17) Хех... А вот теперь ты просишь рыбу а не удочку :))
Я не знаю, зачем тебе две ТЗ, поэтому предположим, что есть ТЗ1, в которой есть сотрудник и подразделение.
Шаги:
Делаешь копию ТЗ//Назовем ее ТЗПодразделения

Сворачиваешь копию по подразделению//В этот момент у тебя в ТЗПодразделения будут все подразделения без повторений

Делаешь цикл по ТЗПодразделения
в цикле по ТЗПодразделения ищешь методом НайтиСтроки в ТЗ1 строки с текущим подразделением.
Делаешь цикл по НайденнымСтрокам 
Формируешь письмо (я не знаю, что там должно быть, ну,например, в строку плюсуешь всех сотрудников)
Цикл по НайденнымСтрокам заканчивается
Отправляешь письмо//!!Здесь ты уже опять в цикле по ТЗПодразделения


Как то так :))
   Злопчинский
 
19 - 12.03.20 - 21:05
(9) "Я делаю отбор по подразделению"
вопрос. ТУПОЙ. ты должен как программист сам уметь задавать себе ВОПРОСЫ (правильные! это сложно, но с опытом придет) - и давать правильные ответы. Не те ответы, которые у тебя в башке вертятяс и уже висят на языке.а - ПРАВИЛЬНЫЕ.
.
"по подразделению" - по какому? откуда берется это "подразделение"..?
   Злопчинский
 
20 - 12.03.20 - 21:05
ну, в (18) уже и рыбку пожарили
   Mihasya
 
21 - 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) а это что за неиспользуемый в теле цикла хвост болтается? на коленке лепим? тяп-ляп, х..к х..як и в продакшн?
ТекПодразделение = СтрПодразделение.ТекущееПодразделение;
   catena
 
24 - 13.03.20 - 12:13
(23)Он используется, но не везде :) Это когда копипастнул, пару переменных переименовал - и уже свое.
   Злопчинский
 
25 - 13.03.20 - 12:18
(24) и я вот нихрена не 8-ик, но нихрена не понимаю зачем внутри цикла каждый раз
мОтобранныеСтроки.Очистить();
...?
разве
мОтобранныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора);
- не заново полностью формирует содержимое мОтобранныеСтроки..?
.
и зачем
ТЗ.Сортировать("ТекущееПодразделение");
...?
после Свернуть в копии скорее всего вся сортировка своя будет...
   Злопчинский
 
26 - 13.03.20 - 12:20
//

ТЗПодразделения = ТЗ.Скопировать();
ТЗПодразделения.Свернуть("ТекущееПодразделение");
ТЗПодразделения.Сортировать("ТекущееПодразделение");

мОтобранныеСтроки = "";
Для каждого СтрПодразделение ИЗ ТЗПодразделения Цикл
    
    ТекПодразделение = СтрПодразделение.ТекущееПодразделение;
    
    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("ТекущееПодразделение", ТекПодразделение);
    мОтобранныеСтроки = ТЗ.НайтиСтроки(СтруктураОтбора);
        
    ОтправитьПисьмоРуководителю(мОтобранныеСтроки, ТекПодразделение);
    
КонецЦикла;
//
...???
   Simod
 
27 - 13.03.20 - 13:45
(26) Ещё можно так:

ТЗПодразделения = ТЗ.Скопировать();
ТЗПодразделения.Свернуть("ТекущееПодразделение");

Для каждого СтрПодразделение ИЗ ТЗПодразделения Цикл
    ОтправитьПисьмоРуководителю(ТЗ.НайтиСтроки(Новый Структура("ТекущееПодразделение", СтрПодразделение.ТекущееПодразделение)), СтрПодразделение.ТекущееПодразделение);
КонецЦикла;


А вообще задача решается без дополнительной ТЗ.
   Злопчинский
 
28 - 13.03.20 - 13:47
(27) не, ну можно по оригинальной ТЗ идти и смотреть поменялось подразделение или нет..
или как-то иначе?


Список тем форума
Рекламное место пустует  Рекламное место пустует
Ошибка? Это не ошибка, это системная функция.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.