Имя: Пароль:
1C
1С v8
Подскажите по поиску "дублей" во вложенном цикле
0 Ковычки
 
15.05.13
11:59
Есть крайне тупой код, не понимаю где ошибка кроме ДНК ?
(удаляет и уже удаленные)

   Сп=Новый Массив;
   Харки=Справочники.ХарактеристикиНоменклатуры;
   Ном=Справочники.Номенклатура;
   Выбор=Ном.Выбрать();
   Пока Выбор.Следующий() Цикл
       Если Выбор.ЭтоГруппа Тогда
           Продолжить;
       КонецЕсли;
       ВыбХар1=Харки.Выбрать(,Выбор.Ссылка);
       Пока ВыбХар1.Следующий() Цикл
           Хар1=ВыбХар1.ПолучитьОбъект();
           Если Хар1.ПометкаУдаления Тогда
               Продолжить;
           КонецЕсли;
           ВыбХар2=Харки.Выбрать(,Выбор.Ссылка);
           Пока ВыбХар2.Следующий() Цикл
               Хар2=ВыбХар2.ПолучитьОбъект();
               Если Хар2.ПометкаУдаления Тогда
                   Продолжить;
               КонецЕсли;
               Если (СтрЗаменить(Хар2.Наименование," ","")=СтрЗаменить(Хар1.Наименование," ","")) и (Не Хар2.Ссылка=Хар1.Ссылка) Тогда
                   Сп.Очистить();
                   Сп.Добавить(Хар2.Ссылка);
                   ТЗ=НайтиПоСсылкам(Сп);
                   Если ТЗ.Количество()<1 Тогда
                       Хар2.УстановитьПометкуУдаления(Истина);
                       //ТЗ.ВыбратьСтроку();
                       Сообщить(Выбор.Наименование + " == " + Хар1.Наименование+" == " +Хар2.Наименование);
                   КонецЕсли;
               КонецЕсли;
               ОбработкаПрерыванияПользователя();
           КонецЦикла;
           ОбработкаПрерыванияПользователя();
       КонецЦикла;
       ОбработкаПрерыванияПользователя();
   КонецЦикла;
1 Laerys
 
15.05.13
12:18
(0) Чутка подробнее проблему можно описать?)
2 Ковычки
 
15.05.13
12:25
В коде во вложенном цикле есть УтановитьПометкуУдаления и Продолжить если элемент помечен на удаление, но при выполнении помеченные на удаления (в этом коде) не пропускаются, а так же попадают в проверку.
3 H A D G E H O G s
 
15.05.13
12:28
Надо же.
Сам Смахабр пишет копрокот. Неожидал.
4 User_Agronom
 
15.05.13
12:32
Цикл по всему справочнику номенклатуры? Жестоко.

Предположу:
Команду
Сп=Новый Массив;
Поставь вместо
Сп.Очистить();

У меня было что-то похожее. Метод массива очистить не всегда отрабатывает. Т.е. часто отрабатывает как-то странно.
5 Laerys
 
15.05.13
12:34
ВыбХар1=Харки.Выбрать(,Выбор.Ссылка);
       Пока ВыбХар1.Следующий() Цикл
           Хар1=ВыбХар1.ПолучитьОбъект();
           Если Хар1.ПометкаУдаления Тогда
               Продолжить;
           КонецЕсли;
           ВыбХар2=Харки.Выбрать(,Выбор.Ссылка);

мб из-за этого: ВыбХар2 и Выбхар1 получаются одинаковые, и дважды получаются
6 mikecool
 
15.05.13
12:34
(3) да. что то он в последнее время заработался )))
7 Laerys
 
15.05.13
12:36
(4) Примерно так же использовал массив для поиска ссылок, очистка массива отрабатывала нормально.
8 Ковычки
 
15.05.13
12:40
(3)(6) почему бы и нет, восьмерку не знаю, а надо разово и на коленке
9 User_Agronom
 
15.05.13
12:40
(7) Год назад дело было. Поправили может быть.
Но он в некоторых случаях отрабатывал правильно, в некоторых нет. При пошаговом проходе было видно, что массив не очищался.
От чего зависило так и не понял. Были обработки, где работало правильно
10 Ковычки
 
15.05.13
12:41
(5) пусть одинаковые, но утановитьпометку не отрабатывает "как бы".
11 Ковычки
 
15.05.13
12:43
(9) не изменилось, да и ссылки оно верно находит
походу буду исправляться по совету бывалых (3) и (6)
12 Laerys
 
15.05.13
12:55
13 Ковычки
 
15.05.13
13:04
(12) бред, про объяснения.

сменил копрокод на еще копрее

Хар2.ПометкаУдаления=Истина;
Хар2.Записать();

но ни

Если Хар1.ПометкаУдаления Тогда
   Продолжить;
КонецЕсли;

ни

Если Хар2.ПометкаУдаления Тогда
   Продолжить;
КонецЕсли;

не отрабатывают. Краем глаза слыхал про всякое кэширование в восьмерке - это не оно ? (не взирая на копрость сабжа, нормальный человек посчитает, что код рабочий)
14 Ковычки
 
15.05.13
13:04
Вывод сообщить


БС ШБ/К.10.01.10 == Вишня- 3 == Вишня-3
БС ШБ/К.10.01.10 == Вишня-3 == Вишня- 3
БС ШБ/К.10.01.10 == Милан - 3 == Милан-3
БС ШБ/К.10.01.10 == Милан-3 == Милан - 3
Выполнение прервано пользователем!
15 Ковычки
 
15.05.13
13:08
поменял на удаление внешней выборки вместо внутренней, все стало работать - объясните данный бред ?!

Хар1.ПометкаУдаления=Истина;
Хар1.Записать();
16 Ковычки
 
15.05.13
13:12
+(15)
Ну и конечно
Сп.Добавить(Хар2.Ссылка);
поменял на
Сп.Добавить(Хар1.Ссылка);
17 wms
 
15.05.13
13:14
зачем у объекта см. пометка удаления?
Хар1=ВыбХар1.ПолучитьОбъект();
           Если Хар1.ПометкаУдаления Тогда
               Продолжить;
           КонецЕсли;
можно же сразу у ссылки
18 Ковычки
 
15.05.13
13:15
(17) сперва была ссылка, после стал объект, все монописуарно
19 wms
 
15.05.13
13:15
тем более потом опять из этого объекта получаешь ссылку...
20 wms
 
15.05.13
13:15
в том то и дело что писсуарно
21 Ковычки
 
15.05.13
13:15
(20) читай (18)
22 Ковычки
 
15.05.13
13:16
в (18) речь о коде, сперва не парился с получением объекта, после увидев непонятное поведение, начал получать объекты "для верности"
23 Ковычки
 
15.05.13
13:17
+ лучьше поясните результат (15) и (16) - в чем разница Хар2 и Хар1 в сабже ?
24 wms
 
15.05.13
14:24
(15)кеш почисти
25 Ковычки
 
15.05.13
14:27
(24) и что теперь его на каждый чих чистить ?
хотя при замене как в (15)(16) сто раз проверено все ок, а наоборот не работает.
Должно быть ясное объяснение такого поведения.
26 France
 
15.05.13
14:30
УстановитьПометкуУдаления, а не
ПометкаУдаления = Истина...
27 France
 
15.05.13
14:31
(26) не, не туда посмотрел))..
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн