Имя: Пароль:
1C
Админ
Как вывести только дублирующиеся строки ТЗ?
0 avcherkasov
 
07.02.13
17:51
Подскажите, пожалуйста, как из ТЗ выбрать только повторяющиеся строки.
Есть такая ТЗ.
19461    ПивСтареМисто1л       123
19461    ПивСтареМисто1л       4820046960382
19524    ПивСтареМисто0,5   4820046960368
20248    ПивАвтор0,5л       4820046960375
20248    ПивАвтор0,5л       4820046960511

Необходимо получить:

19461    ПивСтареМисто1л      123
19461    ПивСтареМисто1л      4820046960382
20248    ПивАвтор0,5л      4820046960375
20248    ПивАвтор0,5л      4820046960511
1 GLazNik
 
07.02.13
17:53
(0) Добавить колонку, заполнить 1, свернуть по всем колонкам кроме добавленной, суммировать по добавленной. в тех строках где значение больше 1 - дубли
2 monsterZE
 
07.02.13
17:59
отсортировать и загнать в новую
если пред.знач = тек.знач
если не надо сворачивать
3 avcherkasov
 
07.02.13
18:03
отсортировать зачем? она и так по артикулу отсортирована?
4 GLazNik
 
07.02.13
18:06
(3) нам то откудова знать. отсортирована или нет. если отсортировано, то не сортируй а сразу в цикле сверяй две соседние строки
5 Serginio1
 
07.02.13
18:06
Посмотри http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019    
там есть поиск дублей и прочее полезное
6 avcherkasov
 
07.02.13
18:06
Как можно свернуть по всем колонкам ,если штрихкода все разные?
7 avcherkasov
 
07.02.13
18:07
Можно поподробнее подсказать, как в цикле проверить 2 соседние строки?
8 Скользящий
 
07.02.13
18:08
Вариант в (1) самый оптимальный по быстродействию.
9 GLazNik
 
07.02.13
18:10
(6) ах это штрихкоды... т.е. задача выискать номенклатуры у которых два и более штрих-кода
(7) как-то так:
для к = 1 по Тз.КоличествоСтрок() - 1 цикл
Если ТЗ.ПолучитьЗначение("ляля",к) = ТЗ.ПолучитьЗначение("ляля",к+1) Тогда
Сообщить("Дубль");
КонецЕсли;
КонецЦикла
10 avcherkasov
 
07.02.13
18:15
Да, задача выбрать из всей номенклатуры только те товары, у которых 2 и более штрихкода:
Для к = 1 по Тз.КоличествоСтрок() - 1 Цикл
   Если ТЗ.ПолучитьЗначение(ТЗ.Артикул,к) = ТЗ.ПолучитьЗначение(ТЗ.Артикул,к+1) Тогда
   Сообщить("Дубль - "+ ТЗ.Артикул);
   КонецЕсли;
   КонецЦикла;

Номер за пределами значения!
11 GLazNik
 
07.02.13
18:16
Так оно должно быть:
Если ТЗ.ПолучитьЗначение("Артикул",к) = ТЗ.ПолучитьЗначение("Артикул",к+1) Тогда
Хотя колонки и строки мог и местами попутать :) давно не брал я в руки клюшки
12 avcherkasov
 
07.02.13
18:18
Пробовал и так. всё равно  Номер за пределами значения!
13 Mikeware
 
07.02.13
18:20
(12) открой для себя отладчик!
или позови кого-нибудь из взрослых...
14 GLazNik
 
07.02.13
18:22
(12) ну блин чувак... я же выше написал что мог попутать очередность строки и колонки... без семерки ж код пишу (прям как в институте код на листочке)... поменяй местами "Артикул" и к
Сложно СП открыть и посмотреть синтаксис метода ПолучитьЗначение?
15 avcherkasov
 
07.02.13
18:25
Спасибо, буду доделывать.
16 avcherkasov
 
08.02.13
11:24
(9) Спасибо большое GLazNik! Сделал. Вот код, может, кому пригодиться:
ТЗ.ВыбратьСтроки();
   
    ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
    ТЗ2.НоваяКолонка("Артикул");
    ТЗ2.НоваяКолонка("Товар");    
    ТЗ2.НоваяКолонка("Штрихкод");
   
    Для колонка = 1 по ТЗ.КоличествоСтрок() - 1 Цикл     //ищем построчно ТМЦ с несколькими штрихкодами
         Если (ТЗ.ПолучитьЗначение(колонка,"Артикул") = ТЗ.ПолучитьЗначение(колонка+1,"Артикул")) и (ТЗ.ПолучитьЗначение(колонка,"Штрихкод") <>  ТЗ.ПолучитьЗначение(колонка+1,"Штрихкод"))  Тогда
              ТЗ2.НоваяСтрока();
              ТЗ2.Артикул = ТЗ.ПолучитьЗначение(колонка,"Артикул");     //переносим полученные данные в новую ТЗ              
              ТЗ2.Товар = ТЗ.ПолучитьЗначение(колонка,"Товар");
              ТЗ2.Штрихкод = ТЗ.ПолучитьЗначение(колонка,"Штрихкод");
             
              ТЗ2.НоваяСтрока();
              ТЗ2.Артикул = ТЗ.ПолучитьЗначение(колонка+1,"Артикул");
              ТЗ2.Товар = ТЗ.ПолучитьЗначение(колонка+1,"Товар");
              ТЗ2.Штрихкод = ТЗ.ПолучитьЗначение(колонка+1,"Штрихкод");                    
         КонецЕсли;
    КонецЦикла;
   
    ТЗ2.ВыбратьСтроки();
    ТЗ2.Свернуть("Артикул, Товар, Штрихкод",);
   
    Пока ТЗ2.ПолучитьСтроку() <> 0 Цикл
         Арт = ТЗ2.Артикул;
         Тов = ТЗ2.Товар;
         Штрихкод = ТЗ2.ШтрихКод;
         Таб.ВывестиСекцию("Товар");              
    КонецЦикла;
17 monsterZE
 
08.02.13
11:42
хм.. а зачем свернуть, если у тебя в новой тз товары с уникальными шк? ..и сворачивают до выбратьстроки()
18 monsterZE
 
08.02.13
11:44
и если шк не может повторяться, тогда зачем
--
и (ТЗ.ПолучитьЗначение(колонка,"Штрихкод") <>  ТЗ.ПолучитьЗначение(колонка+1,"Штрихкод"))
--
а если может, то ты его в новую тз не берешь
19 Aleksey
 
08.02.13
11:45
(10) Использую ИТЗ и Сгруппировать()
20 Aleksey
 
08.02.13
11:48
ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
ИТЗ.Загрузить(ТЗ);
ИТЗ.Сгруппировать("Товар:Товар;ШтрихКод:ШтрихКод");
ИТЗ.ВыбратьСтроки();
Пока ИТЗ.ПолучитьСтроку()=1 цикл
 Если ИТЗ.тзПотомки.Количество()>1 тогда
    //У товара есть дубли
...
21 Serginio1
 
08.02.13
12:15
(16) Если бы скачал 5 то увидел бы
Процедура Вывести(Тз,Поле,ПолеДляВывода)
   Таб=СоздатьОбъект("Таблица");
   ЕстьДубли=0;
   Если Тз.КоличествоСтрок()>1 Тогда
       
       Тз.Сортировать(Поле);    
       ТемпНомер=Тз.ПолучитьЗначение(1,Поле);
       ТемпДок=Тз.ПолучитьЗначение(1,ПолеДляВывода);
       Фл=0;
       Для сч=2 по Тз.КоличествоСтрок() Цикл
           
           Наименование=Тз.ПолучитьЗначение(сч,Поле);
           ТекДок=Тз.ПолучитьЗначение(сч,ПолеДляВывода);
           Если ТемпНомер=Наименование Тогда
               ЕстьДубли=1;
               Если Фл=0 Тогда
                   Таб.ВывестиСекцию("Темп");
                   Фл=1
                   
               КонецЕсли;
               Таб.ВывестиСекцию("ТемпДог");
               
           иначе  
               ТемпНомер=Наименование;
               ТемпДок=ТекДок;
               Фл=0;
           КонецЕсли;
           
       КонецЦикла;    
   КонецЕсли;
   Если ЕстьДубли=1 Тогда
   Таб.ТолькоПросмотр(1);
   Таб.Показать();    
   КонецЕсли;
   
КонецПроцедуры  

Процедура ПриОткрытии()                
   СтатусВозврата(0);
   Если ТипЗначенияСтр(Форма.Параметр)="СписокЗначений" Тогда
       Спз=Форма.Параметр;
       Тз=Спз.Получить("Тз");
       Поле=Спз.Получить("Поле");
       ПолеДляВывода=Спз.Получить("ПолеДляВывода");
        Вывести(Тз,Поле,ПолеДляВывода)
   КонецЕсли;
   КонецПроцедуры
22 monsterZE
 
08.02.13
12:48
(21) слил (5) себе, спасибобл =)
23 1Сергей
 
08.02.13
12:48
классное слово "спасибобл". Вроде и поблагодарил, и матюкнулся...
24 monsterZE
 
08.02.13
12:51
(23) 8-D
25 avcherkasov
 
08.02.13
13:36
(17) в том то и дело, что без свернуть строки дублируются
26 monsterZE
 
08.02.13
14:54
да, верно. ты же две строки в тз заносишь.
27 monsterZE
 
08.02.13
16:15
Чет загнался на сабже.. =)
Чтоб в один проход получить таблицу с одинаковыми строками, с неизменным порядком.

   СЗ = СоздатьОбъект("СписокЗначений");
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   
   ТЗ.НоваяКолонка("Код");
   ТЗ.НоваяКолонка("Порядок");
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "111";
   ТЗ.Порядок = "1";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "111";
   ТЗ.Порядок = "2";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "111";
   ТЗ.Порядок = "3";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "222";
   ТЗ.Порядок = "4";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "222";
   ТЗ.Порядок = "5";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "333";
   ТЗ.Порядок = "6";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "444";
   ТЗ.Порядок = "7";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "444";
   ТЗ.Порядок = "8";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "444";
   ТЗ.Порядок = "9";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "555";
   ТЗ.Порядок = "10";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "555";
   ТЗ.Порядок = "11";
   ТЗ.НоваяСтрока();
   ТЗ.Код     = "666";
   ТЗ.Порядок = "12";
   
   СтрокТЗ        = ТЗ.КоличествоСтрок();
   Дубли          = 0;
   ПозицияВставки = 1;
   
   ПЗнач    = ТЗ.ПолучитьЗначение(1,"Код");
   ППорядок = ТЗ.ПолучитьЗначение(1,"Порядок");
   
   Для ъ=2 По СтрокТЗ Цикл
       ТЗнач    = ТЗ.ПолучитьЗначение(ъ,"Код");
       ТПорядок = ТЗ.ПолучитьЗначение(ъ,"Порядок");
       Если ПЗнач=ТЗнач Тогда
           СЗ.ДобавитьЗначение(ТЗнач+" "+ТПорядок);
           Дубли=1;
       Иначе
           Если Дубли=1 Тогда
               СЗ.ВставитьЗначение(ПозицияВставки,ПЗнач+" "+ППорядок);
               ПозицияВставки = СЗ.РазмерСписка()+1;
           КонецЕсли;
           ПЗнач    = ТЗнач;
           ППорядок = ТПорядок;
           Дубли    = 0;
       КонецЕсли;
   КонецЦикла;
   
   СЗ.ВыбратьЗначение(,,,,0);
28 Mikeware
 
08.02.13
16:17
(27) ИТЗ, и  количествоЗначенийКлюча()
или Группировать()
29 monsterZE
 
08.02.13
16:22
(28) так то да =) Алексей в (19)(20) предлогал
30 Mikeware
 
08.02.13
16:26
(29) ну и я о том же...
можно еще выгрузить во временную таблицу SQL (ВыполнитьSQLИзТЗ), и оттуда запросом...
можно поприменять Кнута - с его различными методами сортировки :-)
только смысл...? :-)
лениво. и неинтересно...
31 monsterZE
 
08.02.13
16:31
(30) ну мне интересно было :-Р
типа - "интересно, а можно.. ..можно" =)))
32 Mikeware
 
08.02.13
16:40
(31) наверное...
интересно - когда не знаешь,как сделать.
а когда знаешь - какая-то ленивость нездоровая наступает...