Имя: Пароль:
1C
1C 7.7
v7: Как выбрать элементы справочника с одинаковыми кодами.
0 Andreyyy
 
14.11.13
13:24
Собственно с реквизитами просто "ВыбратьЭлементыПоРеквизиту", а как быть с кодами ?
Нужно штатно, без 1С++
1 Mikeware
 
14.11.13
13:24
ПорядокКодов
2 SleepyHead
 
гуру
14.11.13
13:26
Если нужный код знаешь, сделай запросом, обычным штатным. На большом справочнике будет долго, зато код для выборки простой.
3 Стрелок
 
14.11.13
13:26
я знаю через транзакцию и удаление
4 Ёпрст
 
14.11.13
13:26
найтиПоКоду найдет всё...

Ну или запрос.
5 2S
 
14.11.13
13:26
выбратьпокоду
пока получитьэлемент()
6 2S
 
14.11.13
13:27
упс, найтипокоду
7 Стрелок
 
14.11.13
13:27
(1) в лужу
8 Стрелок
 
14.11.13
13:27
(1) неа. первый ;)
9 Andreyyy
 
14.11.13
13:29
(2) Код знаю, запросом долго, справочник большой.
(4) Через транзакцию и удаление ?
10 Стрелок
 
14.11.13
13:30
(9) ага. сообразишь? наводка - внутри транзакции все действия как бы выполняются но потом их можно отменить

1. выборка справочника внутри открытой транзакции
2. удаляем элемент запомнив его код
3. ищем по справочнику-дублю этот код
4. кода нет - элемент уникальный, код есть ещё - дубль - в список его
5. отменяем транзакцию
11 VladZ
 
14.11.13
13:33
(10) Зачем грузить систему ненужными транзакциями?
12 Ёпрст
 
14.11.13
13:33
(9) да
13 aka AMIGO
 
14.11.13
13:33
создать ТЗ с двумя колонками - Элемент, Код, Кол
в ТЗ читаем весь справочник, и присваиваем Кол=1
Далее ТЗ.Свернуть("Код","Кол");
перебираем элементы, если Кол>1 - встречен дубль
14 Стрелок
 
14.11.13
13:33
(11) затем что запрос по справочнику в 1000 наименований загрузит систему гораздо больше
15 aka AMIGO
 
14.11.13
13:33
с двумя колонками - Код, Кол
16 Стрелок
 
14.11.13
13:33
(13) это быстрее?
17 Ёпрст
 
14.11.13
13:34
минус метода - открытый кем-то элемент справочника обломит весь "поиск"
18 aka AMIGO
 
14.11.13
13:34
(16) у меня быстро
19 МихаилМ
 
14.11.13
13:34
запрос  

группировка по коду + счётчик
потом
в выборке отобрать счётчик > 1
20 aka AMIGO
 
14.11.13
13:35
+18, кстати, справочник с 19000 эл-тов
(19) +1 использовать встроенную ф-цию запросов
21 Стрелок
 
14.11.13
13:35
(17) это да возможно
(18) у всех одинаково поверь. свертка ТЗ занимает время
22 VladZ
 
14.11.13
13:36
(14) А чем ПорядокКодов не устроил?
23 Andreyyy
 
14.11.13
13:36
(10) Спасибо, понял.

Жаль что нельзя типа "ВыбратьЭлементыПоРеквизиту("Код", МойКод)
24 Andreyyy
 
14.11.13
13:36
(22) Сколько перебрать придется, пока до нужного кода дойдет.
25 Стрелок
 
14.11.13
13:36
а ты вообще дважды предлагаешь пробегать  ;) смешно
26 Стрелок
 
14.11.13
13:37
(22) а что это даст?ну порядок кодв и что? без выборки обойдёшься?
27 Andreyyy
 
14.11.13
13:37
(17) Алгоритм будет на точках, там однопользовательские системы.
28 aka AMIGO
 
14.11.13
13:37
(25) это мне? так я и не настаиваю.
есть такой прием - и достаточно
29 Стрелок
 
14.11.13
13:38
(28) ты говоришь быстрее будет. а я говорю что пробежать один раз быстрее чем два. логика понятна?
30 aka AMIGO
 
14.11.13
13:38
(29) понятна
31 VladZ
 
14.11.13
13:39
(24) Если разово: импортируешь файлик с базой в Excel. Группируешь по коду.
32 Skom
 
14.11.13
13:39
Поиск дублирующихся элементов
Выберем все элементы справочника Контрагенты, у которых совпадают ИНН
ТекстЗапроса = "
|SELECT
|  Спр.ID [Элемент $Справочник.Контрагенты],
|  $Спр.ИНН ИНН
|FROM
|  $Справочник.Контрагенты Спр
|WHERE
|  $Спр.ИНН IN
|  (SELECT
|     $Спр1.ИНН
|  FROM
|     $Справочник.Контрагенты Спр1
|  WHERE
|     $Спр1.ИНН <> ‘’
|  GROUP BY
|     $Спр1.ИНН
|  HAVING
|     COUNT(*) > 1)
|ORDER BY
|  $Спр.ИНН";
33 Skom
 
14.11.13
13:40
черт, про 1с++ не сразу увидел
34 Стрелок
 
14.11.13
13:42
(33) "хитрый да..." ;)
35 Стрелок
 
14.11.13
13:42
(+34) да и код не совсем реквизит справочника ;)
36 Ёпрст
 
14.11.13
13:47
Короче, делай так (это самый быстрый штатный вариант):  

НачатьТранзакцию()
Пока Спр.НайтиПоКоду(ВыбКод)=1 Цикл
   СЗ.ДобавитьЗначение(Спр.ТекущийЭлемент());
   Спр.Удалить();
КонецЦикла;
ОтменитьТранзакцию();
СЗ,ВыбратьЗначение(,)
37 Стрелок
 
14.11.13
13:47
(36) ;)
38 Стрелок
 
14.11.13
13:48
а если код дубля неизвестен то как? не пугай меня...
39 VladZ
 
14.11.13
13:55
(26) Выборку делать в любом случае.
40 Skom
 
14.11.13
14:08
загружаешь всю номенклатуру в ТЗ, потом в цикле проходишь справочник и делаешь поиск из этой ТЗ
41 Стрелок
 
14.11.13
14:10
(40) долго выше описано почему
(39) ну хорошо выборка и что? запоминать предыдущий код? да но в транзакции и выборка работает быстрее
42 Skom
 
14.11.13
14:14
(41) быстро в (32)
43 Стрелок
 
14.11.13
14:14
(42) в 32 противоречит условиям. а скорость уже вторична
44 Ёпрст
 
14.11.13
14:18
(38) тогда тупо чорным запросом с группировкой по коду.. и усё.
45 Стрелок
 
14.11.13
14:20
(44) запрос на больших справочниках работает дольше перебора
46 NikVars
 
14.11.13
14:26
(0) Обработкой печать справочников формируешь печную форму, отсортированную по коду. Далее конвертация в екссель или через копипасте.
Далее добавляешь колонку в екселе с формулой =ЕСЛИ(A1=A2;1;0)
для кода в колонке А.
Получаешь ненулевые значения - двойники.
Далее - сортируй или там еще чего...
А вот удаление двойников - это уже другая тема...
47 Skom
 
14.11.13
14:34
(46) рукалицо
48 NikVars
 
14.11.13
14:36
(47) Способ для студентов. Если умнишка слабовата, а ручишка сильновата.
49 Стрелок
 
14.11.13
14:39
(48) это приз за самый извращенный способ. круче было бы выгрузить не в ексель а в текст и уж потом в ексель
50 Skom
 
14.11.13
14:39
(49) круче только руками искать ))
51 NikVars
 
14.11.13
14:43
(49) Самый изврат в (32). После слов в (0) - штатно.
А 2-м местом буду доволен.
52 К_Дач
 
14.11.13
14:53
Как так вышло, что коды у элементов одинаковые? Я могу предположить только, что код уникален в пределах группы, то есть родителя. Ну и что мешает тогда запрос сделать с учетом родителя? Обход выборки, подчиненной группе. Не помню код в клюшках, но точно можно
53 ЧессМастер
 
14.11.13
15:23
(52) например при УРИБ - элемент заведен с одним кодом в разных базах
54 К_Дач
 
14.11.13
15:26
(53) от таких ситуаций нужно избавляться в центральной базе. А для 7.7 нет универсальной обработки поиска дублей в справочниках?
55 ЧессМастер
 
14.11.13
15:39
(54) чтобы их найти в центральной базе и надо решить задачу ТС.
на инфостарте думаю должны быть
56 1dvd
 
14.11.13
15:58
>>запросом долго, справочник большой

мде...
57 ЧессМастер
 
14.11.13
16:11
в (13) идеальный вариант описан решения проблемы. ладе сложно представить на каком справочнике такой запрос будет работать более 2-3 минут
58 ЧессМастер
 
14.11.13
16:35
(56) ну если в запросе засунуть функцию которая будет возвращать 0 если дубль не найден и 1 если дубль найден при этом в теле функции будет поиск дублей с перебором по всему справочнику - то будет долго
59 NikVars
 
14.11.13
18:03
(55) Таких обработок навалом. Да и сляпать не проблема. Проблема в том, чего дальше с дублями делать.
Особенно, когда треть доков на одном дубле висит, треть на другом, и треть на третьем.
60 Torquader
 
14.11.13
19:44
А чем вам не нравится 1 ?
лспр=СоздатьОбъект("Справочник.СДублями");
лспр.ПорядокКодов();
Если лспр.ВыбратьЭлементы(0)=1 Тогда
  лстрПрошлыйКод="";
  Пока лспр.ПолучитьЭлемент(1)=1 Тогда
    Если лстрПрошлыйКод=лспр.Код Тогда
      Сообщить("Дубль кода:"+лспрПрошлыйКод);
    КонецЕсли;
    лспрПрошлыйКод=лспр.Код;
  КонецЦикла;
КонецЕсли;
61 hogik
 
15.11.13
02:35
Это ещё не предлагали? :-)

    Перем ДБФ,Код;    
    Код=ВРег("0500029");
    ДБФ=СоздатьОбъект("xBase");
    ДБФ.ОткрытьФайл(КаталогИБ()+"SC33.DBF",КаталогИБ()+"SC33.CDX",1);
    ДБФ.ТекущийИндекс("CODE");
    ДБФ.Найти(Код,0);
    Пока ДБФ.ВКонце()=0 Цикл
        Если ПустоеЗначение(ДБФ.ISMARK)=1 Тогда
            Если ДБФ.CODE<>Код Тогда Прервать; КонецЕсли;
            Сообщить(ДБФ.CODE);    
        КонецЕсли;
        ДБФ.Следующая();
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
62 hogik
 
15.11.13
03:02
Исправление в (61):

    Перем ДБФ,Код,Спр,Буф;
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Буф=ЗначениеВСтрокуВнутр(Спр);
    Код=ВРег("0500029");
    ДБФ=СоздатьОбъект("xBase");
    ДБФ.ОткрытьФайл(КаталогИБ()+"SC33.DBF",КаталогИБ()+"SC33.CDX",1);
    ДБФ.ТекущийИндекс("CODE");
    ДБФ.Найти(Код,0);
    Пока ДБФ.ВКонце()=0 Цикл
        Если ПустоеЗначение(ДБФ.ISMARK)=1 Тогда
            Если ДБФ.CODE<>Код Тогда Прервать; КонецЕсли;
            Сообщить(ДБФ.CODE);
            Спр=ЗначениеИзСтрокиВнутр(СтрЗаменить(Буф,"         0",ДБФ.ID));
            Сообщить(Спр.Наименование);
        КонецЕсли;                                                
        ДБФ.Следующая();
    КонецЦикла;
    ДБФ.ЗакрытьФайл();
63 Злопчинский
 
15.11.13
04:18
ходжик уделал всех
64 ЧессМастер
 
15.11.13
08:55
(59) заменять конечно. я делал обработку которая в автоматическом режиме искала дубли а потом их заменяла - оставляла первый а все остальные заменяла на него. с заменой ссылок естественно. очень помогала с запущенных ситуациях когда дублей сотни
65 NikVars
 
15.11.13
09:38
(64) Плохой совет заменять в автомате. В реальном учете есть много "НО", есть периоды запрещенные к правке, есть условности и хотелки. Если тебе это помогло, то это хорошо. Другим может быть во вред.
Закон Брукера: Даже маленькая практика стоит большой теории.