|
Быдло-Код 🠗 (Волшебник 07.03.2013 10:20) | ☑ | ||
---|---|---|---|---|
0
Azxcvbn
07.03.13
✎
07:53
|
Нужно пробежаться по справочнику Контрагенты и найти одинаковые по Наименованию. Я сделал, но выглядит по школьному. Хотел бы посмотреть как более опытные и "шарящие" люди выполнили бы это задание. З.Ы. все работает:
Кол=0; Выборка = Справочники.Контрагенты.Выбрать(); Выборка2 = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Пока Выборка2.Следующий() Цикл Если Выборка.Наименование = Выборка2.Наименование Тогда Кол = Кол+1; Сообщить("Код "+Выборка.Код+" Код 2 = "+Выборка2.Код); КонецЕсли; КонецЦикла; Если Кол > 1 тогда Сообщить("Найдены дубли "+Выборка.Наименование); КонецЕсли; Кол = 0; КонецЦикла; |
|||
1
shuhard
07.03.13
✎
07:54
|
(0) кури запросы и Having
|
|||
2
MSII
07.03.13
✎
07:55
|
Запросом, сгруппировать по наименованию
|
|||
3
Альбатрос
07.03.13
✎
07:56
|
(0) воспользоваться обработкой "Поиск и замена дублирующихся элементов справочника"
|
|||
4
Юрий Лазаренко
07.03.13
✎
07:56
|
Запрос с группировкой по наименованию и подсчётом количества элементов в группе не спасёт отца российской демократии?
|
|||
5
КузьмаПруткофф
07.03.13
✎
07:58
|
Работает? Не трожь!
|
|||
6
Wobland
07.03.13
✎
08:02
|
левое соединение по спр1.наименование=спр2.наименование и спр1.ссылка<>спр2.ссылка
так ещё и сами ссылки получишь |
|||
7
DCKiller
07.03.13
✎
08:19
|
Запросом, АдназначнО.
|
|||
8
jsmith82
07.03.13
✎
08:23
|
ужас
|
|||
9
jsmith82
07.03.13
✎
08:25
|
Запрос = Новый Запрос;
Запрос.Текст = " |Выбрать | Т." + ИмяПоля + " Как ЗначениеПовтора, | Сумма(Т.Повтор) Как КоличествоПовторов |Из | ( | Выбрать | " + ИмяПоля + ", | 1 Как Повтор | Из | Справочник."+ИмяСправочника+" | ) | Как Т |Сгруппировать По Т." + ИмяПоля + " Имеющие Сумма(Повтор) > 1 |Упорядочить По Т." + ИмяПоля + " Возр"; |
|||
10
jsmith82
07.03.13
✎
08:26
|
(5) бугага
|
|||
11
1C-band
07.03.13
✎
08:26
|
(0) А потом нам то скорости процессора не хватает, то оперативной памяти...
|
|||
12
PiterPrg
07.03.13
✎
08:30
|
(9) Зачем вложенный цикл?
пишут-же (1) Примерно так: ВЫБРАТЬ Наименование, КОЛИЧЕСТВО(Наименование) ИЗ Справочник.Контрагенты ГДЕ ЭтоГруппа = ЛОЖЬ СГРУППИРОВАТЬ ПО Наименование ИМЕЮЩИЕ КОЛИЧЕСТВО(Наименование) > 1 |
|||
13
peal
07.03.13
✎
08:31
|
(0) Интересно и как оно работает???
Ссылки не сравниваются |
|||
14
jsmith82
07.03.13
✎
08:31
|
(12) старая привычка
|
|||
15
PiterPrg
07.03.13
✎
08:31
|
(12) В смысле влеженный запрос :-) не проснулся еще...
|
|||
16
Злопчинский
07.03.13
✎
08:31
|
(0) если уж так приперло выборкой прихренячить то можно проще
СпрК.ПорядокНаименований(); Предыдущий = ""; СпрК.ВыбратьЭлементы(); Пока СпрК.ПолучитьЭлемент(); Если СпрК.Наименование = Предыдущий Сообщить("дубль: "+СпрК.Код); Продолжить; КонецЕсли; Предыдущий = СпрК.Наименование; КонецЦикла; |
|||
17
jsmith82
07.03.13
✎
08:32
|
В школе как-раз таки и учат правильно писать
|
|||
18
Xapac_2
07.03.13
✎
08:33
|
(0) выгружаешь справочник в 2 таблицы.
1) пробегаешь цыклом. 2) в цикле ищешь чеез Таблица2.Найти(имя) 3) выгода. |
|||
19
shuhard
07.03.13
✎
08:34
|
(18) ржака
|
|||
20
ЧеловекДуши
07.03.13
✎
08:34
|
(18) Далеко пойдешь, посмотри в (9) и (12) :)
|
|||
21
forforumandspam
07.03.13
✎
08:36
|
(18) Конкурс на самый быдляцкий код?
|
|||
22
big
07.03.13
✎
08:36
|
(16) ты то с клюшками куда в калашный ряд? ))))
|
|||
23
Злопчинский
07.03.13
✎
08:38
|
(22) ну если посмотреть в (0) - то снеговики от клюшечников недалеко ушли - я еще успею догнать и обогнать ;-)
|
|||
24
forforumandspam
07.03.13
✎
08:40
|
(23) Это недоснеговик.
|
|||
25
Галахад
гуру
07.03.13
✎
08:41
|
(18) Если уж в таблицу значений.
То выгрузить. Добавить колонку. Свернуть суммируя по этой колонке. |
|||
26
ЧеловекДуши
07.03.13
✎
08:44
|
(25) Ужас... а если там элементов до полутора миллиона?
|
|||
27
VladZ
07.03.13
✎
08:44
|
(18) Жуть!
|
|||
28
VladZ
07.03.13
✎
08:45
|
Идеальный вариант: запросом.
Если с запросами не очень - вариант в (16). |
|||
29
Irbis
07.03.13
✎
08:45
|
есил изгаляться, то нужно цикл в цикле организовывать
|
|||
30
Галахад
гуру
07.03.13
✎
08:46
|
(26) Пофек. Кстати, если бы это было так, то код (0) до сих пор бы крутился. :-)
|
|||
31
Эмбеддер
07.03.13
✎
08:49
|
(16) только Предыдущий = 0; вместо Предыдущий = "";
|
|||
32
Mikeware
07.03.13
✎
08:49
|
(23) "Восьмерка разжижает мозг"© (естественно, если он как минимум есть в наличии, что далеко не всегда...)
|
|||
33
Xapac_2
07.03.13
✎
08:54
|
(20) (21) шутка блин, я думал тут кто бытлятей придумает тот и на коне.
|
|||
34
Zero on a dice
07.03.13
✎
08:55
|
еще и выборка неправильно написана
вложенный цикл один раз сработает только |
|||
35
MrStomak
07.03.13
✎
09:02
|
(34) Ага, код то вообще нерабочий:)
|
|||
36
АНДР
07.03.13
✎
09:02
|
(13) Он заботливо учёл "гарантированное наличие" одного дубля.
|
|||
37
Serg_1960
07.03.13
✎
09:03
|
(0) Значит так, слушай меня, делай так:
- последовательным чтением записей справочника запомни наименования в массиве; - отсортируй массив общеизвестным методом пузырька; - в цикле с х=2 сравнивай текущее значение с предыдущим. PS: использование бинарных деревьев не предлагаю - не "тот" уровень у тс. |
|||
38
forforumandspam
07.03.13
✎
09:03
|
(34)(35) С чего вы взяли? Он просто даст много избыточной информации.
|
|||
39
НафНаф
07.03.13
✎
09:03
|
||||
40
kosts
07.03.13
✎
09:04
|
Еще такой вариант
|
|||
41
MrStomak
07.03.13
✎
09:05
|
Я еще более быдляцкий вариант знаю:
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Если Спарвочники.Контрагенты.НайтиПоНаименованию(Выборка.Наименование,Истина)<>Справочники.Контрагенты.ПустаяСсылка() Тогда Сообщить("Код "+Выборка.Код+" Код 2 = "+Выборка2.Код); КонецЕсли; КонецЦикла; КонецЦикла; |
|||
42
Лефмихалыч
07.03.13
✎
09:05
|
Однако, сколько дурацких вариантов. Надо на собеседовании такой вопрос задавать, однако
|
|||
43
MrStomak
07.03.13
✎
09:06
|
блин, не, не катит :(
|
|||
44
Zero on a dice
07.03.13
✎
09:07
|
(38) вторую выборку он перед обходом первой выбирает. цикл по следующему пройдет всего один раз
|
|||
45
MrStomak
07.03.13
✎
09:08
|
вот так!!!
Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл Если Справочники.Контрагенты.НайтиПоНаименованию(Выборка.Наименование,Истина)<>Справочники.Контрагенты.ПустаяСсылка() и Справочники.Контрагенты.НайтиПоНаименованию(Выборка.Наименование,Истина)<>Выборка.Ссылка Тогда Сообщить("Тута дубль!"); КонецЕсли; КонецЦикла; КонецЦикла; |
|||
46
MrStomak
07.03.13
✎
09:08
|
(38) будут дубли только первого элемента первой выборки
|
|||
47
Лефмихалыч
07.03.13
✎
09:10
|
(0)
ВЫБРАТЬ Наименование ПОМЕСТИТЬ ВТ ИЗ Справочник.Контрагенты СГРУППИРОВАТЬ ПО Наименование ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Ссылка)>1 ; ВЫБРАТЬ ВТ.Наименование Спр.Ссылка ИЗ ВТ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты как Спр ПО Спр.Наименование = ВТ.Наименование ИТОГИ КОЛИЧЕСТВО(Ссылка) по ОБЩИЕ, Наименование // это для красоты, можно и не надо |
|||
48
Дядя Вова
07.03.13
✎
09:10
|
Вцыгрузить справочник в таблицу значений, добавить в нее колонку и заполнить все её строки единичкой. Потом табл.знач свернуть по наименованию. Где новаяКолонка > 1 будет - там повтор
|
|||
49
godmod80
07.03.13
✎
09:12
|
(0) незачет - задействовано только одно ядро проца)
|
|||
50
Лефмихалыч
07.03.13
✎
09:12
|
(48) а если там полтора миллиона элементов? руками еще пересчитать предложи
|
|||
51
forforumandspam
07.03.13
✎
09:13
|
(44) Запусти такой код и ты поймёшь, что неправ:
Процедура КнопкаВыполнитьНажатие(Кнопка) Кол=0; Выборка = Справочники.Контрагенты.Выбрать(); Выборка2 = Справочники.Контрагенты.Выбрать(); Сч1 = 0; Пока Выборка.Следующий() Цикл Сч1 = Сч1 + 1; Сч2 = 0; Пока Выборка2.Следующий() Цикл Сч2 = Сч2 + 1; Если Выборка.Наименование = Выборка2.Наименование Тогда Кол = Кол+1; Сообщить("Код "+Выборка.Код+" Код 2 = "+Выборка2.Код); КонецЕсли; Сообщить("Сч1="+Сч1+" Сч2="+Сч2); КонецЦикла; Если Кол > 1 тогда Сообщить("Найдены дубли "+Выборка.Наименование); КонецЕсли; Кол = 0; КонецЦикла; Сообщить("Сч1="+Сч1+" Сч2="+Сч2); КонецПроцедуры |
|||
52
АНДР
07.03.13
✎
09:15
|
(41) Какой же он более быдляцкий, если быстрее отработает?
|
|||
53
0xFFFFFF
07.03.13
✎
09:15
|
(11) "А потом нам то скорости процессора не хватает, то оперативной памяти..."
... и ваще 1С гуано, потому что тормозит |
|||
54
forforumandspam
07.03.13
✎
09:16
|
(52) Быдляцкий, быдляцкий. Код будет выдавать ошибочные дубли, т.е. сами элементы.
|
|||
55
пипец
07.03.13
✎
09:17
|
(48) это семерошный вариант ;))
|
|||
56
АНДР
07.03.13
✎
09:17
|
(11), (53) Кстати да. Но что не так с типовыми?
|
|||
57
Zero on a dice
07.03.13
✎
09:19
|
(51) действительно. надо побольше с выборками работать)
|
|||
58
Лефмихалыч
07.03.13
✎
09:24
|
||||
59
Дядя Вова
07.03.13
✎
09:25
|
(55) Да, но в 8-ке тож так можно =)
Выгрузить выборкой справочник в ТЗ(Запрос.Выгрузить(ТЗ) - не кошерно), потом другой выборкой проставить 1. Потом, можно даже не пользоваться штатным методом Свернуть(), а свернуть третьей выборкой. |
|||
60
Эмбеддер
07.03.13
✎
09:28
|
(59) свернуть таблицу в цикле быдлокодер не сможет, Вы переоценили возможности
|
|||
61
forforumandspam
07.03.13
✎
09:30
|
Можно создать регистр сведений со строковым измерением, и записывать все наименования из выборки туда (в попытке). Если сработает исключение, то такая запись же есть.
|
|||
62
Эмбеддер
07.03.13
✎
09:32
|
по сути та же задача что и здесь, только цели разные
Простой sql Запрос выполняется 20 секунд. |
|||
63
kosts
07.03.13
✎
09:36
|
(0) Кстати, хоть и работает, но не универсально, для другого справочника не факт что сработает. Нужно явно установить порядок:
|
|||
64
VladZ
07.03.13
✎
09:38
|
(42) Да-да-да! Хоть чуток веселухи добавит.
А то ходил yедавно на собеседование. Диалог был такой: - С УТ работал? - Работал. - С БП? - Работал. - Когда готов приступить к работе? - .... Не собеседование, а скукотища! |
|||
65
Мимохожий Однако
07.03.13
✎
09:38
|
Посмотри текст запроса из обработки в УТ10.3 как советовал (3). Зачем тебе кривой велосипед?
|
|||
66
VladZ
07.03.13
✎
09:38
|
(64) yедавно -> недавно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |