Имя: Пароль:
1C
1С v8
Ввод чисел пользователем
0 Murphy
 
22.09.15
20:53
Недавно начал изучать 1С, столкнулся с такой задачей:

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

Ввод двух чисел реализовать получилось, но как сделать для 3-х и более, тут у меня никак не получается сообразить. Подскажите, пожалуйста, правильный подход для решения такой задачи.


Собственно сам код для ввода двух чисел:

Процедура ВводЧисла() Экспорт

    Оповещение = Новый ОписаниеОповещения("ВводЧисла2", ЭтотОбъект);
    ПоказатьВводЧисла(Оповещение, 0, "Введите число", 15, 0);
КонецПроцедуры


Процедура ВводЧисла2(Число1, Параметры) Экспорт

    

    Оповещение = Новый ОписаниеОповещения("ВводЧислаЗавершение", ЭтотОбъект, Число1);
    ПоказатьВводЧисла(Оповещение, 0, "Введите число", 15, 0);
КонецПроцедуры



Процедура ВводЧислаЗавершение(Число1, Число2) Экспорт
    
    Если Число1 = Неопределено Тогда
        Число1 = 0;                
        ИначеЕсли Число2 = Неопределено Тогда
        Число2 = 0;
    КонецЕсли;
        Если НЕ Число1 = Неопределено И НЕ Число2 = Неопределено Тогда
        Результат = Число1 + Число2;
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Вы ввели количество " + Результат;
        Сообщение.Сообщить();
КонецЕсли;
        
КонецПроцедуры
1 Волшебник
 
модератор
22.09.15
20:56
Издевательство какое...
2 Ненавижу 1С
 
гуру
22.09.15
20:57
Если Число1 = Неопределено Тогда
    
        ИначеЕсли Число2 = Неопределено Тогда

Если НЕ Число1 = Неопределено И НЕ Число2 = Неопределено Тогда

если все же, как говорится
3 VitShvets
 
22.09.15
21:00
Можно забахать таблицу значений с одной колонкой типа число и таким количеством строк, сколько надо ввести чисел. Потом в цикле обходим, спрашиваем Число + СокрЛП(НомерСтроки). Ну и в конце ТаблицаЗначений.Итог("Колонка")
4 фобка
 
22.09.15
21:08
Здесь ошибка, должно быть ВводЧислаЗавершение(Число2, Число1)
5 фобка
 
22.09.15
21:17
Конструкция примерно такая

Процедура ВводЧисла(сумма1=0)
  Опоп= Новый Описаниеоповещения(...,,сумма1);
Показатьвводчисла(опоп, );...
Конецпроцедуры

Процедура ВводЧислаЗавершение(число1, число2)
Если число1 = неопределено тогда
Сообщить(число2);
Возврат;
Конецесли;
Вводчисла(число1+число2);

Конецпроцедуры
6 Murphy
 
22.09.15
21:35
(3) Интересный вариант, только с таблицами значений я пока не сталкивался, надо будет почитать.

(4) Ну мы их все равно суммируем, поэтому с порядком я не заморачивался.

(5) А что такое "сумма1" и откуда оно взялось? К сожалению не очень понял смысл кода.
7 фобка
 
22.09.15
21:42
(6) это твой результат. Сумма всех введенных значений. Ты получаешь его после того как прекратишь ввод чисел
8 фобка
 
22.09.15
21:44
Этих двух процедур достаточно для ввода любого количества значений и получения результата их суммирования. Вот и весь смысл кода
9 Murphy
 
22.09.15
22:47
(7) Ваш пример навел на мысль и получилось такое:

Процедура ВводЧисла() Экспорт
    Сумма1 = 0;
    Оповещение = Новый ОписаниеОповещения("ВводЧисла2", ЭтотОбъект, Сумма1);
    ПоказатьВводЧисла(Оповещение, 0, "Введите число 1", 15, 0);
КонецПроцедуры

Процедура ВводЧисла2(Число1, Сумма1) Экспорт
    Если НЕ Число1 = Неопределено Тогда
        Сумма1 = Сумма1 + Число1;
    КонецЕсли;

    Оповещение = Новый ОписаниеОповещения("ВводЧисла3", ЭтотОбъект, Сумма1);
    ПоказатьВводЧисла(Оповещение, 0, "Введите число 2", 15, 0);
КонецПроцедуры

и т.д.
В принципе цель достигнута, таким образом можно сколько угодно окон наплодить, но теперь интересно другое. (8)  В моем нынешнем варианте для каждого окна используется своя уникальная процедура. А реально ли обойтись только 2-мя процедурами или это будет слишком сложно?
10 фобка
 
22.09.15
22:49
(9) реально, это и описано в (5). Две процедуры на любое количество значений
11 Murphy
 
22.09.15
22:53
(10) Можете описать подробнее? Не понимаю как в этом случае первая процедура должна работать.
12 фобка
 
22.09.15
23:03
(11) с телефона пишу, неудобно мне. Но повторюсь

&наклиенте
Процедура ВводЧисла(сумма1=0)

    Оповещение = Новый ОписаниеОповещения("ВводЧислазавершение", ЭтотОбъект, сумма1);
    ПоказатьВводЧисла(Оповещение, 0, "Введите число", 15, 0);
КонецПроцедуры

&наклиенте
Процедура ВводЧислаЗавершение(Число1, Число2) Экспорт
    
    Если Число1 = Неопределено Тогда
        Сообщить("результат = "+число2);
Возврат;
    КонецЕсли;
    Вводчисла(число1+число2);
КонецЕсли;
13 фобка
 
22.09.15
23:04
Если первая процедура не подхватывается командой -изза параметра, тогда просто вынести в аналогичную и вызвать
14 Murphy
 
22.09.15
23:18
(13) Блин, вот я тапок, невнимательно смотрел на 2-ю процедуру. Теперь все ясно, спасибо!
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший