|
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)может, он молдаванин?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |