|
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) Плохой совет заменять в автомате. В реальном учете есть много "НО", есть периоды запрещенные к правке, есть условности и хотелки. Если тебе это помогло, то это хорошо. Другим может быть во вред.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |