Имя: Пароль:
1C
1С v8
Быдло-Код
🠗 (Волшебник 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
Еще такой вариант


ВЫБРАТЬ
   ФизическиеЛица.Ссылка КАК Ссылка,
   ФизическиеЛица1.Ссылка КАК Ссылка1
ИЗ
   Справочник.ФизическиеЛица КАК ФизическиеЛица
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица1
       ПО ФизическиеЛица.Наименование = ФизическиеЛица1.Наименование
           И ФизическиеЛица.Ссылка <> ФизическиеЛица1.Ссылка

УПОРЯДОЧИТЬ ПО
   Ссылка
АВТОУПОРЯДОЧИВАНИЕ
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едавно -> недавно.
2 + 2 = 3.9999999999999999999999999999999...