Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Бесконечный цикл, зачем?

Бесконечный цикл, зачем?
Я
   JUST4LOL
 
09.03.21 - 05:39
Где в 1С может использоваться бесконечный цикл и для чего? Можно ли обойтись без него?
   ДенисЧ
 
1 - 09.03.21 - 05:42
Например
а) ты хочешь, чтобы тебя признали профнепригодным.
...
я) "я так вижу, ибо я художник"
   craxx
 
2 - 09.03.21 - 05:53
(0) когда ты заведомо не знаешь когда он должен закончится. Например.
И по условию из него вываливаешься.
   Irbis
 
3 - 09.03.21 - 06:02
(2)Это обычный цикл с пост или пред условием. Бесконечный — когда условие заведомо невыполнимо.
   vi0
 
4 - 09.03.21 - 06:04
(0) ну если тебе нужно чтобы он выполнялся "бесконечно" тогда не обойтись
но видимо у тебя другой случай
   Обработка
 
5 - 09.03.21 - 06:05
Пока 1=1 Цикл
 ....
....
Если Условие=1 Тогда 
Прервать
КонецЕсли;
....
....
КонецЦикла
   Irbis
 
6 - 09.03.21 - 06:12
(5) А что мешает:

Пока Не (Условие=1) Цикл?
   ДенисЧ
 
7 - 09.03.21 - 06:13
(6) А условие у тебя вычисляется в цикле. По неизвестным правилам (например, в зависимости от ввода пользователя)
   AneJIbcuH
 
8 - 09.03.21 - 06:17
Ещё всё пишут, что цикл в одну строку быстрее работает. Сам не проверял. Миф?
   craxx
 
9 - 09.03.21 - 06:21
(6) условие может быть а) вложенным; б) вычисляться в этом цикле
   Sserj
 
10 - 09.03.21 - 06:21
(8) Миф. Замеряют в отладчике, а он тратит время на переход и компиляцию к следующей строке.
   vi0
 
11 - 09.03.21 - 06:21
(8) не миф, но на тех задачах где применяется 1с вряд ли это даст полезный прирост
   vi0
 
12 - 09.03.21 - 06:23
(10) можно без отладчика замерить
   Обработка
 
13 - 09.03.21 - 06:28
(6) Условия бывают сложные составные громоздкие. Могут быть их несколько.
Тут важно читабельность.
Когда пишут что пока 1=1 цикл
сразу понятно что выход из цикла по условию и это условие объязательно выполнимая..
   Галахад
 
14 - 09.03.21 - 06:31
(13) Кстати, а почему:
Пока 1=1 Цикл
а не 
Порка Истина Цикл
например?
   Почему 1С
 
15 - 09.03.21 - 06:37
(14) Я предпочитаю вариант с Истина
   Провинциальный 1сник
 
16 - 09.03.21 - 06:38
(14) В семерке ИСТИНЫ не было
   Галахад
 
17 - 09.03.21 - 06:46
(15) (16) Понятно.
   Irbis
 
18 - 09.03.21 - 06:54
(7) Думать, выносить... короче стремиться к классике жанра. За вопросы в цикле (ввод пользователя) металлический ящик с гвоздями. Хотя я может и чего-то не догоняю, но мне ни разу такие подперевыверты не требовались.
   spectre1978
 
19 - 09.03.21 - 06:55
(0) нужен редко, считается не очень хорошим стилем программирования, также как и goto, хотя в меньшей степени. Практически всегда может быть заменен циклом с пред- или постусловием.
   Провинциальный 1сник
 
20 - 09.03.21 - 06:57
(19) Ну если так рассуждать, то и Продолжить и Прервать - тоже зло, так как нарушает принципы структурного программирования. Тем не менее, мы не математики, а прикладные программисты. И если код с нарушениями получается понятнее и эффективнее - то будем писать с нарушениями.
   ДенисЧ
 
21 - 09.03.21 - 07:01
(18) А если это вопрос не пользователю, а удалённой системе? Можно гвозди покороче и не такие ржавые?
   Irbis
 
22 - 09.03.21 - 07:13
(21) Тогда без гвоздей. Сначала нужно спросить всё что требуется, потом уже всякие циклы запускать, а то просят сами чего хотят не знают.
   Irbis
 
23 - 09.03.21 - 07:14
(20) И Продолжить и Прервать — это всё безусловные переходы. Легко реализуются при помощи гоуту, но чтобы не дразнить адептов слегка маскируют такую конструкцию.
   Почему 1С
 
24 - 09.03.21 - 07:27
(19) Кем или где считается что бесконечные циклы не очень хороший стиль программирования? Я вот про такое не знаю, хочу почитать авторитетный источник, и впредь знать
   ASU_Diamond
 
25 - 09.03.21 - 07:32
(23) Продолжить и Прервать понятно куда выходят (и без них можно обойтись, используют для читабельности кода), а гоуту надо искать куда выходит и анализировать какой код не исполняется
   Вася Теркин
 
26 - 09.03.21 - 08:00
(0) Бесконечные циклы в 1С есть, они называются Обработками ожидания.
   dmpl
 
27 - 09.03.21 - 08:05
(1) Так-то бесконечные циклы используются в типовых от 1С, поэтому а) - не вариант.
   dmpl
 
28 - 09.03.21 - 08:06
(2) Главное не предусмотреть все условия, даже невозможные, либо добавить дополнительное условие, которое срабатывает, когда произошло зацикливание.
   dmpl
 
29 - 09.03.21 - 08:08
(6) Условий может быть несколько, а при прерывании цикла могут требоваться дополнительные действия, которые зависят от причины прерывания цикла.

(8) Это верно для чистых интерпретаторов (типа BASIC на ZX-Spectrum). У 1С исполняется байт-код, там без разницы сколько строк.
   Волшебник
 
30 - 09.03.21 - 08:08
Во время бесконечного (или длительного) цикла надо возвращать управление платформе/ОС с помощью метода ОбработкаПрерыванияПользователя().

Бесконечный цикл ПОКА ИСТИНА ЦИКЛ говорит о том, что программист ещё не определился с условием выхода из цикла. Внутри цикла должно быть "Прервать" по какому-то условию.
 
 
   dmpl
 
31 - 09.03.21 - 08:10
(22) Сделай разузлование неизвестной вложенности одним обращением к БД.
   ДенисЧ
 
32 - 09.03.21 - 08:11
(27) А кто сказал, что в 1с все пейсатели профпригодны?
   Ненавижу 1С
 
33 - 09.03.21 - 08:11
(30) если цикл на стороне сервера, то куда вставлять ОбработкаПрерыванияПользователя?
   dmpl
 
34 - 09.03.21 - 08:12
(32) 1С приняла на работу, код прошел проверку, раз оказался в релизе.
   Волшебник
 
35 - 09.03.21 - 08:14
(33) У нас был случай, когда на стороне сервера была бесконечная рекурсия. Такие утопления приводят к вылету с дампом без всяких сообщений об ошибках. При этом отваливался рабочий процесс и около 50 толстых клиентов отваливались, а остальные продолжали работать. Найти ошибку было очень сложно, потому что рекурсия была из двух процедур, вызывающих друг друга.
   ДенисЧ
 
36 - 09.03.21 - 08:15
(34) Наивный...
   NorthWind
 
37 - 09.03.21 - 08:21
(29)

ЦиклРаботает = Истина;
Пока ЦиклРаботает Цикл
...
ЦиклРаботает = Условие1 И Условие2 И Условие3 И ... И Условие10;
// Опционально

Если Не ЦиклРаботает Тогда
Продолжить;
КонецЕсли;
...
КонецЦикла
   Волшебник
 
38 - 09.03.21 - 08:24
(37) Вместо "Продолжить" лучше "Прервать"
   DGorgoN
 
39 - 09.03.21 - 08:27
Вопрос: Где в типовых бесконечный цикл? Я не встречал..
Тыкните.
А вообще он много где используется и это не всегда признак плохого тона
   Волшебник
 
40 - 09.03.21 - 08:28
НадоПродолжать = Истина; 
Сч = 0; ПределСчетчика = 100000;
//...

Пока НадоПродолжать Цикл
  //...

  //штатное условие продолжения цикла

   НадоПродолжать = Условие1 И Условие2 И Условие3 И ... И Условие10;
  //...

  //страховка

   Сч = Сч+1;
   Если Сч > ПределСчетчика Тогда
      Прервать;
   КонецЕсли;
  //...

КонецЦикла
   Krendel
 
41 - 09.03.21 - 08:29
Первые упп уходили на бесконечный цикл расчёта себеса, при встречной выпуске, кстати так и появился одноимённый регистр
   NorthWind
 
42 - 09.03.21 - 08:30
(39) Смотрите (37), (40). Переделывается на предусловие на раз, и уже формально никакого "бесконечного" нет.
   Волшебник
 
43 - 09.03.21 - 08:32
(42) Условие на "ПределСчетчика" не должно срабатывать. Это аварийная страховка. Поэтому будет методически неправильно указывать его в качестве предусловия.
   Irbis
 
44 - 09.03.21 - 08:32
Существенный недостаток бесконечного цикла — изначально заложенное зацикливание, то есть если внутри тела цикла необходимо гарантировать прерывание такого цикла. В рекурсии обычно с этим борются закладывая глубину вызовов в параметры, обоснованно предполагая, что вложенность заведомо не может превышать какого-то значения. С бесконечным циклом примерно тоже самое, нужно обеспечить принудительный выход по какому-либо условию.
Вот и вся неказистость конструкции, нужно просто правильно её готовить, потренировавшись на кошках.
   Волшебник
 
45 - 09.03.21 - 08:33
(44) Теперь предлагаю обсудить запросы внутри бесконечного цикла.
   Волшебник
 
46 - 09.03.21 - 08:34
Внутри бесконечного цикла часто нужна пауза. Вот разработка, идея которой возникла из обеденной шутки
http://catalog.mista.ru/public/706204/
   Irbis
 
47 - 09.03.21 - 08:34
(45) Я столько не выпью, а если и выпью, то работать не смогу. Хотя извращение зачетное. +1
   Кирпич
 
48 - 09.03.21 - 08:40
Долбаные плоскоземельщики. То им ООП в 1с подавай, то им goto не нравится. Теперь до цикла докопались.
   Волшебник
 
49 - 09.03.21 - 08:45
(48) в 1С есть ООП
   Кирпич
 
50 - 09.03.21 - 08:46
(49) Слава богу
   TormozIT
 
51 - 09.03.21 - 08:47
(29) > без разницы сколько строк
Ты ошибаешься. https://partners.v8.1c.ru/forum/t/1134075/m/1708722
Если туда нет доступа, то тут основное продублировано https://forum.infostart.ru/forum34/topic33723/?PAGEN_1=5#message1962014
   Кирпич
 
52 - 09.03.21 - 08:58
(51) подтверждаю. чем меньше строк, тем быстрее. недавно проверяли.
   TormozIT
 
53 - 09.03.21 - 09:03
Однострочную оптимизацию я применяю только там, где это дает существенный прирост на общем фоне. Таких мест в ИР например около 20.
   ДенисЧ
 
54 - 09.03.21 - 09:07
(51) (52) (53) И на сколько тысячных долей процента это даёт прирост?
   Кирпич
 
55 - 09.03.21 - 09:10
(54) Чем больше итераций тем больше процентов
   Кирпич
 
56 - 09.03.21 - 09:10
но один хрен несущественно
   Кирпич
 
57 - 09.03.21 - 09:13
вот например
8 сек
    Для а = 1 по 10000000 цикл
        д = д + 100.50;
    КонецЦикла;


6 сек
Для а = 1 по 10000000 цикл д = д + 100.50; КонецЦикла;

   Bigbro
 
58 - 09.03.21 - 09:15
всякие проверки-прерывания на автопилоте пишу в одну строку, типа:
Если й=0 Тогда Продолжить КонецЕсли;
   novichok79
 
59 - 09.03.21 - 09:20
на самом деле в 1С есть ООП,
есть классы "справочники", "документы" - базовые классы.
а их потомков мы уже добавляем в конфигурацию.
если говорить как Java'ист, 1С = hibernate + javafx.
почему бы просто не добавить в дерево метаданных базовый класс "классы".
пусть программист добавляет туда какую хочет логику.
а так - добавьте в структуру возможность вызова процедур и функций изнутри, будет вам обычный класс.
   Волшебник
 
60 - 09.03.21 - 09:21
(59) Есть же Обработки
 
 
   Волшебник
 
61 - 09.03.21 - 09:22
От наследования уже пора отказываться. Теперь в тренде компоновка и реализация интерфейсов.
   Dzenn
 
62 - 09.03.21 - 09:23
Например, при пакетной обработке справочника:


Пока Истина Цикл

    КоличествоОбработать = 1000;
    КоличествоОбработанных = ОбработатьНоменклатуру(КоличествоОбработать);
    Если КоличествоОбработанных = 0 Тогда
        Прервать;
    КонецЕсли;

КонецЦикла;
   Волшебник
 
63 - 09.03.21 - 09:27
(62) Типичный пример опасного цикла, который может зависнуть. Функция ОбработатьНоменклатуру может брать в обработку один и тот же элемент многократно.
   Галахад
 
64 - 09.03.21 - 09:27
(58) Неужели условие выполняется большое количество раз?
   Волшебник
 
65 - 09.03.21 - 09:28
(62) Сюда можно добавить предварительный подсчёт максимального количества итераций, например, ВсегоЭлементов / РазмерПорции + 1
   Dzenn
 
66 - 09.03.21 - 09:29
(63) Не согласен, зависит от реализации. При таком подходе, при обработке элемента, вне зависимости от результата, нужно делать пометку регистр сведений, что данный элемент обработан.
   Dzenn
 
67 - 09.03.21 - 09:33
(65) ВсегоЭлементов / РазмерПорции + 1  - это относительный показатель, а выборка "ПЕРВЫЕ 1000", если это точно необработанные - абсолютный показатель. Ну и "ОбработкаПрерыванияПользователя" можно в цикл добавить, если он на клиенте.
   dmpl
 
68 - 09.03.21 - 09:59
(39) Ну, например, расчет пооперационного расписания, разузлование, регламентированные отчеты. Сделайте поиск по фразе "Пока Истина". В ERP порядка 800 таких конструкций.

(66) У 1С при таком подходе получается зацикливание, если те предположения, из которых они исходили, не выполняются.
   Fedor-1971
 
69 - 09.03.21 - 10:03
(59) Адепты ООП, по какой-то причине, забывают, что 1С хранит Объектную модель данных в Реляционной БД
и преобразование БД-1С и обратно выполняется автоматически

И как обеспечить эту радость для произвольного класса выдуманного программером? То же дать возможность самому описывать таблицы хранения? Тут уже надо иметь уверенность в высокой квалификации исполнителя, а её то и нет
   ДенисЧ
 
70 - 09.03.21 - 10:10
(69) Hibernate же эту проблему решил? И Alchemy тоже
Значит, решение существует (с) математик в отеле при пожаре.
   Dzenn
 
71 - 09.03.21 - 10:11
(68) В любом языке, а не только в 1С, бесконечный цикл зацикливается, если предположения по его выходу не выполняются ;-)
   Irbis
 
72 - 09.03.21 - 10:15
(71) И это и есть основное зло такой конструкции. А в умелых руках и хер балалайка
   Волшебник
 
73 - 09.03.21 - 10:17
(70) Есть обработки и регистры сведений. Не любите нам мозги.
   ДенисЧ
 
74 - 09.03.21 - 10:19
(73) Как данные обработки сохранить в базе данных? )))
   dmpl
 
75 - 09.03.21 - 10:22
(74) Через хранилище значения.
   Fedor-1971
 
76 - 09.03.21 - 10:26
75+ Это если потом с ними не нужно активно работать
Либо положить в регистр сведений, либо запихнуть в Ссылочные объекты (2 или более связанных по некой логике обработки)
   Исновая
 
77 - 09.03.21 - 10:26
(0) если рабдата меньше дата Тогда не оплачено
   Волшебник
 
78 - 09.03.21 - 10:32
(74) с помощью менеджера записи
   fisher
 
79 - 09.03.21 - 10:36
(0) Используется обычно, когда условие выхода проблематично анализировать в начале/конце итерации. Можно заменить на флаги, но это такой же трейдоф как и использование/неиспользование гоуту для выхода из глубокой вложенности.
   Волшебник
 
80 - 09.03.21 - 10:40
(79) Руки прочь от GOTO!
   fisher
 
81 - 09.03.21 - 10:54
Необходимость во всяких гоуту и бесконечных циклах появляется редко. Во всяких там стейт-машинах и иже с ними.
   ДенисЧ
 
82 - 09.03.21 - 10:54
(81) В стейт-машинах переходы (гото) вообще-то не нужны. Там нужен свитч. И паттерн-матчинг
   Волшебник
 
83 - 09.03.21 - 11:00
(82) switch-case — это тот же goto с выбором метки
   ДенисЧ
 
84 - 09.03.21 - 11:02
(83) Так и цикл, и если - тот же переход.
Просто подсахаренный.
   Масянька
 
85 - 09.03.21 - 11:09
Каждый настоящий программист должен в своей жизни минимум один раз написать бесконечный цикл (С)
Ответ: чтобы почувствовать себя настоящим программистом.
   Волшебник
 
86 - 09.03.21 - 11:11
(85) Языки, в которых нет бесконечных циклов, нельзя считать полноценными. Суть компьютера в том, что он постоянно крутится в бесконечном цикле, ожидая событий от пользователя или клиентов.
   Irbis
 
87 - 09.03.21 - 11:11
(84) Особенно хорошо это заметно было в программировании микрокалькулятора. Или следующий шаг программы (действие), или переход по какому либо условию.
   fisher
 
88 - 09.03.21 - 11:12
(82) В общем случае - да. Просто запутанные циклы, из которых может возникнуть потребность "выпрыгивания", чаще возникают в рамках задач, которые требуют и стейт-машин тоже. Такое у меня сложилось ощущение.
   acht
 
89 - 09.03.21 - 11:21
(88) > Просто запутанные циклы, из которых может возникнуть потребность "выпрыгивания",
А вот нехер писать запутанные циклы, которые можно отрефакторить на отдельные методы с возвратом в нужной точке.
   Garykom
 
90 - 09.03.21 - 11:30
(54) Там не доли а десятки %
Просто в платформе 1С бага с обработкой пустых строк и строк комментариев - оно при исполнении циклы по ним крутит
   fisher
 
91 - 09.03.21 - 11:34
(89) Если это будут абсолютно синтетические методы, единственная задача которых - избавиться от переходов, то большой вопрос - что из этого будет меньшим злом.
   Garykom
 
92 - 09.03.21 - 11:36
   acht
 
93 - 09.03.21 - 11:37
(91) А ты попробуй. Напиши запутанный цикл, а потом разбей его на синтетические методы. Потом отвлекись на денек, вернись и прочитай код. А вот потом уже философствуй про "большой вопрос" и "меньшее зло".
   dmpl
 
94 - 09.03.21 - 11:43
(81) В ERP без этого никуда. Там даже GOTO используется.
   fisher
 
95 - 09.03.21 - 11:44
(93) Рад встретить программиста, постигшего абсолютный дзен. А вот у разработчиков джавы не поднялась рука выпилить гоуту из циклов. Не просветлились до твоей стадии.
   Hmster
 
96 - 09.03.21 - 11:45
Окно в программе это уже по сути бесконечный цикл

//Инициализация 

Пока Истина Цикл
  //отработка событий //+проверка на закрытие окна


  //ожидание, чтобы цикл не грузил процессор, и рабочий цикл выполнялся не постоянно, а "фиксированное" количество раз в секунду

КонецЦикла;
//Завершение работы
   Serg_1960
 
97 - 09.03.21 - 11:50
Погуглил в конфигурации "Пока Истина Цикл" - использовалось около 1500 раз. «И эти люди запрещают ковыряться мне в носу»(с)
   Кирпич
 
98 - 09.03.21 - 11:51
Так никто и запрещает вроде.
   Кирпич
 
99 - 09.03.21 - 11:52
не
   Волшебник
 
100 - 09.03.21 - 11:53
Руки прочь от бесконечных циклов!
  1  2   

Список тем форума
 
Читай всё полезное и впитывай, а нападки игнорируй. Здесь так принято. aka AMIGO
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.