|   |   | 
| 
 | Придумать простой алгоритм | ☑ | ||
|---|---|---|---|---|
| 0
    
        Legj 09.01.13✎ 16:41 | 
        Коллеги, помогите придумать красивый алгоритм.
  Задача простая: нужно, чтобы пользователь вводил данные в диалог вввода строки до тех пор, пока не введет что-нибудь либо пока не откажется от ввода. Не могу придумать как обойтись без дублирования кода: получается либо ВвестиСтроку нужно два раза написать, либо два раза проверить на пустую строку. Например, вот такая какашка: Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; КонецЕсли; Пока ПустаяСтрока(НомерЗаказа) Цикл Предупреждение("Необходимо указать номер!"); Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; КонецЕсли; КонецЦикла; | |||
| 1
    
        Legj 09.01.13✎ 16:44 | 
        либо определять первое вхождение в цикл – то же уродство     | |||
| 2
    
        Мимо Проходил 09.01.13✎ 16:46 | 
        А сначала сделать пустой?
  И предупреждение после проверки? | |||
| 3
    
        Мимо Проходил 09.01.13✎ 16:47 | 
        +(2) Бесконечный цикл. Прервать по условию, иначе предупреждение     | |||
| 4
    
        Fragster гуру 09.01.13✎ 16:48 | 
        Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") ИЛИ ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла;     | |||
| 5
    
        Fragster гуру 09.01.13✎ 16:49 | 
        Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") ИЛИ ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) Тогда Возврат КонецЕсли;     | |||
| 6
    
        Fragster гуру 09.01.13✎ 16:49 | 
        вообще фиговая задача     | |||
| 7
    
        Fragster гуру 09.01.13✎ 16:49 | 
        Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") И ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) Тогда Возврат КонецЕсли;     | |||
| 8
    
        acsent 09.01.13✎ 16:50 | 
        галка номерзаказа и строка     | |||
| 9
    
        pessok 09.01.13✎ 16:50 | 
        (3) ++     | |||
| 10
    
        acsent 09.01.13✎ 16:51 | 
        (7) а где отказ?     | |||
| 11
    
        Tymoha 09.01.13✎ 16:52 | 
        Пока ПустаяСтрока(НомерЗаказа) Цикл
  ВвестиСтроку(НомерЗаказа); КонецЦикла; | |||
| 12
    
        КонецЦикла 09.01.13✎ 16:52 | 
        У чувака некислый стаж     | |||
| 13
    
        Fragster гуру 09.01.13✎ 16:52 | 
        (10) какой отказ?     | |||
| 14
    
        Tymoha 09.01.13✎ 16:54 | 
        +(11) точнее, учитывая что пользователь может отказаться
  Пока ПустаяСтрока(НомерЗаказа) Цикл Если НЕ ВвестиСтроку(НомерЗаказа)Тогда Прервать; КонецЕсли; КонецЦикла; | |||
| 15
    
        Tymoha 09.01.13✎ 16:56 | 
        хотя, задача дурная - да ... что значит пока не введет или пока не откажется?     | |||
| 16
    
        Reset 09.01.13✎ 16:57 | 
        (14)
  Пока ПустаяСтрока(НомерЗаказа) И ВвестиСтроку(НомерЗаказа) Цикл КонецЦикла; | |||
| 17
    
        Reset 09.01.13✎ 16:58 | 
        хотя (14) лучше в плане (15) - можно добавить флаг отказал ся или таки что-то ввел     | |||
| 18
    
        Нуф-Нуф 09.01.13✎ 16:59 | 
        копрокодеры детектед     | |||
| 19
    
        Reset 09.01.13✎ 17:00 | 
        (18) Дай покопрокодить в первый рабочий день     | |||
| 20
    
        Tymoha 09.01.13✎ 17:01 | 
        (19) ))))     | |||
| 21
    
        Нуф-Нуф 09.01.13✎ 17:01 | 
        вы еще динамическим обновлением воспользуйтесь     | |||
| 22
    
        Legj 09.01.13✎ 17:07 | 
        (2, 3) Строка и так сначала пустая. Предупреждение после проверки в моем примере кода ничего не меняет.
  Бесконечный цикл – да, это идея. Уже лучше получится, но всё-таки не то. | |||
| 23
    
        Legj 09.01.13✎ 17:08 | 
        (10) тонко, очень, оценил.     | |||
| 24
    
        Legj 09.01.13✎ 17:12 | 
        +(23) нет, не то, я подумал это ответ на (0) never mind     | |||
| 25
    
        Мимо Проходил 09.01.13✎ 17:16 | 
        (22) Кроме первого прохода ничего не меняет.     | |||
| 26
    
        Legj 09.01.13✎ 17:24 | 
        Пока вот такой вариант. Существенно элегантней, но не то. Слишком заумный, логически сложный алгоритм получился для такой простой задачи. Без подробного комментария читателю кода будет очень сложно въехать, что имел в виду писатель:
  НомерЗаказа = ""; Пока Истина Цикл Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; ИначеЕсли ПустаяСтрока(НомерЗаказа) Тогда Предупреждение("Необходимо указать номер!"); Иначе Прервать; КонецЕсли; КонецЦикла; | |||
| 27
    
        Reset 09.01.13✎ 17:24 | 
        (22) В смысле "не то"?
  еще версия НомерЗаказа=""; Пока ВвестиСтроку(НомерЗаказа) И ПустаяСтрока(НомерЗаказа) Цикл КонецЦикла; | |||
| 28
    
        Legj 09.01.13✎ 17:26 | 
        (27) А как выглядит решение целиком ? Если начать его додумывать, и пробовать, то окажется, что не так всё просто. Иначе бы я тему не создал.     | |||
| 29
    
        Reset 09.01.13✎ 17:27 | 
        (28) Оно там целиком. Про необходимость вывода предупреждения в (0) не было     | |||
| 30
    
        Фокусник 09.01.13✎ 17:33 | 
        рекурсию уже предлагали? :)
  
  | |||
| 31
    
        Legj 09.01.13✎ 17:34 | 
        (29) Предупреждение не обязательно. Но и без того ваше решение не рабочее. Что будет, если пользователь нажмет "Отмену"? Исполнение кода продолжится дальше, а нужно, чтобы прервалось (Возврат).     | |||
| 32
    
        acsent 09.01.13✎ 17:35 | 
        зачем делать через ввести строку? А если ошибется и нужно поправить?     | |||
| 33
    
        Reset 09.01.13✎ 17:36 | 
        (31) Про это в (0) ни слова!
  тех задание в (0): "вводил данные в диалог вввода строки до тех пор, пока не введет что-нибудь либо пока не откажется от ввода" | |||
| 34
    
        Волесвет 09.01.13✎ 17:36 | 
        кхм... в снежке вроде проверка на заполненность поля или нет?))     | |||
| 35
    
        Reset 09.01.13✎ 17:36 | 
        (31) Так что не бросайся "решение не рабочее".     | |||
| 36
    
        Reset 09.01.13✎ 17:39 | 
        Вот еще вброс: 
  (возможно, тебе "как читателю будеть въехать легче" (lol)) ~ВводимНомер: Пока ВВестиСтроку(НомерЗаказа) цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) goto ~ВводимНомер; КонецЕсли; | |||
| 37
    
        Reset 09.01.13✎ 17:40 | 
        (36) не читать, прогнал :(
  вот что значит нет опыта в таком стиле | |||
| 38
    
        Reset 09.01.13✎ 17:43 | 
        (31) Тогда в (14) Замени "прервать" на "возврат"     | |||
| 39
    
        Legj 09.01.13✎ 17:59 | 
        (30) Красиво, да. Но очень академично. В 1с как-то принято рекурсию использовать только тогда, когда это действительно единственное решение (деревья с условно бесконечным уровнем вложенности). Т.к. язык беден, нет вложенных функций. А вынос подобных алгоритмов в полновесную функцию сильно утяжеляет код.     | |||
| 40
    
        Мимо Проходил 09.01.13✎ 18:00 | 
        (39) Вам шашечки? Или ехать?     | |||
| 41
    
        Fragster гуру 09.01.13✎ 18:01 | 
        (40) если ввести пустую строку ~1500 раз - 1ска молча упадет     | |||
| 42
    
        Legj 09.01.13✎ 18:01 | 
        (33), (38) Да, предупреждение таки подразумевается, что нужно.     | |||
| 43
    
        Мимо Проходил 09.01.13✎ 18:03 | 
        (41) Если шашечки - то, что надо. Красиво. Но не функционально. :))     | |||
| 44
    
        Legj 09.01.13✎ 18:03 | 
        (41) Так вот почему вас больше часа не было в теме.     | |||
| 45
    
        Fragster гуру 09.01.13✎ 18:04 | 
        (44) нет, я работал     | |||
| 46
    
        Reset 09.01.13✎ 18:04 | 
        (42) Имхо:
  По моему, нужно быть сильным идиотом, если видеть перед собой окно с предложением ввода, которое не исчезает, если ничего не вводить и не понимать что от тебя требуют | |||
| 47
    
        Legj 09.01.13✎ 18:07 | 
        (46) Юзабилити такого решения – это другой вопрос. Но если хочется сделать именно с предупреждением, существует ли простой алгоритм, без рекурсии, без бесконечного цикла? Я вот не смог придумать, как голову не ломал, вот и полез на мисту. Возможно, таки не решаемая задача.     | |||
| 48
    
        Fragster гуру 09.01.13✎ 18:08 | 
        (47) бесконечный процесс не может быть без бесконечного цикла     | |||
| 49
    
        Reset 09.01.13✎ 18:11 | 
        доработал (26):
  НомерЗаказа = ""; СчетчикТерпения=1500; Пока Истина Цикл Если Не ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; КонецЕсли; Если Не ПустаяСтрока(НомерЗаказа) Тогда Прервать; КонецЕсли; Предупреждение("Необходимо указать номер!"); СчетчикТерпения=СчетчикТерпения-1; Если СчетчикТерпения=0 тогда Сообщить("Задолбал(а) ты меня"); Возврат; КонецЕсли; КонецЦикла; | |||
| 50
    
        Fragster гуру 09.01.13✎ 18:13 | 
        (49) почему не "Для" а "пока истина"?     | |||
| 51
    
        Reset 09.01.13✎ 18:13 | 
        (50) Не сообразил.
  см (19) | |||
| 52
    
        Legj 09.01.13✎ 18:13 | 
        (35) И не кипятитесь вы так. Я резковато оценил ваш код не намерено.     | |||
| 53
    
        Reset 09.01.13✎ 18:15 | 
        (52) я не кипятюсь. Я пытаюсь, как могу, развлекаться.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |