Имя: Пароль:
1C
 
Таблица Значений, поиск строк
0 nastyaaa
 
31.10.07
11:25
Уважаемые программисты, объясните пож-та как в таблице значений найти строки у которых одинаковы определенные параметры?

Есть ТЗ, Она содержит кучу строк необходиомо вытащить те строки где одинаковы: ТЗ.ФИО, ТЗ.Организация, ТЗ.Подразделение, ТЗ.должность

Как я думаю нужно использовать метод НайтиСтроки, пишу:
Отбор = Новый Структура();
Отбор.Вставить("ФИО",ФИО);
Строки = ТЗ.НайтиСтроки(Отбор);

Струкутура-Задает условия поиска: ключ структуры определяет имя колонки (ФИО), по которой будет осуществляться поиск,
а значение структуры - искомое значение - а я не знаю искомого значения... Что делать? И мне нужно не по одному параметру а по четырем...
Заранее спасибо.
1 Scooter
 
31.10.07
11:26
1.НайтиСтроки + перебор
2.Мучать построитель
3.Запросом
2 RomaH
 
naïve
31.10.07
11:27
добавить счетчик
свернуть
получившиеся строки будут условиями для поиска
3 MikleV
 
31.10.07
11:28
Свернуть()
4 nastyaaa
 
31.10.07
11:33
Как я читала про метод свернуть(), это не получится... Потому что в строках не все ячейки совпадают. Мне нужно вытащить только те строки ТЗ, где совпадают имннно эти 4 параметра, а все остальные совпадать должны не обязательно. Но выводиться должны
5 nastyaaa
 
31.10.07
11:34
(1)
НайтиСтроки+перебор - а поподробнее?
6 RomaH
 
naïve
31.10.07
11:38
(4)
э..эх, не сразу автора разглядел

ТЗ_Отбор = ТЗ.Скопировать();

ТЗ_Отбор.Колонки.Добавить("Счетчик");

... синтаксис не помню, но можно эту колонку заполнить значением "ОДИН" (число, а не слово)

ТЗ_Отбор.Свернуть("ФИО,Организация,Подразделение,Должность","Счетчик");

Для Каждого СтрокаОтбора Из ТЗ_Отбор Цикл

Если СтрокаОтбора.Счетчик = 1 Тогда
Продолжить;
Конецесли;

тут получили строку ТЗ с готовыми условиями посика строк в ТЗ - они там, в ТЗ, точно дублируются
7 Hadgehogs
 
31.10.07
11:41
//
Отбор = Новый Структура();
Отбор.Вставить("ФИО",ФИО);
Отбор.Вставить("Организация",Организация);
Отбор.Вставить("Подразделение",Подразделение);
Отбор.Вставить("Должность",Должность);
МассивСтрок = ТЗ.НайтиСтроки(Отбор);
Для Каждого ЭлементМассива Из МассивСтрок Цикл
Сообщить(ЭлементМассива.НомерСтроки);
КонецЦикла;
8 Smallrat
 
31.10.07
11:43
Я что-то не понял, а почему свернуть() не сработает ?

Копируем в новую ТЗ, добавляем колонку "число", заполняем ее единичками
Потом
ТЗ.Свернуть("ФИО,Организация,Подразделение,должность","Число");
Строки, где число > 1 и есть искомые строки.
9 Scooter
 
31.10.07
11:43
(6)тоже рабочий вариант. Но свернуть на 8.0 медленно работает
т.е при проведениие лучше не использовать
10 Smallrat
 
31.10.07
11:45
Упс, пока писал уже даже код запостили =(
11 MikleV
 
31.10.07
11:48
там Гений что то писал про ТурбоСвернуть..
и вроде как быстрее работает.
12 nastyaaa
 
31.10.07
12:03
(6)
Написала:
ТЗ_Отбор = ТЗ.Скопировать();
ТЗ_Отбор.Колонки.Добавить("Счетчик");
ТЗ_Отбор.Свернуть("ФИО,Организация,Подразделение,Должность","Счетчик");
Для Каждого СтрокаОтбора Из ТЗ_Отбор Цикл
   Сообщить(СтрокаОтбора.Счетчик);
   Если СтрокаОтбора.Счетчик = 1 Тогда
       
Продолжить;
Конецесли;
КонецЦикла;
Проблемы:
1. он свернул в одну строку мои 2 строчки, причем фио вписал, а вот остальные араметры пустыми сделал. Хотя в ТЗ было 2-е строчки с одинаковыми ЗАПОЛНЕННЫМИ параметрами Организация, Должность, Подразделение, ну и ФИО
2. Даже если бы он выводил все 4 параметра, все равно толку мало, потому что мне нужно было найти эти строки в ТЗ, где совпадают данные параметры, а потом уже работать с ними по другим ячейкам этих трок, которых после свертки в ТЗ_Отбор нет
:((((( Что делать?
13 nastyaaa
 
31.10.07
12:04
(12) для (6)
14 nastyaaa
 
31.10.07
12:05
(7)
ЭлементМассива.НомерСтроки - такого нет...
15 nastyaaa
 
31.10.07
12:07
(7)
Я написала так:
Отбор = Новый Структура();
Отбор.Вставить("ФИО",Стр.ФИО);
Отбор.Вставить("Организация",Стр.Организация);
Отбор.Вставить("Подразделение",Стр.Подразделение);
Отбор.Вставить("Должность",Стр.Должность);
МассивСтрок = ТЗ.НайтиСтроки(Отбор);
Для Каждого ЭлементМассива Из МассивСтрок Цикл
Сообщить(ЭлементМассива.Индекс);
КонецЦикла;

Ошибка:
{Форма.Отчет(388)}: Поле объекта не обнаружено (Индекс)
Сообщить(ЭлементМассива.Индекс);
16 baa
 
31.10.07
12:50
Дорогая, ответ (7) самый правильный, остальное - чушь
А при чем тут Индекс?
17 baa
 
31.10.07
12:58
Отбор = Новый Структура();
Отбор.Вставить("ФИО",Стр.ФИО);
Отбор.Вставить("Организация",Стр.Организация);
Отбор.Вставить("Подразделение",Стр.Подразделение);
Отбор.Вставить("Должность",Стр.Должность);
МассивСтрок = ТЗ.НайтиСтроки(Отбор);
Для Каждого ЭлементМассива Из МассивСтрок Цикл
//Сообщить(ЭлементМассива.Индекс); - нет такой колонки у вас
 Сообщить (ЭлементМассива.ФИО + ЭлементМассива.Организация + ....);
КонецЦикла;
18 nastyaaa
 
31.10.07
18:45
Отбор = Новый Структура();
Отбор.Вставить("ФИО",Стр.ФИО); //НА ЭТОЙ СТРОЧКЕ ВЫДАЕТ ОШИБКУ

{Форма.Отчет(378)}: Ошибка при получении значения атрибута контекста (ФИО): Выполнение операции невозможно, т.к. строка была удалена.
Отбор.Вставить("ФИО",Стр.ФИО);

Что это значит?
19 nastyaaa
 
31.10.07
18:48
Хотя в ТЗ ФИО есть
20 nastyaaa
 
31.10.07
18:53
АУ!
21 ОператорПК
 
31.10.07
18:55
покаж полный код что такое "Стр" из (18)
22 Hadgehogs
 
31.10.07
19:02
Горевала в тоске Настасья и во сне себя загубила (строки пришли на ум).
У вас в (15)
Отбор.Вставить("ФИО",Стр.ФИО);
выполнился нормально
а в (18) - не работает.
Как так?
23 Вектор3
 
31.10.07
19:03
хммм попробуем ещё раз
ТЗ_Отбор = ТЗ.Скопировать();
ТЗ_Отбор.Колонки.Добавить("Счетчик");
Для каждого стр из тз_отбор Цикл
   стр.счетчик = 1;
КонецЦикла;
массив = новый массив;

ТЗ_Отбор.Свернуть("ФИО,Организация,Подразделение,Должность","Счетчик");

Для Каждого СтрокаОтбора Из ТЗ_Отбор Цикл
   
Если СтрокаОтбора.Счетчик > 1 Тогда
отбор = новый Структура;
Отбор.Вставить("ФИО",Стр.ФИО);
Отбор.Вставить("Организация",Стр.Организация);
Отбор.Вставить("Подразделение",Стр.Подразделение);
Отбор.Вставить("Должность",Стр.Должность);

массивотбора =ТЗ.найтиСтроки(отбор);
Для каждого элем из массивотбора Цикл
массив.Добавить(элем);
КонецЦикла;

Конецесли;
КонецЦикла;

получили массив строк, в которых значения повторяются
24 Вектор3
 
31.10.07
19:05
ТЗ_Отбор = ТЗ.Скопировать();
ТЗ_Отбор.Колонки.Добавить("Счетчик");
Для каждого стр из тз_отбор Цикл
   стр.счетчик = 1;
КонецЦикла;
массив = новый массив;

ТЗ_Отбор.Свернуть("ФИО,Организация,Подразделение,Должность","Счетчик");

Для Каждого стр Из ТЗ_Отбор Цикл
   
Если стр.Счетчик > 1 Тогда
отбор = новый Структура;
Отбор.Вставить("ФИО",Стр.ФИО);
Отбор.Вставить("Организация",Стр.Организация);
Отбор.Вставить("Подразделение",Стр.Подразделение);
Отбор.Вставить("Должность",Стр.Должность);

массивотбора =ТЗ.найтиСтроки(отбор);
Для каждого элем из массивотбора Цикл
массив.Добавить(элем);
КонецЦикла;

Конецесли;
КонецЦикла;

так правильнее
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан