Ребят, извините, я только учусь ... мне интересно как сложить элементы массиваЦен и получить Общую, Итоговую сумму ?

Дано:
•СтрокаТоваров ="Тумба, Шкаф, Стол, Стул" ;
• СтрокаЦен = " 5000,7000, 6000, 2000" ;

// Первое Задание было перевести данные в Массивы и вывести все значения массивов в виде :

• <Товар > (цена = <ЦенаТовара>)

• Решение:
 МассивТоваров = СтрРазделить( СтрокаТоваров,",", Ложь) ;
МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;

// и все значения массива вывела в Цикле со счетчиком:

     Для Индекс =0 По МассивТоваров.ВГраница() Цикл

СтрокаВывода = СтрШаблон(" %1 (цена = %2 )", МассивТоваров[Индекс], МассивЦен[Индекс] ) ;
Сообщить( СтрокаВывода) ;
КонецЦикла;

// Дальше в этой задачке надо посчитать Итоговую сумму по всем Товарам ( т.е. сложить все цены между собой из МассиваЦен ... :( - подскажите пж как сложить все значения МассиваЦен между собой ? что то не получается никак :(

- С уважением ко всем на Форуме
---
```1c
    Сумма = 0;
    Для Индекс = 0 По МассивЦен.ВГраница() Цикл
    Сумма = Сумма + МассивЦен[Индекс];
    КонецЦикла;
    Сообщить(Сумма);
```
---
```1c
    Вычислить(СтрСоединить(МассивЦен, "+"))
```

:)
---
вообще от первой строки

Сумма = Вычислить(стрЗаменить(СтрокаЦен,",","+"));
---
все просто. Вычислить возвращает значение

```1c
    Сообщить("Итог: "+Вычислить(СтрСоединить(МассивЦен,"+")));
```
---
Если использовать в только рамках реквизитов с типом значения число - всё Ок. Но если это какой-то внешний источник данных, то нет 100% гарантии, что на той стороне никто не накосячил.
---
классический приведен в 2.

(14) как понять - « не совсем безопасный код»?
Вот эта строка кода:
Сумма = Сумма + МассивЦен[Индекс];
В МассивЦен[Индекс] строка с цифрами. Это не число.
Просто неявно происходит преобразование типов из строки в Число. Это происходит потому, что левый операнд Сумма имеет тип Число. К нему и пытается привестись второй операнд.
Это будет тоже самое, если записать так:
Сумма = Сумма + Число(МассивЦен[Индекс]);
Т.е. принудительное преобразование типа Строка в Число.
И если в МассивЦен[Индекс] окажется строка, которая не может быть преобразована в Число, то получим ошибку преобразования типа.
(14) ну и как понять -« если в СтрокеЦен окажется НЕ ЧИСЛО ??? » разве цена может быть " не числом ??? "
Так в том и дело, что на входе получаете строку:

Дано:
•СтрокаТоваров ="Тумба, Шкаф, Стол, Стул" ;
• СтрокаЦен = " 5000,7000, 6000, 2000" ;

МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;

СтрокаЦен это именно строка. А в МассивЦен получается массив Строк.
Строка входящая и от нас не зависит. Что там пришло мы не проверяем. Полагаемся на то, что там строка цифр, разделенных запятой. Но на самом деле там может прийти все что угодно. Это просто соглашение, которое основывается на вере в правильности данных. Это и может привести к ошибкам во время выполнения в кода.
---
• Решение:
МассивТоваров = СтрРазделить( СтрокаТоваров,",", Ложь) ;
МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;

// и все значения массива вывела в Цикле со счетчиком:

Для Индекс =0 По МассивТоваров.ВГраница() Цикл

СтрокаВывода = СтрШаблон(" %1 (цена = %2 )", МассивТоваров[Индекс], МассивЦен[Индекс] ) ;
Сообщить( СтрокаВывода) ;
КонецЦикла;
(17) Так в первом посте и есть решение... но дальнейшее обсуждение тоже очень нужное и познавательное.
---
```1c
    Товары = "Тумба,Шкаф,Стол";
    Цены = "5000, 7000, 6000";
    МассивТовары = СтрРазделить(Товары, ",", Ложь);
    МассивЦены = СтрРазделить(Цены, ",", Ложь);

    Для Сч = 0 По МассивТовары.ВГраница() Цикл

    Сообщить(МассивТовары[Сч] + " (цена = " + МассивЦены[Сч] + ")");

    КонецЦикла;
```
---
Процедура не Возвращает , а как это? Она (процедура) просто выполняет код. А функция выполняет код и возвращает результат выполнения.

Если Вам по логике программы надо в разных местах выполнять некие однотипные вычисления их логично оформить функцией и когда нужно вызывать и получать результат. Если это делать процедурой, то в каждом месте где нужны вычисления Вам придется писать код вычисления. В процессе набора опыта Вам будет понятно когда можно просто код написать в процедуре, а когда его написать в функцию.
;)
ЗЫ успехов в освоении 1С.
---
Пример - надо вычислить сумму 2х чисел.
Если надо вычислить их сумму и вернуть результат, то используется функция.

```1c
    А = 4;
    Б = 5;
    Результат = ПолучитьСумму(А,Б);
    ...
    Функция ПолучитьСумму(А,Б)

    РезультатСуммы = А + Б;

    Возврат РезультатСуммы;

    КонецФункции
```

Если надо вычислить их сумму, но возвращать результат не надо, а например, результат записывается в базу, то используется процедура.

```1c
    А = 4;
    Б = 5;
    РассчитатьСумму(А,Б);
    ...
    Процедура РассчитатьСумму(А,Б)

    РезультатСуммы = А + Б;

    //а тут РезультатСуммы записывается в базу

    КонецПроцедуры
```
---
если нужно что-то просто выполнить, то Процедура. Если нужно что-то выполнить и вернуть результат выполнения/вычисления, то Функция.
Пример.
А = ПолучитьНужныеДанные();

В данном случае ПолучитьНужныеДанные это функция (это не стандартная функция, ее мы должны сами определить)
Если ее сделать процедурой, то будет ошибка, так как процедура ничего не может возвращать, соответственно будет определена ошибка, так как переменной А происходит попытка присвоить значение, а самого факта присвоения не может существовать.
Другими словами, Процедура может быть только вызвана и не может применяться в выражении присваивания.
Пример процедур:
Сообщить("Что-то");
Тут явно только вызывается Сообщить и ничего не ожидается к получению значений.

В Функции не обязательно что-то возвращать. Если не будет явного Возврат значения, то по умолчанию вернется Неопределено.
Из того следует, что в принципе, там где может применяться Процедура, там может применяться и функция. За исключением случаев описания обработчиков и служебных вызовов (таких как асинхронные вызовы). Там просто ожидается наличие именно процедур.
Но в своем коде вызова, можно использовать и функции без получения возвращаемых значений. Даже если функция что-то возвращает, это не обязывает это значение получать. Ту же функцию ПолучитьНужныеДанные можно вызвать и просто так:
ПолучитьНужныеДанные();
Но нужно понимать, что ресурсы на выполнение функции тратится несколько больше, чем на процедуру. И не следует всегда применять функции вместо процедур. Ну и логическое разделение кода все же тоже важно.
---
Используется конструкция СообщениеПользователю.
В типовых конфигурациях на БСП для упрощения использования есть процедуры в общих модулях ОбщегоНазначенияКлиент, ОбщегоНазначенияСервер или ОбщегоНазначенияКлиентСервер.

Из синтакс помощника:
---
.
---
```1c
    Сумма = 0;
    Для Индекс = 0 По МассивЦен.ВГраница() Цикл
    Сумма = Сумма + МассивЦен[Индекс];
    КонецЦикла;
    Сообщить(Сумма);
```
---
Большое Спасибо вам! - Оч Круто!!! - все сразу посчиталось ! :) у меня слов нет - круто!
---
```1c
    Вычислить(СтрСоединить(МассивЦен, "+"))
```

:)
---
ого! - а это без Цикла - просто подставить ?
---
А здесь выходит окно : « Неизвестный модуль ... Встроенная Функция м.б. использована только в выражении ( Вычислить) - мошь я что то не добавила? - Сообщить() надо?
---
Вычислить(СтрСоединить(МассивЦен, "+"))

- а вот этот вариант почему не работает?( остальные все сработали варианты ) здесь нужно Возврат сделать или я вообще не поняла это ?
---
все просто. Вычислить возвращает значение

```1c
    Сообщить("Итог: "+Вычислить(СтрСоединить(МассивЦен,"+")));
```
---
Спас
(11) Сообщить("Итог: "+Вычислить(СтрСоединить(МассивЦен,"+")));
-Ой спасибо большое - все получилось , как и остальные варианты :) спасибочки большое :)
---
но таким способом лучше не пользоваться. Только когда точно будет известно, что он сработает. Это больше хак. Применимо в очень ограниченном количестве случаев.
И код из (2) не совсем безопасный. Да, он рабочий, но что будет, если в СтрокаЦен окажется не число?
К примеру:
СтрокаЦен = "5000 , 7000 , 6000, 2000, 100FF100" ;
В таком случае мы получим ошибку преобразования типа.
Можно обезопасить код:

```1c
    СтрокаЦен = "5000 , 7000 , 6000, 2000, 100FF100" ;
    МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;
    ТипЧисло = Новый ОписаниеТипов("Число");
    Сумма = 0;
    Для Индекс = 0 По МассивЦен.ВГраница() Цикл
    Сумма = Сумма + ТипЧисло.ПривестиЗначение(МассивЦен[Индекс]);
    КонецЦикла;
    Сообщить(Сумма);
```

Так не часто используют. Но знать это нужно.
---
(13) но таким способом лучше не пользоваться. Только когда точно будет известно, что он сработает. Это больше хак. Применимо в очень ограниченном количестве случаев.
И код из (2) не совсем безопасный. Да, он рабочий, но что будет, если в СтрокаЦен окажется не число?
К примеру:
СтрокаЦен = "5000 , 7000 , 6000, 2000, 100FF100" ;:

 а пож объясните - как понять - « не совсем безопасный код»? ...

- ну и как понять -« если в СтрокеЦен окажется НЕ ЧИСЛО ??? » разве цена может быть " не числом ??? "
 - а какой вариант из этих трех тогда самый нормальный?
---
Если использовать в только рамках реквизитов с типом значения число - всё Ок. Но если это какой-то внешний источник данных, то нет 100% гарантии, что на той стороне никто не накосячил.
---
классический приведен в 2.

(14) как понять - « не совсем безопасный код»?
Вот эта строка кода:
Сумма = Сумма + МассивЦен[Индекс];
В МассивЦен[Индекс] строка с цифрами. Это не число.
Просто неявно происходит преобразование типов из строки в Число. Это происходит потому, что левый операнд Сумма имеет тип Число. К нему и пытается привестись второй операнд.
Это будет тоже самое, если записать так:
Сумма = Сумма + Число(МассивЦен[Индекс]);
Т.е. принудительное преобразование типа Строка в Число.
И если в МассивЦен[Индекс] окажется строка, которая не может быть преобразована в Число, то получим ошибку преобразования типа.
(14) ну и как понять -« если в СтрокеЦен окажется НЕ ЧИСЛО ??? » разве цена может быть " не числом ??? "
Так в том и дело, что на входе получаете строку:

Дано:
•СтрокаТоваров ="Тумба, Шкаф, Стол, Стул" ;
• СтрокаЦен = " 5000,7000, 6000, 2000" ;

МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;

СтрокаЦен это именно строка. А в МассивЦен получается массив Строк.
Строка входящая и от нас не зависит. Что там пришло мы не проверяем. Полагаемся на то, что там строка цифр, разделенных запятой. Но на самом деле там может прийти все что угодно. Это просто соглашение, которое основывается на вере в правильности данных. Это и может привести к ошибкам во время выполнения в кода.
---
все просто. Вычислить возвращает значение

- а вот не можете подсказать : я уже от этого урока ушла До : "Общие Модули", "Визуализация Таблицы Значений" и т.д. , но не могу, до сих пор, понять суть слова « Возвращает Значение » , ну просто запоминаю, что Функция Возвращает какое-то Значение и в конце надо писать ключевое слово :« Возврат ... + Значение что она возвращает » , и в чем разница Процедуры от Функции? - и когда надо Функцию писать, а когда Процедуру? ...

            Процедура не Возвращает , а как это? не могу до сих пор это понять :( не подскажете, где взять эту информацию ?
---
Процедура не Возвращает , а как это? Она (процедура) просто выполняет код. А функция выполняет код и возвращает результат выполнения.

Если Вам по логике программы надо в разных местах выполнять некие однотипные вычисления их логично оформить функцией и когда нужно вызывать и получать результат. Если это делать процедурой, то в каждом месте где нужны вычисления Вам придется писать код вычисления. В процессе набора опыта Вам будет понятно когда можно просто код написать в процедуре, а когда его написать в функцию.
;)
ЗЫ успехов в освоении 1С.
---
Пример - надо вычислить сумму 2х чисел.
Если надо вычислить их сумму и вернуть результат, то используется функция.

```1c
    А = 4;
    Б = 5;
    Результат = ПолучитьСумму(А,Б);
    ...
    Функция ПолучитьСумму(А,Б)

    РезультатСуммы = А + Б;

    Возврат РезультатСуммы;

    КонецФункции
```

Если надо вычислить их сумму, но возвращать результат не надо, а например, результат записывается в базу, то используется процедура.

```1c
    А = 4;
    Б = 5;
    РассчитатьСумму(А,Б);
    ...
    Процедура РассчитатьСумму(А,Б)

    РезультатСуммы = А + Б;

    //а тут РезультатСуммы записывается в базу

    КонецПроцедуры
```
---
А = 4;
Б = 5;
РассчитатьСумму(А,Б);
...
Процедура РассчитатьСумму(А,Б)

РезультатСуммы = А + Б;

//а тут РезультатСуммы записывается в базу

КонецПроцедуры
 П

 - а здесь пж подскажите - Метод Сообщить() - одинаково работает и для Процедуры и для Функции? - здесь нет никаких нюансов? ( я что-то раньше об этом не задумывалась ...)
---
Метод Сообщить() - одинаково работает и для Процедуры и для Функции?
Да, это метод платформы, работает одинаково.

Правда он уже устарел, и в управляемом режиме его обычно не используют, но и в управляемом режиме он работает.
---
Правда он уже устарел, и в управляемом режиме его обычно не используют

... а что используют вместо "Сообщить()" ? :(
---
Используется конструкция СообщениеПользователю.
В типовых конфигурациях на БСП для упрощения использования есть процедуры в общих модулях ОбщегоНазначенияКлиент, ОбщегоНазначенияСервер или ОбщегоНазначенияКлиентСервер.

Из синтакс помощника:
---
Так как элементы массива то сложить при помощи СообщениеПользователю???
---
СообщениеПользователю просто выводит сообщение пользователю. Сложить массивы следует до вывода сообщения.
---
Просто в теме больше комментариев про Сообщить() и СообщениеПользователю(). Думаю - может я от жизни отстал?
---
спасибо большое, я уже больше пол года учу 1С: и об этом не слышала - спасибо огромное!
---
если нужно что-то просто выполнить, то Процедура. Если нужно что-то выполнить и вернуть результат выполнения/вычисления, то Функция.
Пример.
А = ПолучитьНужныеДанные();

В данном случае ПолучитьНужныеДанные это функция (это не стандартная функция, ее мы должны сами определить)
Если ее сделать процедурой, то будет ошибка, так как процедура ничего не может возвращать, соответственно будет определена ошибка, так как переменной А происходит попытка присвоить значение, а самого факта присвоения не может существовать.
Другими словами, Процедура может быть только вызвана и не может применяться в выражении присваивания.
Пример процедур:
Сообщить("Что-то");
Тут явно только вызывается Сообщить и ничего не ожидается к получению значений.

В Функции не обязательно что-то возвращать. Если не будет явного Возврат значения, то по умолчанию вернется Неопределено.
Из того следует, что в принципе, там где может применяться Процедура, там может применяться и функция. За исключением случаев описания обработчиков и служебных вызовов (таких как асинхронные вызовы). Там просто ожидается наличие именно процедур.
Но в своем коде вызова, можно использовать и функции без получения возвращаемых значений. Даже если функция что-то возвращает, это не обязывает это значение получать. Ту же функцию ПолучитьНужныеДанные можно вызвать и просто так:
ПолучитьНужныеДанные();
Но нужно понимать, что ресурсы на выполнение функции тратится несколько больше, чем на процедуру. И не следует всегда применять функции вместо процедур. Ну и логическое разделение кода все же тоже важно.
---
(27) Но нужно понимать, что ресурсы на выполнение функции тратится несколько больше, чем на процедуру. И не следует всегда применять функции вместо процедур

 - а скажите пж - почему студентам часто говорят за "Ресурсы" кот. тратятся на выполнение программного кода или вообще программы ? - 1С, что? - такая слабая совсем, ( там же большие энергоемкие Процедуры на Сервере выполняются ? ) или в работе программы часто проблемы возникают из-за этих Ресурсов??? все время спросить про это хотела, но так и не могла
---
ресурсы это в основном память и процессорное время компьютера. Чем больше тратится ресурсов, тем больше требований к мощности компьютера. И если компьютер/сервер не достаточно мощный, то начинаются тормоза.
---
вообще от первой строки

Сумма = Вычислить(стрЗаменить(СтрокаЦен,",","+"));
---
Спасибо! 🙏🙏🙏 так тоже получилось :)
---
Здравствуйте. Не могли бы вы помочь! Бьюсь всю ночь, не получается. Оказывается я совсем не могу стправиться с таким заданием самого начала.
Само задание
Задание 4.1. Дано:

Строка входных данных Товары = «Тумба,Шкаф,Стол»;

Строка входных данных Цены = «5000, 7000, 6000».

Требуется: Перевести все данные в массивы. Вывести все значения массивов в виде:

<Товар> (цена = <ЦенаТовара>). не могли бы вы полностью программу написать. для совсем чайников!
---
• Решение:
МассивТоваров = СтрРазделить( СтрокаТоваров,",", Ложь) ;
МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;

// и все значения массива вывела в Цикле со счетчиком:

Для Индекс =0 По МассивТоваров.ВГраница() Цикл

СтрокаВывода = СтрШаблон(" %1 (цена = %2 )", МассивТоваров[Индекс], МассивЦен[Индекс] ) ;
Сообщить( СтрокаВывода) ;
КонецЦикла;
(17) Так в первом посте и есть решение... но дальнейшее обсуждение тоже очень нужное и познавательное.
---
И какой смысл тогда решать эту задачу? Она же для обучения дана. Не можете сделать такую задачу, как будете работать дальше?

Примерный план:
1. Используйте функцию СтрРазделить для получения массивов (CTRL + F1, чтобы понять как она работает).
2. Дальше изучайте как работать с массивами (https://helpme1s.ru/massivy-v-yazyke-1s-8-v-primerax)
3. Вывод информации пользователю через Сообщить или СообщениеПользователю, нужную строку можно получить через СтрШаблон (и НСтр для работы с несколькими языками).

Если не сможете справиться самостоятельно с этим, то дальше легче не станет.
---
```1c
    Товары = "Тумба,Шкаф,Стол";
    Цены = "5000, 7000, 6000";
    МассивТовары = СтрРазделить(Товары, ",", Ложь);
    МассивЦены = СтрРазделить(Цены, ",", Ложь);

    Для Сч = 0 По МассивТовары.ВГраница() Цикл

    Сообщить(МассивТовары[Сч] + " (цена = " + МассивЦены[Сч] + ")");

    КонецЦикла;
```
---
:) прикольное решение)
           - я в Уч.Центре №1 учусь - там говорят, «... что б избежать операции конкатенации , использовать Функцию "СтрШаблон() , а у вас спокойно три плюсика и решение есть! 👌 классно )
---
если вам надо будет помочь на этом уровне - пишите -я тоже эти темы недавно изучила и могу вам подсказать и посоветовать разные методы обучения... главно не слушайте никого из "осуждающих вас " за ваши обращения " - лекарство от незнания -Вопрос и не стесняйтесь спрашивать у Знающих программистов - и еще нужно Постоянство и тогда все поймете со временем ) - удачи вам!
-и спасибо огромное всем кто помогает нам в обучении 💕💕💕
---
Дай Бог Вам здоровья!
---
СтрокаЦен = "5000 , 7000 , 6000" ;
 СтрокаТовары = "Тумба,Шкаф,Стол";
 МассивЦен = СтрРазделить( СтрокаЦен,",", Ложь) ;
 МассивТоваров = СтрРазделить( СтрокаТовары,",", Ложь) ;

 Для Индекс =0 По МассивТоваров.ВГраница() Цикл

  СтрокаВывода = СтрШаблон(" %1 <цена = %2>", МассивТоваров[Индекс], МассивЦен[Индекс] ) ;
  Сообщить( СтрокаВывода) ;
 КонецЦикла;;