Имя: Пароль:
1C
1C 7.7
v7: Перебор элементов справочника
0 8troyan8
 
06.09.12
15:24
Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
       
       
   Если Спр.ЭтоГруппа()=1 Тогда
           Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
           Спр.ВыбратьЭлементы();
           Пока Спр.ПолучитьЭлемент()>0 Цикл
               Спр.ТекущийЭлемент();
               Если Спр.Цена<3 Тогда
                   Спр.Удалить();
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;    
       
       Если Спр.ЭтоГруппа()=0 Тогда
           Спр.ТекущийЭлемент();
           Если Спр.Цена<3 Тогда
               Спр.Удалить();
           КонецЕсли;
       КонецЕсли;    
       

       
       КонецЦикла;
КонецПроцедуры;


Удаляет только те что в группах. Помогите.
1 DJ Anthon
 
06.09.12
15:25
а че те надо-то?
2 del123
 
06.09.12
15:25
бред какой
3 DJ Anthon
 
06.09.12
15:26
ты знаешь, что за такой код кастрируют?
4 8troyan8
 
06.09.12
15:26
Я новичек не судите строго)
5 del123
 
06.09.12
15:27
ответь на (1)
6 WoodMan
 
06.09.12
15:27
что сделать надо?
7 8troyan8
 
06.09.12
15:28
Нужно чтобы удалило цену которая меншье 3. В групах и не в групах. А удаляет только в группах... Я так понимаю что позыционирование осталось в группе.
8 Classic
 
06.09.12
15:30
(0)
Во-первых. Удаление обычно сбивает выборку
Во-вторых. Вложенную выборку лучше делать отдельной переменной
9 alex74
 
06.09.12
15:31
(8) а зачем ему вложенная выборка вообще?
10 Classic
 
06.09.12
15:33
(9)
Понятия не имею:)
11 8troyan8
 
06.09.12
15:37
Мне просто нужно чтобы удаляло элементы которые не в группах. В групах удаляються
12 Волесвет
 
06.09.12
15:38
Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
                   Если Спр.Цена<3 Тогда
                   Спр.Удалить();
               КонецЕсли;
  КонецЦикла;
КонецПроцедуры;

имхо запросом быстрее будет
13 Classic
 
06.09.12
15:38
(11)
Что значит не в группах?
14 alex74
 
06.09.12
15:39
(12) не факт что реквизит Цена есть у группы, так что надо добавить проверку
Если Спр.ЭтоГруппа() = 0 Тогда

КонецЕсли;
15 alex74
 
06.09.12
15:40
+ (12) это семерка, тут быстрее будет перебор
16 Волесвет
 
06.09.12
15:41
(14) угумс

Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
   Если Спр.ЭтоГруппа() = 0 Тогда        
     Если Спр.Цена<3 Тогда
         Спр.Удалить();
    КонецЕсли;
 КонецЕсли;
КонецЦикла;
КонецПроцедуры;
17 GreyAngel
 
06.09.12
15:41
(13) предположительно элементы первого уровня. Но, если что, телепат из меня хреновый.
18 alex74
 
06.09.12
15:43
(16) и лучше перед циклом сделать

локСпр = СоздатьОбъект("Справочник.Номенклатура");

а внутри цикла и проверок сделать

локСпр.НайтиЭлемент(Спр.ТекущийЭлемент());
локСпр.Удалить();
19 Classic
 
06.09.12
15:43
(17)
Ну оно то конечно логично. Но тогда логику первого поста я вообще не понимаю:)
20 GreyAngel
 
06.09.12
15:43
(16) А сбитая выборка вас не смущает?
21 Волесвет
 
06.09.12
15:45
(20) какая сбитая выборка? запусти и проверь все работает
22 Classic
 
06.09.12
15:45
(20)
Удалить же с нулем по дефолту? Это пометка на удаление. По идеи сбиваться не должно
23 GreyAngel
 
06.09.12
15:46
(22) Точно. Туплю. Нужно меньше работать.
24 Волесвет
 
06.09.12
15:49
ндэ
1 - непосредственное удаление
0 - пометка, по умолчанию 1
25 GreyAngel
 
06.09.12
15:52
(24) Значит два раза туплю. Пойду ка я отдыхать, пока вообще херню не сморозил. Поспорю в другой раз. :)
26 Classic
 
06.09.12
15:56
(24)
И что, не сбивается выборка?
Под рукой 7.7 нету.
27 vtolga
 
06.09.12
16:04
(26) Даже если сбивается- пару раз запустить для гарантии, и все.
28 8troyan8
 
06.09.12
16:05
Подскажите а есть какой-то метод, который при выборке будет игнорировать Группы ) Тоесть перебирало только самый верхний уровень

Например

Если Спр2.ЭтоГруппа()=1 Тогда
"Пропускаем группы"
29 alex74
 
06.09.12
16:06
(28) ты имеешь в виду Уровень() ?
30 8troyan8
 
06.09.12
16:06
Да
31 vtolga
 
06.09.12
16:06
Продолжить
32 alex74
 
06.09.12
16:08
Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");
   локСпр = СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
   Если Спр.Уровень() = 1 Тогда
       Если Спр.ЭтоГруппа() = 0 Тогда        
         Если Спр.Цена<3 Тогда
             локСпр.НайтиЭлемент(Спр.ТекущийЭлемент());
             локСпр.Удалить();
        КонецЕсли;
    КонецЕсли;
 КонецЕсли;
КонецЦикла;
КонецПроцедуры;
33 Митор
 
06.09.12
16:09
локСпр.Удалить(0);
а то запустит еще :)
34 vtolga
 
06.09.12
16:10
(32) По-моему, выборка все равно собъется (несмотря на второй объект)
35 alex74
 
06.09.12
16:11
(33) запустит - уволят - больше не будет
36 NS
 
06.09.12
16:11
У получитьэлемент() есть параметр.
И у выбратьэлементы() тоже.
37 8troyan8
 
06.09.12
16:12
Я вот написал такой бред и работает ))

Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
       
       
       Если Спр.ЭтоГруппа()=1 Тогда
           Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
           Спр.ВыбратьЭлементы();
           Пока Спр.ПолучитьЭлемент()>0 Цикл
               Спр.ТекущийЭлемент();
               Если Спр.Цена<3 Тогда
                   Спр.Удалить();
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;    
   КонецЦикла;
   
   
   
   Спр2=СоздатьОбъект("Справочник.Номенклатура");
   Спр2.ВыбратьЭлементы();
   Пока Спр2.ПолучитьЭлемент()>0 Цикл
       
       Если Спр2.ЭтоГруппа()=1 Тогда
           
       Продолжить
           
       Иначе
           Спр2.ТекущийЭлемент();
           Если Спр2.Цена<3 Тогда
               Спр2.Удалить();
           КонецЕсли;
       КонецЕсли;                
   КонецЦикла;    
   
КонецПроцедуры;
38 NS
 
06.09.12
16:15
Если Спр.ЭтоГруппа()=1 Тогда
           Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент()); // кто ж так делает?!
           Спр.ВыбратьЭлементы(0);
           Пока Спр.ПолучитьЭлемент(1)>0 Цикл
                Если спр.Этогруппа()=0 тогда
                   спр.удалить(0);
                КонецЕсли;
           КонецЦикла;
КонецЦикла;
39 Drac0
 
06.09.12
16:15
*FACEPALM*
40 alex74
 
06.09.12
16:16
тролль штоле
41 NS
 
06.09.12
16:17
Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
       Если Спр.ЭтоГруппа()=0 Тогда
            Если Спр.Цена<3 Тогда
                   Спр.Удалить();
            КонецЕсли;
       КонецЕсли;    
   КонецЦикла;
КонецПроцедуры;


вообще лучше не трогай программу. Сам не понимаешь чего творишь.
Попробуй написать комментарий к каждой своей строчке - чего ты всё таки делаешь.
42 Мимохожий Однако
 
06.09.12
16:20
(7)Что будешь делать с документами, в которых есть помеченные на удаление элементы справочника?
43 NS
 
06.09.12
16:20
(40) Очередной админ, которого невменяемое руководство заставляет писать код.
Бывает такое - наберут уборщиц в директора, а им что админ, что эникейщик, что программист, хоть писатель - один хрен, с компом же человек работает.
44 8troyan8
 
06.09.12
16:22
Я думаю что сначала своего творчества с 1С никто гением не становился
45 NS
 
06.09.12
16:28
(44) Ошибаешься. Если человек может писать - у него получается с самого начала.
46 Classic
 
06.09.12
16:30
(44)
Гением может и нет. Но открой для себя отладчик. Многие вопросы проще решить самому, чем спрашивать - толку больше будет
47 ВотЭтоДа
 
06.09.12
16:30
(46)Блин, опередил...
48 NS
 
06.09.12
16:32
Дело не в отладчике, а в бессмысленном наборе строк кода.
Тут отладчик ничем не поможет.
49 Мимо Проходил
 
06.09.12
16:32
Я чего-то не понял.
Внешний цикл по Спр. Внутри этот Спр переназначается (снова выбрать, использоватьродителя и получить) И чего ожидать? на внешний уровень уже не попадешь, имхо
50 ВотЭтоДа
 
06.09.12
16:32
(45)С эти можно поспорить
51 ВотЭтоДа
 
06.09.12
16:32
*этим
52 NS
 
06.09.12
16:33
(46)
Спр=СоздатьОбъект("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()>0 Цикл
       
       
   Если Спр.ЭтоГруппа()=1 Тогда
           Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
           Спр.ВыбратьЭлементы();
           Пока Спр.ПолучитьЭлемент()>0 Цикл
               Спр.ТекущийЭлемент();

Что ты тут в отладчике собрался смотреть? Тут ОДНА переменная. Она может одновременно иметь два разных значения?
53 NS
 
06.09.12
16:34
(50) С этим нельзя поспорить. Это прописная истина, о которых говорили еще такие мамонты как Арсак.
54 Drac0
 
06.09.12
16:35
(44) Тебе все разжевали и объяснили на примерах вплоть до полного написания кода, а ты даже думалку включать отказываешься. Сейчас у тебя получилось что то вроде инструкции хирургу: перед тем, как сделать разрез скальпелем, перенесите скальпель на 20 см вправо и сделайте глубокий надрез. Сейчас у тебя там оказался воздух и получилось лишь лишнее и неправильное движение, в следующий раз там окажется сонная артерия и капец.
55 ВотЭтоДа
 
06.09.12
16:36
(52)Сам то понял что спросил, вот эту одну переменную и надо увидеть, что в ней...
56 NS
 
06.09.12
16:38
(55) Одна переменная в двух вложенных циклах? Я то понял что я спросил.
Чтоб понять что код неверный, достаточно понять что в двух вложенных циклах используется одна и та-же переменная. И что в вложенном цикле выборкой ты сбиваешь внешнюю выборку. Тебе отладчик подскажет что спр - это одна переменная, а не две? Или отладчик тут не при чем?
57 ВотЭтоДа
 
06.09.12
16:40
(56)Возможно и поможет, у меня тоже с внимательностью порой не всё нормально, особенно когда копирую участки кода и забываю исправить...
58 Classic
 
06.09.12
16:41
(48)
Ну почему? Для человека, незнающего 1С конструкция ВыбратьЭлементы(), ПолучитьЭлемент() интуитивно вполне может означать перебор верхнего уровня.
Т.е. как для новичка в 1С мне код из (0) понятен. Другое дело, что эта конструкция работает не так. Но это уже либо объясняется кем-то, либо на практике познается
59 NS
 
06.09.12
16:42
(57) Объясни, каким образом он поможет?
И внимательность тут не при чем.
60 Classic
 
06.09.12
16:43
(52)
Отладчик покажет, что выборка дальше пойдет совершенно не так, как программист планировал.
61 alex74
 
06.09.12
16:44
(60) почитай еще раз код топикстартера. Ты думаешь, он что-то планировал, пока его писал?
62 NS
 
06.09.12
16:45
(58) Посмотри (0), посмотри (37)
И тут дело не в переборе, а в отсуствие элементарного понимания, например что такое переменная. Можно писать программы не понимая что такое переменная?
63 Мимо Проходил
 
06.09.12
16:45
(44) Можно сначала изучить инструкцию по пилотированию, а потом взлетать. Можно сначала взлететь и потом попытаться сесть.
И в том, и в другом случае начинают не асы. Но у первых шансов стать асами больше.
64 Classic
 
06.09.12
16:46
(62)
Я считаю, что это просто невнимательность. Может конечно и полное непонимание, но может быть и обычная невнимательность.
65 Мимо Проходил
 
06.09.12
16:46
(60) отладчик покажет только на текущий элемент выборки. И только. Или на его отсутствие.
66 NS
 
06.09.12
16:47
(60) Чего? А ты можешь предложить вариант, при котором отладчик покажет что выборка пошла так? Когда у тебя однаковая переменная внешнего и внутреннего цикла.
67 Мимо Проходил
 
06.09.12
16:47
(64) Это просто святая вера в универсальность копипасты
68 NS
 
06.09.12
16:49
(64) посмотри еще раз (37) внимательно.
69 Classic
 
06.09.12
16:51
(66)
Чего ты злой такой?
Отладчик покажет, что при следующем ПолучитьЭлемент() будет не тот элемент, который планировался.
Да и вообще по всей конструкции до внутреннего "Спр" при правильном анализе показаний отладчика не дойдет.
70 Classic
 
06.09.12
16:52
(68)
В (37) Он сам назвал свой код бредом :)
71 ВотЭтоДа
 
06.09.12
16:52
(68)Мне ваша позиция не понятна, если я вижу, что в коде что-то не так, я говорю так и так, а не лечу, кому чем и как надо заниматься. Вас попросили помочь, а не обсуждать способности человека...
72 NS
 
06.09.12
16:55
(69) А какой планировался? Еще раз.
У на два вложенных цикла. И естественно мы в отладчике должны смотреть значения двух переменных. Как мы посмотрим значения двух переменных в отладчике?

Допустим. Отработал внешний цикл, мы вошли в группу.

спр="Группа".

Теперь мы во внутреннем цикле хотим пробежать по элементам внутри группы.
Чему должно быть равно "спр", чтоб мы поняли что программа работает правильно?

Если она равна группе - это неправильно, так как внутренний цикл по элементам.
Если элементу - то это тоже неправильно, потому что внешний цикл по группам.

Так чего ты всё-таки хочешь увидеть в отладчике?
73 chief accountant
 
06.09.12
16:55
(71) Тык помогай, никто вроде не запрещает
74 NS
 
06.09.12
16:56
Это как раз тот случай, когда программисту в отладчике делать нечего. Человеку который сам не понимает что творит - конечно можно и в отладчик, и в ворд, и пойти покурить - толку одинаково.
75 palpetrovich
 
06.09.12
16:56
ничего не понимаю, что вы все здесь делаете? :)
задача "Нужно чтобы удалило цену которая меншье 3."  -  а удаляте Номенклатуру, пипец  :)
76 NS
 
06.09.12
16:59
Или кому-то нужно зайти в отладчик, чтоб понять что одна переменная не может одновременно принимать два разных значения?
77 Classic
 
06.09.12
17:01
(72)
Согласен. Если первым элементом будет группа, то он до вложенного "Спр" дойдет.
Но когда он так и не попадет во вторую группу, то должен будет задуматься.
П.С. Спор буду завершать. Мне сложно оправдывать незнакомого мне человека. Но для меня главной ошибкой в его коде из (0) было непонимание принципа обхода справочника, а не то, что он переменную не так обозвал.
Может потому что у меня самого пару раз ошибки с дублированием переменной выскакивали. Правда на куда большем коде, и написанные в разные временные промежутки.
78 ВотЭтоДа
 
06.09.12
17:08
(76)Кто ясно мыслит, тот ясно излагает, а не намёками, типа (36)и(40). Не можешь/хочешь помочь - проходи мимо, а не мозги промывай.. Надеюсь твой опыт с 98г кому-нибудь очень поможет...
79 chief accountant
 
06.09.12
17:13
(78) Тебе что-то не понятно: есть желание - помогай. А быковать на предмет постов NS тебе ещё рановато и по возрасту и по стажу
80 ВотЭтоДа
 
06.09.12
17:15
(79)Причём тут стаж, можно оставаться просто человеком, не прикрываясь стажем и возрастом..
81 chief accountant
 
06.09.12
17:20
(80) Стаж дает представление о компетентности в свете постов за продолжительное время. Например, по твоим постам видно, что профи ты по ОФФам
82 NS
 
06.09.12
17:21
(80) И чего ты в ветке увидел бесчеловечного?
Что если сразу всё идет не так, то не выйдет программиста из человека?
Это не я придумал. Что не нужен отладчик чтоб понять что одна переменная не может одновременно принимать два значения? :) Не смешно.

А (36) я написал не прочитав ветку, думал что в вложенные группы не входит при использоватьвладельца()/использоватьродителя()
83 ВотЭтоДа
 
06.09.12
17:22
(81)Да, мне здесь просто интересно...А остальную инфу по поисковикам удавалось до сих пор найти, очень многое из этого сайта...
84 chief accountant
 
06.09.12
17:26
(83) Т.е. сам реально здесь никому ничем не помог, так что прежде чем пости фуйню типа (71) мозг включи
85 ВотЭтоДа
 
06.09.12
17:27
(82)Например, вот это
>вообще лучше не трогай программу....
или
>Ошибаешься. Если человек может писать - у него получается с самого начала.

не стоит...это обидно, особенно для начинающего
86 chief accountant
 
06.09.12
17:28
(85) Угомонись уже
87 ВотЭтоДа
 
06.09.12
17:28
(84)В смысле, того, что мне помощь не нужна пока)
88 alex74
 
06.09.12
17:29
(75) кстати да
89 NS
 
06.09.12
17:32
(85) Может лучше уберечь человека от напрасной потери времени?
Хотя конечно-же в любом правиле бывают исключения.

И совет я всё-таки дал - попробовать прокомментировать свой код.
90 NS
 
06.09.12
17:33
(75) :)
91 ВотЭтоДа
 
06.09.12
17:39
(89)День сегодня тяжёлый) и обострённое чувство справедливости)
92 Эльниньо
 
06.09.12
17:50
(75) Причём жёстко Удалить(1), чтобы словить потом кучу битых ссылок.
93 8troyan8
 
06.09.12
17:51
(89)

Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");                   // Создаем ссылку на объект
   Спр.ВыбратьЭлементы();                                          // Выбираем элементы
   Пока Спр.ПолучитьЭлемент()>0 Цикл                               // Обходим справочник в цикле
       
       
       Если Спр.ЭтоГруппа()=1 Тогда                                //Если спр имеет группы
           Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());         // Обходим текущую Группу в цикле
           Спр.ВыбратьЭлементы();
           Пока Спр.ПолучитьЭлемент()>0 Цикл
               Спр.ТекущийЭлемент();
               Если Спр.Цена<3 Тогда
                   Спр.Удалить();
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;    
   КонецЦикла;
94 фобка
 
06.09.12
17:53
(93) не взлетит..
95 NS
 
06.09.12
17:54
У тебя опять два вложенных цикла с одной переменной.
Процедура Сформировать()
   Спр=СоздатьОбъект("Справочник.Номенклатура");                   // Создаем ссылку на объект

   Спр.ВыбратьЭлементы(0);                                          // Выбираем элементы

   Пока Спр.ПолучитьЭлемент(1)>0 Цикл // этот цикл переберет все элементы справочника
     Если спр.Этогруппа()=0 тогда // если текущий - не группа
         Если спр.цена<3 Тогда // если цена меньше трех
           спр.удалить(); // тогда удаляем
         КонецЕсли;
     КонецЕсли;
  КонецЦикла;
Конецпроцедуры
96 alex74
 
06.09.12
17:55
(95) бесполезно. Он просто не читает что ему пишут
97 NS
 
06.09.12
17:58
"Пока" внутри "пока" - это называется вложенный цикл.
За исключением очень специфичных случаев, в таких случаях используют две переменные. А у тебя одна - "спр"

Но в данном случае вложенный цикл не нужен, так как тебе явно достаточно пробежать по справочнику один раз.
98 8troyan8
 
06.09.12
17:58
Я понял..
99 MishaD
 
06.09.12
17:58
А никого не настораживает, что человек с ником ТРОЯН интересуется удалением элементов справочника ?
100 8troyan8
 
06.09.12
17:58
Спасибо ребята )
101 8troyan8
 
06.09.12
17:58
Я чет сам себя запутал
102 Мимо Проходил
 
06.09.12
18:00
(99) А еще 8-8! Не иначе хочет клюшки грохнуть, что бы потом впарить снеговиков :))
103 8troyan8
 
06.09.12
18:05
(95) Тебе отдельное огромное спасибо ) Сразу видно хорошего человека
104 Mikeware
 
06.09.12
18:09
(99)может, он молдаванин?