Имя: Пароль:
1C
1C 7.7
v7: Одинаковые строки ТЧ!
0 Aleksei_Pro
 
15.08.11
09:18
Подскажите как правильно определить одинаковые строки ТЧ документа по 3 параметрам (ФИО,дата,и некий N показатель).?
1 Rie
 
15.08.11
09:19
(0) Отсортируй и сравни соседние.
2 Aleksei_Pro
 
15.08.11
09:21
Вот я так сделал, никак нельзя оптимизировать:
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   ВыгрузитьТабличнуюЧасть(ТЗ);
   ТЗ.Сортировать("Абонент,ДатаПоказаний,Счетчик");
   ТЗисх = СоздатьОбъект("ТаблицаЗначений");
   ТЗисх.НоваяКолонка("Абонент");
   
   ТЗ.ВыбратьСтроки();
   аб = "";пок = ""; сч = "";НомерСтрокиП ="";
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       Если  (ТЗ.Абонент = аб) и (тз.ДатаПоказаний = пок) и (тз.Счетчик = сч )Тогда
           ТЗисх.НоваяСтрока();
           ТЗисх.Абонент = ТЗ.Абонент;
           аб = ТЗ.Абонент;пок=тз.ДатаПоказаний;сч=тз.Счетчик;НомерСтрокиП = НомерСтрокиП + 1;
           Продолжить;
       Иначе
           аб = ТЗ.Абонент;пок=тз.ДатаПоказаний;сч=тз.Счетчик;НомерСтрокиП = НомерСтрокиП + 1;
       КонецЕсли;
   КонецЦикла;
   
   Если ТЗисх.КоличествоСтрок() > 0  Тогда
       Ответ = Вопрос("В табличной части документа обнаружены повторяющиеся абоненты.Продолжить проведение документа?",1,60);
       Если Ответ = 2 Тогда
           ТЗисх.ВыбратьСтроки();
           Пока ТЗисх.ПолучитьСтроку() = 1 Цикл
               Сообщить("Повторяющиеся абоненты: " + ТЗисх.Абонент);
           КонецЦикла;
           СтатусВозврата(0);
           Возврат;
       КонецЕсли;
   КонецЕсли;
3 1Сергей
 
15.08.11
09:50
ТЗ = СоздатьОбъект("ТаблицаЗначений");
   ВыгрузитьТабличнуюЧасть(ТЗ);
   Если ТЗ.КоличествоСтрок()>1 Тогда
       Для идн=1 по (ТЗ.КоличествоСтрок()-1) Цикл
           ТЗ.ПолучитьСтрокуПоНомеру(идн);
           ТекАбонент = ТЗ.Абонент;
           ТекДатаПоказаний = ТЗ.ДатаПоказаний;
           ТекСчетчик = ТЗ.Счетчик;
           Для идн2 = идн по ТЗ.КоличествоСтрок() Цикл
               ТЗ.ПолучитьСтрокуПоНомеру(идн2);
               Если (ТЗ.Абонент = ТекАбонент)
               И (ТЗ.ДатаПоказаний = ТекДатаПоказаний)
               И (ТЗ.Счетчик = ТекСчетчик)
               Тогда
                   Предупрежждение("Совпадают строки ("+идн+") и ("+идн2+")");
                   СтатусВозврата(0);
                   Возврат;
           КонецЦикла;
       КонецЦикла;
   КонецЕсли;
4 1Сергей
 
15.08.11
09:51
* Для идн2 = (идн+1) по ТЗ.КоличествоСтрок() Цикл
5 zak555
 
15.08.11
09:52
(3) ужас
6 Rie
 
15.08.11
09:52
(2) А зачем таскать строки? Заведи список Повторы и заноси туда строки при выполнении условия.
Если скажет, что повторы не нужны - удали по списку.
7 1Сергей
 
15.08.11
09:53
(5) ы?
8 Rie
 
15.08.11
09:53
(3) Ну и зачем тут вложенный цикл? (Выгрузить, отсортировать, нужны номера строк документа - в ТЗ для этого имеется одноименная колонка).
9 FN
 
15.08.11
09:54
(0) Сделай новую колонку "ключ", туда установи ФИО+дата+некийNпоказатель, потом свернуть.
либо обход ТЗ + занесесение "ключа" в СП + проверка .
10 1Сергей
 
15.08.11
09:55
(8) сортировка - лишний тормоз
11 Rie
 
15.08.11
09:56
(10) Сортировка - n log n.
Вложенный цикл - n^2.
Так что кто тут тормоз...
12 AeDen
 
15.08.11
09:56
тебе номера одинаковых, или просто узнать что есть одинаковые строки?
13 1Сергей
 
15.08.11
09:59
(11) Первый цикл выполняется N-1 раз а вложенный каждый раз на единицу меньше
14 Rie
 
15.08.11
10:00
(13) Итого = n*(n-1)/2 = O(n^2).
15 1Сергей
 
15.08.11
10:01
(14) идите в опу. У меня проще и наглядней
16 __Se24
 
15.08.11
10:02
выгрузи в ТЗ нужные колонки , добавь колонку числовую , заполни "1" потом сверни по нужным колонкам , где индексы будут больше 1 , там есть повторы
17 1Сергей
 
15.08.11
10:02
(16) а номера строк как потом искать?
18 __Se24
 
15.08.11
10:03
потом пойдет по таблице , с уже известными значениями ключевых колонок
19 Rie
 
15.08.11
10:05
(17) Судя по (2), номера строк там и даром не нужны.

Кстати, о (2). Смертная казнь за использование Вопрос() в модуле документа уже отменена? Если да - то зря...
20 mikecool
 
15.08.11
10:06
(17) проще - не допускать дубликатов на момент вноса информации
21 1Сергей
 
15.08.11
10:06
(19) (20) я так понял, это модуль формы. Потому что в типовых это проверяется именно там
22 Aleksei_Pro
 
15.08.11
10:06
Спасибо всем, ветка закрыта!
23 AeDen
 
15.08.11
11:04
(16) Проще сравнито количество строк в ТЗ после свертки и количество строк в ТЧ - можно будет увидеть, что есть повторяющиеся строки.
24 Grusswelle
 
15.08.11
11:14
Уж0снах!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший