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