необычный код

  1. 9 г. назад

    нужно удалить строки в ТЧ по некоторому отбору.
    Как это сделано в одной из баз:

    	Для каждого СтрокаТЧ Из МояТЧ.НайтиСтроки(Новый Структура("реквизит1", ЗначениеРеквизита1)) Цикл
    			МояТЧ.Удалить(СтрокаТЧ)
    		КонецЦикла;
    

    не будет ли бесконечный цикл? по идее при каждой итерации массив получается заново, или я не прав?

    Ответы: (5) (15) (25) (32) (36)
  2. думаю, не должно. т.к. объекты, значит, идентификация по уидам

  3. не прав

  4. копрокод, но работать должен.

  5. здесь .НайтиСтроки( выполнится один раз

    Ответы: (6) (7) (9)
  6. (0) Лучше вместо Для Каждого... использовать Пока ...

    Ответы: (10)
  7. 1Сергей здесь .НайтиСтроки( выполнится один раз

    это не так.

    Ответы: (8) (9)
  8. (4) вопрос, я так понял, нев этом, а в том, что если идентификация строки будет по номеру строки, то...

  9. (6) я тоже думаю, что один раз

    Ответы: (9)
  10. (8) (6) (4) проверил. да, один раз

  11. 11.02.2015 12:50:00 отредактировано КитайскийМуй

    .

  12. странно.
    если смотреть отладчиком, то при каждой итерации отладчик заходит на строку НайтиСтроки и должен выполнять эту функцию

    Ответы: (12)
  13. Stim странно.
    если смотреть отладчиком, то при каждой итерации отладчик заходит на строку НайтиСтроки и должен выполнять эту функцию

    совершенно не факт, что он каждый раз выполняет ее.

    Но это говнокод, пораждающий скрытую ошибку. Может случиться, что итератор обнуляется, когда из списка удаляется строка, и именно поэтому может НайтиСтроки выполняться каждый раз. Лучше сохраняй строки в список значений, а потом циклом по списку - удаляй.

    Ответы: (13) (19) (48)
  14. (12)>>сохраняй строки в список значений

    клюшко детектед

    Ответы: (14) (19)
  15. (13) в клюшках обычно делают с отрицательным итератором. Список чаще в этих ваших восьмёрках используется

    Ответы: (18)
  16. (0) Строки будет удалять через одну.

    Ответы: (16)
  17. (15) скуяли???

    Ответы: (21) (22)
  18. (14)в восьмерке список редко пользуют
    православно юзать массив/соответсвие

    Ответы: (20)
  19. x86 (12)>>сохраняй строки в список значений

    клюшко детектед

    ну в массив :)

  20. (18) не принципиально

    Ответы: (24)
  21. (16) После удаления текущей - курсор будет спозиционирован на следущей и тут же натыкается на оператор КонецЦикла, который делает сдвиг курсора ещё на одну строку.

    Ответы: (23)
  22. (16) КитайскийМуй не может ошибаться.

    Ответы: (26)
  23. (21) ты бы хоть попробовал. НайтиСтроки вернёт массив, который не измениться, хоть что делай с этой табличной частью

    Ответы: (27)
  24. (20)имхо список это больше "интерфейсный объект" когда что-то нужно выбрать с пометками, как было в клюшках
    а вот с массивом и соответствием проще/удобнее работать, + читаемость кода повышается

  25. (0)соглашусь, капрокод

    так было бы правильнее

        МассивКУдалению = МояТЧ.НайтиСтроки(Новый Структура("реквизит1", ЗначениеРеквизита1));
        Для каждого СтрокаТЧ Из МассивКУдалению Цикл
                МояТЧ.Удалить(СтрокаТЧ)
            КонецЦикла;
    
    Ответы: (49)
  26. (22) Нет, он не врёт. А ошибаться - может. :)

  27. 11.02.2015 13:43:03 отредактировано КитайскийМуй

    (23) Любые действия с массивом - приводят к изменению табличной части. Разве нет?

    "НайтиСтроки() возвращает Массив из строк табличной части, соответствующих заданному условию поиска.
    Замечание! Массив хранит ссылки на строки табличной части, то есть при изменении строки в табличной части, значение в массиве тоже будет изменено."

    Ответы: (28) (29) (30) (31)
  28. (27) чиво?

  29. (27)да. это было бы точно так, если б код был:

    Массив = МояТЧ.НайтиСтроки(Новый Структура("реквизит1", ЗначениеРеквизита1)) ;
     Для каждого СтрокаТЧ Из Массив Цикл
    Массив = МояТЧ.НайтиСтроки(Новый Структура("реквизит1", ЗначениеРеквизита1)) ;
                МояТЧ.Удалить(СтрокаТЧ)
            КонецЦикла;
    Ответы: (50)
  30. (27) Таки нет, ошибся.

  31. (27)удаляешь строку в ТЧ, и в массиве какбэ остаётся "битая ссылка" на строку ТЧ

    Ответы: (32)
  32. 11.02.2015 13:55:09 отредактировано КитайскийМуй

    Получается что по (0) - на каждой иттерации цикла будет происходить выбор строк из ТЧ. Неоптимальный код.

    (31) Да, я понял свою ошибку.

    Ответы: (33)
  33. (32) опять неправ :)

    Ответы: (34)
  34. 11.02.2015 13:58:20 отредактировано КитайскийМуй

    (33) Поясни. Выборка происходит только один раз?

    Ответы: (35)
  35. (34) НайтиСтроки отработает один только раз

    Ответы: (36)
  36. (35) Ну тогда не вижу препятствий для кода в (0).

    Ответы: (42)
  37. конечен ли цикл?

    а = 10;
    Для б = 1 по а Цикл
    	а = а + 1;
    КонецЦикла;
    Ответы: (38)
  38. (37) Конечен.

    Ответы: (40)
  39. (38)проверь )

    Ответы: (41)
  40. 11.02.2015 14:23:29 отредактировано КитайскийМуй

    (40) Проверил.

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    	а = 10;
    	Для б = 1 по а Цикл
    		ОбработкаПрерыванияПользователя();
    		а = а + 1;
    		Сообщить("б= "+б);
    	КонецЦикла;
    КонецПроцедуры
    
    Ответы: (43)
  41. (36)код имеет место быть, за одним нюансом: плохо читаем

  42. (41) бардак какой-то :)
    Сообщить("б= "+б+" а= "+а);
    б= 1 а= 11
    б= 2 а= 12
    б= 3 а= 13
    б= 4 а= 14
    б= 5 а= 15
    б= 6 а= 16
    б= 7 а= 17
    б= 8 а= 18
    б= 9 а= 19
    б= 10 а= 20

    Ответы: (44) (51)
  43. (43) Ну и? Цикл-то - конечен.

    Ответы: (45)
  44. (44) да ниче, просто бардак...
    так - тоже конечный:
    Для б = 1 по а+1 Цикл

    Ответы: (46)
  45. 11.02.2015 18:16:24 отредактировано КитайскийМуй

    (45) Дык, это Сергей привёл пример, чтоб у меня возникло понимание механизма.

  46. bvn13 Может случиться, что итератор обнуляется, когда из списка удаляется строка

    с чего бы это?

  47. x86 так было бы правильнее

    и в чём отличие?

    Ответы: (52)
  48. (29) вот это точно копрокод. причём конкретный

  49. (43) никакого бардака, всё как положено

  50. (49)канонично, как рекомендует ЗАО 1С

    Ответы: (53)
  51. (52) фигня. в сабже вполне понятный код. что там себе на уме 1С держит - это не канонично, а так, как хочется 1С

  52. 12.02.2015 17:16:04 отредактировано Stim

    канонично, вчера такую же тему мою на мисте выпилил митичкин

или зарегистрируйтесь чтобы ответить!