Имя: Пароль:
1C
1С v8
Циклы пребор значений
0 karpos
 
14.11.13
09:57
Всем привет помогите. Есть спецификаций их много по количеству а типов мало мне нужно в цикле перебрать все спецификаций и вывести только те которые не совпадают с предыдущими. То есть мне нужно сравнить текущий элемент с предыдущим и не вылезти за границы массива. Вот что делаю я

Для Индекс = 0 По ВыборкаДетальныеЗаписи.Количество() - 1 Цикл

Если Индекс = 0 Тогда
     Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
     Индекс = Индекс + 1;
  КонецЕсли;    
  Если ВыборкаДетальныеЗаписи[Индекс].Спецификация <> ВыборкаДетальныеЗаписи[Индекс - 1].Спецификация Тогда
     Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
  КонецЕсли;

КонецЦикла;

Вот но тут есть косяк я по всякому пробовал суть его такая если элемент 0 и 1 одинаковые все будет работать а если
они разные он выведется с первым если и со вторым.
Еще раз повторюсь мне нужно первый сравнить с предыдущим или со следующим и при этом не выйти за границы массива.
1 karpos
 
14.11.13
09:59
Для Индекс = 0 По ВыборкаДетальныеЗаписи.Количество() - 1 Цикл

  Если Индекс = 0 Тогда
     Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
     Индекс = Индекс + 1;
  КонецЕсли;    
  Если ВыборкаДетальныеЗаписи[Индекс].Спецификация <> ВыборкаДетальныеЗаписи[Индекс - 1].Спецификация Тогда
     Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
  КонецЕсли;

КонецЦикла;
2 Maxus43
 
14.11.13
10:00
ТЗ обходи, зачем выборку? или это ТЗ у тебя?
3 karpos
 
14.11.13
10:02
ТЗ нужно так. я давно что то подобное делал измучил мозг не получает. Эх раньше со мной был Зеркин (мега мозг) а теперь сам. Знаю что так точно можно.
4 Maxus43
 
14.11.13
10:04
Для Индекс = 1 По ТЗ.Количество() Цикл //сравнение с предыдущим
Если ТЗ[Индекс].Поле = ТЗ[Индекс-1].Поле Тогда
5 karpos
 
14.11.13
10:08
так то у меня тоже самое
6 karpos
 
14.11.13
10:08
это не верный вариант 0 - 1 = - 1 массив вышел за границы
7 karpos
 
14.11.13
10:09
проверять еще условием на 0 тоже не вариант
8 Maxus43
 
14.11.13
10:10
какой 0-1? читай вниметельней, не с 0, а с 1 цикл начинается
9 Maxus43
 
14.11.13
10:11
Для Индекс = 1 По ТЗ.Количество()+1 Цикл

так правильней
10 perec1982
 
14.11.13
10:12
Для чего все это делается?
11 George Wheels
 
14.11.13
10:26
(9) Для Индекс = 1 По ТЗ.Количество()-1
12 George Wheels
 
14.11.13
10:28
(0) А если десятая и сотая записи совпадают?
13 Maxus43
 
14.11.13
10:28
(11) +1 именно, посчитай
14 karpos
 
14.11.13
10:30
Maxus43 спасибо что так быстро откликнулся, но не то это
Для Индекс = 1 По ТЗ.Количество()+1 Цикл  ты увеличил границы массива а в массиве значений меньше, вообщем ошибка вышел за границы массива.
15 George Wheels
 
14.11.13
10:30
(13) В ТЗ 10 записей
Последний индекс = 9.

По твоему получится так
Для Индекс = 1 По 11 Цикл
16 Maxus43
 
14.11.13
10:34
(14)(15) упс, согласен) ТЗ.Количество()-1, всё прально
17 karpos
 
14.11.13
10:35
Эта запись сделана не просто так Для Индекс = 0 По ВыборкаДетальныеЗаписи.Количество() - 1 Цикл тут минус один знаешь что делает в моем массиве 25 значений но от 0 - 24
а функция количество говорит что массив должен идти 25 раз, поэтому стоит мунус 1. 25 - 1 = 24 от 0 да 24 тогда все нормик. А ты предлагаешь + 1 сделать в массиве не будет такого значения он выдаст ошибку это тогда надо в массив записать пустое значение.
18 karpos
 
14.11.13
10:36
блин я тут писал столько а ты уже написал что согласен. )))
19 karpos
 
14.11.13
10:37
я просто второй день эту хрень делаю чувствую себя лошарой.
20 Maxus43
 
14.11.13
10:41
ну не с 0 иди, а с 1, тогда с предыдущим сравнивать будешь номрально, это ж просто логика
21 karpos
 
14.11.13
10:52
я если в нулевом лежит не такой как в первом тоесть 0 и 1 разные
22 Maxus43
 
14.11.13
10:55
дак юзая
Если ТЗ[Индекс].Поле = ТЗ[Индекс-1].Поле Тогда

это и будет первая проверка 0 и 1 строки
23 George Wheels
 
14.11.13
11:07
(21) Вроде сегодня ещё не пятница:)
24 karpos
 
14.11.13
11:29
ну ну блин кривой вариант все равно
25 karpos
 
14.11.13
11:31
0 с 1 сравнит если они одинаковые он не выводит значение, нулевое ввести ранее. а если разные то выводит, а 0 вывелся ранее в условие выше
26 karpos
 
14.11.13
11:31
в принципе да годится
27 Ненавижу 1С
 
гуру
14.11.13
11:31
(0) может это все в запросе сделать?
28 karpos
 
14.11.13
11:32
просто тут другой вариант посоветовали он мне больше понравился сейчас попробую напишу
29 karpos
 
14.11.13
12:26
Короче вот так я решил  Maxus43

Спецификация =  Новый Массив;
    Для Индекс = 0 По ВыборкаДетальныеЗаписи.Количество() - 1 Цикл
        
        Если Индекс = 0 Тогда
            Спецификация.Добавить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
            Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
        КонецЕсли;
        
        Если ВыборкаДетальныеЗаписи[Индекс].Спецификация <> Спецификация[Спецификация.Количество()-1] Тогда
                         Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
             Спецификация.Добавить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);    
        КонецЕсли;
    КонецЦикла;

вот я заел еще один массив при 0 кладу туда запись вывожу текущую а потом сравниваю текущий элемент массива с с тем который я положил в другой если они одинаковы ничего происходит а если они разные выводится текущий(новый) и в созданный мною массив заносится новое значение.
30 karpos
 
14.11.13
12:28
Использовать мне еще один массив подсказала девушка секретарь на обеде. от этого кошки скребут на душе.
31 karpos
 
14.11.13
12:29
если кто то знает вариант по проще скажите напишите я за вас за здравие свечку поставлю.
32 M_Flint
 
14.11.13
12:37
Для Индекс = 1 По ВыборкаДетальныеЗаписи.Количество() - 1 Цикл
        
      
        Если ВыборкаДетальныеЗаписи[Индекс].Спецификация <> ВыборкаДетальныеЗаписи[Индекс-1].Спецификация Тогда
                         Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
        КонецЕсли;
    КонецЦикла;
33 Ненавижу 1С
 
гуру
14.11.13
12:38
(30) срочно переводите девочку в отдел ИТ!
34 Ненавижу 1С
 
гуру
14.11.13
12:38
(31) спасибо, не надо
35 karpos
 
14.11.13
12:45
M_Flint не будет так работать твой массив выйдет за границы массива он начинается с 0. индекс 0 - 1 = -1 такого индекса нет в массиве.
36 karpos
 
14.11.13
12:45
да девочку давно надо переводить в наш отдел а меня нах отсюда  )))
37 karpos
 
14.11.13
12:46
ну как минимум я не один такой наш уже трое.
38 sirsp
 
14.11.13
12:54
(29) Массив лишний:

Спецификация = неопределено;
Для Индекс = 0 По ВыборкаДетальныеЗаписи.Количество() - 1 Цикл
    Если Спецификация <> ВыборкаДетальныеЗаписи[Индекс].Спецификация Тогда
        Сообщить(ВыборкаДетальныеЗаписи[Индекс].Спецификация);
    КонецЕсли;
    Спецификация = ВыборкаДетальныеЗаписи[Индекс].Спецификация;
КонецЦикла;
39 M_Flint
 
14.11.13
12:58
(35) я сделала цикл со второго элемента в массиве(индекс у него =1), поэтому за границы не выйдет. при первом прохождении цикла будут сравниваться элементы №1 и №2, индексы у них соответственно 0 и 1.
41 karpos
 
14.11.13
13:03
со всеми не надо они в запросе уже группируется если одинаковые
42 Ненавижу 1С
 
гуру
14.11.13
13:04
(41) то есть они все разные точно, тогда зачем?
43 karpos
 
14.11.13
13:07
они не разные они что то типа 11111111234455555666666779 и надо вывести без повторения такого не бывает 111122222333311144445567
44 Ненавижу 1С
 
гуру
14.11.13
13:13
(43) может реально сгруппировать в запросе?
45 karpos
 
14.11.13
13:15
не надо.
46 karpos
 
14.11.13
13:17
мне я просто там выбираю какие материалы относят к этой спецификаций чтоб не делать запрос по каждой я перебираю их в цикле.
47 karpos
 
14.11.13
13:43
sirsp блин спасибо тебе огромное ваще ваще крутяк и просто.
48 karpos
 
14.11.13
13:43
тут ваще можно плюсануть????
Программист всегда исправляет последнюю ошибку.