Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Придумать простой алгоритм

Придумать простой алгоритм
Я
   Legj
 
09.01.13 - 16:41
Коллеги, помогите придумать красивый алгоритм.

Задача простая: нужно, чтобы пользователь вводил данные в диалог вввода строки до тех пор, пока не введет что-нибудь либо пока не откажется от ввода.

Не могу придумать как обойтись без дублирования кода: получается либо ВвестиСтроку нужно два раза написать, либо два раза проверить на пустую строку.
Например, вот такая какашка:
Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда
    Возврат;
КонецЕсли;
Пока ПустаяСтрока(НомерЗаказа) Цикл
    Предупреждение("Необходимо указать номер!");
    Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда
        Возврат;
    КонецЕсли;
КонецЦикла;
 
 
   Legj
 
1 - 09.01.13 - 16:44
либо определять первое вхождение в цикл – то же уродство
   Мимо Проходил
 
2 - 09.01.13 - 16:46
А сначала сделать пустой?
И предупреждение после проверки?
   Мимо Проходил
 
3 - 09.01.13 - 16:47
+(2) Бесконечный цикл. Прервать по условию, иначе предупреждение
   Fragster
 
4 - 09.01.13 - 16:48
Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") ИЛИ ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла;
   Fragster
 
5 - 09.01.13 - 16:49
Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") ИЛИ ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) Тогда Возврат КонецЕсли;
   Fragster
 
6 - 09.01.13 - 16:49
вообще фиговая задача
   Fragster
 
7 - 09.01.13 - 16:49
Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") И ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) Тогда Возврат КонецЕсли;
   acsent
 
8 - 09.01.13 - 16:50
галка номерзаказа и строка
   pessok
 
9 - 09.01.13 - 16:50
(3) ++
   acsent
 
10 - 09.01.13 - 16:51
(7) а где отказ?
 
 Рекламное место пустует
   Tymoha
 
11 - 09.01.13 - 16:52
Пока ПустаяСтрока(НомерЗаказа) Цикл
ВвестиСтроку(НомерЗаказа);
КонецЦикла;
   КонецЦикла
 
12 - 09.01.13 - 16:52
У чувака некислый стаж
   Fragster
 
13 - 09.01.13 - 16:52
(10) какой отказ?
   Tymoha
 
14 - 09.01.13 - 16:54
+(11) точнее, учитывая что пользователь может отказаться
Пока ПустаяСтрока(НомерЗаказа) Цикл
Если НЕ ВвестиСтроку(НомерЗаказа)Тогда
Прервать;
КонецЕсли;
КонецЦикла;
   Tymoha
 
15 - 09.01.13 - 16:56
хотя, задача дурная - да ... что значит пока не введет или пока не откажется?
   Reset
 
16 - 09.01.13 - 16:57
(14)
Пока ПустаяСтрока(НомерЗаказа) И ВвестиСтроку(НомерЗаказа) Цикл
КонецЦикла;
   Reset
 
17 - 09.01.13 - 16:58
хотя (14) лучше в плане (15) - можно добавить флаг отказал ся или таки что-то ввел
   Нуф-Нуф
 
18 - 09.01.13 - 16:59
копрокодеры детектед
   Reset
 
19 - 09.01.13 - 17:00
(18) Дай покопрокодить в первый рабочий день
   Tymoha
 
20 - 09.01.13 - 17:01
(19) ))))
   Нуф-Нуф
 
21 - 09.01.13 - 17:01
вы еще динамическим обновлением воспользуйтесь
   Legj
 
22 - 09.01.13 - 17:07
(2, 3) Строка и так сначала пустая. Предупреждение после проверки в моем примере кода ничего не меняет.
Бесконечный цикл – да, это идея. Уже лучше получится, но всё-таки не то.
   Legj
 
23 - 09.01.13 - 17:08
(10) тонко, очень, оценил.
   Legj
 
24 - 09.01.13 - 17:12
+(23) нет, не то, я подумал это ответ на (0) never mind
   Мимо Проходил
 
25 - 09.01.13 - 17:16
(22) Кроме первого прохода ничего не меняет.
   Legj
 
26 - 09.01.13 - 17:24
Пока вот такой вариант. Существенно элегантней, но не то. Слишком заумный, логически сложный алгоритм получился для такой простой задачи. Без подробного комментария читателю кода будет очень сложно въехать, что имел в виду писатель:

НомерЗаказа = "";
Пока Истина Цикл
    Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда
        Возврат;
    ИначеЕсли ПустаяСтрока(НомерЗаказа) Тогда
        Предупреждение("Необходимо указать номер!");
    Иначе
        Прервать;
    КонецЕсли;
КонецЦикла;
   Reset
 
27 - 09.01.13 - 17:24
(22) В смысле "не то"?

еще версия
НомерЗаказа="";
Пока ВвестиСтроку(НомерЗаказа) И ПустаяСтрока(НомерЗаказа) Цикл КонецЦикла;
   Legj
 
28 - 09.01.13 - 17:26
(27) А как выглядит решение целиком ? Если начать его додумывать, и пробовать, то окажется, что не так всё просто. Иначе бы я тему не создал.
   Reset
 
29 - 09.01.13 - 17:27
(28) Оно там целиком. Про необходимость вывода предупреждения в (0) не было
   Фокусник
 
30 - 09.01.13 - 17:33
рекурсию уже предлагали? :)

Функция ВвестиНомерНакладной(НомерЗаказа = "")
    
    ВвестиСтроку(НомерЗаказа, "Номер накладной");
    
    Если ПустаяСтрока(НомерЗаказа) Тогда
        Предупреждение("Необходимо указать номер!");
        ВвестиНомерНакладной(НомерЗаказа);
    КонецЕсли;
    
    Возврат НомерЗаказа;
    
КонецФункции

НомерЗаказа = ВвестиНомерНакладной();
Сообщить("Номер заказа: " + НомерЗаказа);

   Legj
 
31 - 09.01.13 - 17:34
(29) Предупреждение не обязательно. Но и без того ваше решение не рабочее. Что будет, если пользователь нажмет "Отмену"? Исполнение кода продолжится дальше, а нужно, чтобы прервалось (Возврат).
   acsent
 
32 - 09.01.13 - 17:35
зачем делать через ввести строку? А если ошибется и нужно поправить?
   Reset
 
33 - 09.01.13 - 17:36
(31) Про это в (0) ни слова!
тех задание в (0):
"вводил данные в диалог вввода строки до тех пор, пока не введет что-нибудь либо пока не откажется от ввода"
 
 
   Волесвет
 
34 - 09.01.13 - 17:36
кхм... в снежке вроде проверка на заполненность поля или нет?))
   Reset
 
35 - 09.01.13 - 17:36
(31) Так что не бросайся "решение не рабочее".
   Reset
 
36 - 09.01.13 - 17:39
Вот еще вброс:
(возможно, тебе "как читателю будеть въехать легче" (lol))

~ВводимНомер:
Пока ВВестиСтроку(НомерЗаказа) цикл; КонецЦикла;
Если ПустаяСтрока(НомерЗаказа) goto ~ВводимНомер; КонецЕсли;
   Reset
 
37 - 09.01.13 - 17:40
(36) не читать, прогнал :(
вот что значит нет опыта в таком стиле
   Reset
 
38 - 09.01.13 - 17:43
(31) Тогда в (14) Замени "прервать" на "возврат"
   Legj
 
39 - 09.01.13 - 17:59
(30) Красиво, да. Но очень академично. В 1с как-то принято рекурсию использовать только тогда, когда это действительно единственное решение (деревья с условно бесконечным уровнем вложенности). Т.к. язык беден, нет вложенных функций. А вынос подобных алгоритмов в полновесную функцию сильно утяжеляет код.
   Мимо Проходил
 
40 - 09.01.13 - 18:00
(39) Вам шашечки? Или ехать?
   Fragster
 
41 - 09.01.13 - 18:01
(40) если ввести пустую строку ~1500 раз - 1ска молча упадет
   Legj
 
42 - 09.01.13 - 18:01
(33), (38) Да, предупреждение таки подразумевается, что нужно.
   Мимо Проходил
 
43 - 09.01.13 - 18:03
(41) Если шашечки - то, что надо. Красиво. Но не функционально. :))
   Legj
 
44 - 09.01.13 - 18:03
(41) Так вот почему вас больше часа не было в теме.
   Fragster
 
45 - 09.01.13 - 18:04
(44) нет, я работал
   Reset
 
46 - 09.01.13 - 18:04
(42) Имхо:
По моему, нужно быть сильным идиотом, если видеть перед собой окно с предложением ввода, которое не исчезает, если ничего не вводить и не понимать что от тебя требуют
   Legj
 
47 - 09.01.13 - 18:07
(46) Юзабилити такого решения – это другой вопрос. Но если хочется сделать именно с предупреждением, существует ли простой алгоритм, без рекурсии, без бесконечного цикла? Я вот не смог придумать, как голову не ломал, вот и полез на мисту. Возможно, таки не решаемая задача.
   Fragster
 
48 - 09.01.13 - 18:08
(47) бесконечный процесс не может быть без бесконечного цикла
   Reset
 
49 - 09.01.13 - 18:11
доработал (26):

НомерЗаказа = "";
СчетчикТерпения=1500;
Пока Истина Цикл
    
    Если Не ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда
        Возврат;
    КонецЕсли;
    Если Не ПустаяСтрока(НомерЗаказа) Тогда
        Прервать;
    КонецЕсли;
    Предупреждение("Необходимо указать номер!");
        
    
    СчетчикТерпения=СчетчикТерпения-1;
    Если СчетчикТерпения=0 тогда
        Сообщить("Задолбал(а) ты меня");
        Возврат;
    КонецЕсли;

КонецЦикла;
 
 Рекламное место пустует
   Fragster
 
50 - 09.01.13 - 18:13
(49) почему не "Для" а "пока истина"?
   Reset
 
51 - 09.01.13 - 18:13
(50) Не сообразил.
см (19)
   Legj
 
52 - 09.01.13 - 18:13
(35) И не кипятитесь вы так. Я резковато оценил ваш код не намерено.
   Reset
 
53 - 09.01.13 - 18:15
(52) я не кипятюсь. Я пытаюсь, как могу, развлекаться.


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