Имя: Пароль:
1C
1С v8
Придумать простой алгоритм
,
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) я не кипятюсь. Я пытаюсь, как могу, развлекаться.