Имя: Пароль:
1C
 
поиск всех элементов справочника с опред наименованием
0 Башмак
 
28.04.08
13:00
Приветствую всех читающих это.
Хочу найти все элементы справочника, имеющих одно и тоже наименование.
можно
Спр.ПорядокНаименований();
НайтиПоНаименованию(наим1,0,1);
Пусть нашли 1-й элемент, как теперь проверить следующие, такое же ли у них наименование?
Помогите добрым советом.
1 Стрелок
 
28.04.08
13:01
1. перебор справочника
2. запрос
2 Стрелок
 
28.04.08
13:02
3. поиск по наименованию с удалением в транзакции и отменой оной по завершению работы
3 Guk
 
28.04.08
13:03
(0) Делай в транзакции с удалением найденных элементов...
4 Ёпрст2
 
28.04.08
13:03
(0)

СЗ=СоздатьОбъект("СписокЗначений");
НачатьТранзакцию();
Пока Спр.НайтиПоНаименованию(наим1,0,1)=1 Цикл
  СЗ.ДобавитьЗначение(Спр.ТекущийЭлемент());
  Спр.Удалить();
КонецЦикла;
ОтменитьТранзакцию();
СЗ.ВыбратьЗначение(,);

Или запросом ...
5 Smitt
 
28.04.08
13:04
Процедура Сформировать()
   Перем Запрос, ТекстЗапроса;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
   |Наименование = Справочник.Номенклатура.Наименование;
   |Группировка ТекущийЭлемент;
   |Условие(Наименование = ВыбНаименование);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса

   // Заполнение полей "Заголовок"

   Пока Запрос.Группировка(1) = 1 Цикл
       // Заполнение полей ТекущийЭлемент

   КонецЦикла;
   // Вывод заполненной формы

КонецПроцедуры
6 dk
 
28.04.08
13:04
1. Плохой вариант

начатьтранзакцию()
пока спр.найтипонаименованию.. цикл
  сообщить(спр.текущийэлемент)
  спр.удалить(1)
конеццикла
отменитьтранзакцию

2. Правильный вариант

ТекстЗапроса = "
Эл = Спр. ...текущийэлемент
наим = спр...Наименование
Условие Найти(Наим, Искомое) > 0"
7 Omskdizel
 
28.04.08
13:05
Можно легко через ТаблицуЗначений
8 Omskdizel
 
28.04.08
13:07
В нее пихаешь наименования, в соседнюю колонку единички, потом ТЗ.Свернуть("1","2"). В той строке, где не 1 будет стоять количество одинаковых наименований. ИМХО проще юзанья запросов и тем более транзакций.
9 ZanderZ
 
28.04.08
13:08
(8) да конечно а как ты потом сам элемент то найдешь твоим то способом...
10 Ёпрст2
 
28.04.08
13:09
(8) И при большом количестве элементов ппц твоей ТЗ ...

ЗЫ: Лучше всего Select ...
11 Omskdizel
 
28.04.08
13:20
(9) Тупо сортируешь по убыванию и вперед перебором. Неужто трудно?
(10) У меня на 200000 элементах все прекрасно работало, я помнится поиск ссылок на список из тысяч 100 элементов делал, с этой ТЗ все упомянутое работало. Более того, справочников с гораздо меньшим объемом подавляющее большинство, так что нарваться на сие маловероятно.
12 dk
 
28.04.08
13:22
(11) А на формирование этой ТЗ сколько времени ушло? :)
хотя тоже вариант нормальный для некоторых ситуаций.
13 Ёпрст2
 
28.04.08
13:23
(11) тупое решение, во-первых - перебор всего справочника, во-вторых - тз.
И это никак не лучше мнимой транзакции, которая в разы быстрее, и ну никак не лучше запроса, ибо медленнее.
14 Ёпрст2
 
28.04.08
13:24
+13 Да еще и сортировка этой тз + перебор в этой тз ...
15 Ёпрст2
 
28.04.08
13:25
+14 И хранение копии этой тз в несвёрнутом виде ...
16 Omskdizel
 
28.04.08
13:28
В моем варианте находятся все дубли наименований. Если знать наименование, то запрос ессно лучше полного перебора.
17 Omskdizel
 
28.04.08
13:31
(14)(15) Что-то не пойму, чем тебе это не нравится? Очень часто пользовал, работает шустро.
18 ZanderZ
 
28.04.08
13:31
(11) "Тупо сортируешь по убыванию и вперед перебором. Неужто трудно?
" че то не догнал а сами то как элементы найдешь опять по справочнику искать ??
если ты свернешь по наименованиям то у тебя и будут в таблице только наименования не сами элементы то ....
19 Башмак
 
28.04.08
13:34
Спасибо
А что насчет select?
20 Ёпрст2
 
28.04.08
13:33
(17) Ложное заблуждение в (8).
21 Omskdizel
 
28.04.08
13:37
(18) Ну если и такое надо рассказывать :) Сортировать по второй колонке, где количество документов дублей :) И все верхние будут как раз дублями, пока в "2" единичку не встретишь.
22 ZanderZ
 
28.04.08
13:37
(19) запрос или прямой запрос
23 Omskdizel
 
28.04.08
13:38
(20) Почитай (16), а то прям расходился
24 ZanderZ
 
28.04.08
13:38
(21) ты че то не догоняешь по моему....
25 ZanderZ
 
28.04.08
13:39
+(24) извени (16) не увидел ... только муторно и долго в начале в ТЗ потом запрос ...
26 Omskdizel
 
28.04.08
13:41
(25) Не, ты уж определись, либо ТЗ, либо Запрос. Просто я (0) несколько неправильно понял.
27 ZanderZ
 
28.04.08
13:43
(26) ну так вот я тебя и спрашивал как из твоей Тз найти ССЫЛКИ на элементы, а если ты предлагаешь потом еще отдельно запрос делать для получения ссылок, то проще сразу запрос мутить с группировкой по Наименованию
28 Omskdizel
 
28.04.08
13:49
(27) Нее, ты наверное не понял. В ТЗ справочник кидаешь, в этой же ТЗ делаешь еще колонку в которой ставишь 1, потом ТЗ.Свернуть("1","2"), ТЗ.Сортировать("2-") потом перебор до тех пор, пока ТЗ.ПолучитьЗначение(НомерСтроки,2)<>1
29 Башмак
 
28.04.08
13:50
А если ВыбратьЭлементыПоРеквизиту, где реквизит - наименование и перебрать элементы этой выборки?
30 Omskdizel
 
28.04.08
13:50
Можно и во время перебора справочника поймать дубли в принципе, главное его сначала отсортировать по наименованию.
31 Omskdizel
 
28.04.08
13:51
(29) А интересный вариант. Только вот не знаю, к Наименование его можно прикрутить или нет.
32 ZanderZ
 
28.04.08
13:51
(28) как это ты в тз свернешь справочник то если там будут ЭЛЕМЕНТЫ ??????
ты понимаешь разницу м/у Наименованием справочника и Элемента справочника ....
33 Ёпрст2
 
28.04.08
13:51
(29) Наименование, как и Код - это "атрибуты" справочника, не совсем реквизиты его...и для них свои методы.
34 ZanderZ
 
28.04.08
13:53
(29) не получится надо доп Реквизит делать с отбором в него писать наименования, а потом уже твое ...
35 Omskdizel
 
28.04.08
13:54
(32) Почитай внимательно (8). Неужто сам додумать не можешь, что в ТЗ можно и наименования пихать?
36 ZanderZ
 
28.04.08
13:56
(35) ты че то гоняешь реально ты же свернешь по наименованию как ты потом элемент то получишь ????
у тебя будет в ТЗ

К1            К2
Наименование1  2
Наименование2  3
Наименование3  1

и дальше твои действия отобрал я 1-е и 2-е значени из тз и ????
37 Ёпрст2
 
28.04.08
13:59
(36) Как-как .. копию отсортированнной  несвёрнутой ТЗ хранить надобно ... в неё потом искать - перебирать ..
38 ZanderZ
 
28.04.08
14:00
(0) самое оптимальное в (5) если надо найти все совпадения по всем то тогда маленько исправить  

   |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
   |Наименование = Справочник.Номенклатура.Наименование;
   |Группировка Наименование ;
   |Группировка ТекущийЭлемент без групп;

потом в обходе

Пока Запрос.Группировка(1) Цикл

Кол = 0;
 Пока Запрос.Группировка(2) Цикл
   сз.ДобавитьЗначений(Запрос.ТекущийЭлемент);
   Кол = Кол +1;
 КонецЦикла;
  Если Кол = 1 тогда
   сз.УдалитьЗначение();
  КонецЕсли;
39 Башмак
 
28.04.08
14:01
мне нужны некоторые реквизиты элементов с повторяющимися наименованиями, потому тз вряд ли поможет
(29) было бы идеальным, но (34)-верно, проверил.
40 ZanderZ
 
28.04.08
14:01
(37) и в чем прикол то хранения ???
тогда уже после свертки заново переберать справочник и искать с сортировкой по наименованию...
41 Ёпрст2
 
28.04.08
14:07
(40) Это ты у автора поста спроси...
ЗЫ: Если нужны все несовпадения, то Запрос + 1 группировка + Функция Счётчик в запросе и привет, в обходе, там где значение функции >1 - и есть дубли.
Если нужна скорость, то select + like %%%(если по части наименования)...
42 Omskdizel
 
28.04.08
14:10
(36) Ну сделай К3, где собственно элемент будешь хранить. И не надо ничего особо перебирать дополнительно. Или прям код расписать, чтобы такие вопросы за ненадобностью отвалились?
43 Omskdizel
 
28.04.08
14:35
(38) И чем это лучше перебора справочника? :) А если надо по Наименованию и Артикулу совпадения искать?

ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Кол1");
ТЗ.НоваяКолонка("Кол2");
...
ТЗ.НоваяКолонка("КолN");
Спр=СоздатьОбъект("Справочник.Нужный");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=1 Тогда
 Продолжить;
КонецЕсли;
ТЗ.НоваяСтрока();
ТЗ.Кол1=Спр.Реквизит1;
ТЗ.Кол2=Спр.Реквизит2;
...
ТЗ.КолN-1=Спр.ТекущийЭлемент();
ТЗ.КолN=1;
КонецЦикла;
ТЗ.Свернуть("1,2,...,N-1","N");
ТЗ.Сортировать("N-");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Если ТЗ.КолN=1 Тогда
 Прервать;
 //Трындец, кончились дубли....
КонецЕсли;
//Здесь поступаем по собственному хотению с дублями....
КонецЦикла;
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший