Вычисление арифметических выражений программно (строковый калькулятор)

Программирование - Практика программирования

Как в 1с программно можно вычислить арифметическое выражение?
Для новичков ... и тех кто не читает жёлтых книжек :)
Те кто читают книжки, могут даже не тратить  время на чтение этой заметки.
Тут либо знаешь об этом, либо нет.

Надеюсь данная тема не боян :)

Долго искал по поисковикам "Строковый калькулятор 1с". Ничего не нашел.

Значит либо нет про это информации, либо хорошо запрятали :)

 

Цель передо мной стояла благая:

необходимо было в табличной части документа, перед графой количество, вставить графу "Расчет количества", 

где менеджеры могли б записывать выражения типа "3+8,7*2" и.т.д.

нужно чтобы эта информация сохранялась, а выражение считалось.

Строковый анализатор чего-то не слишком хотелось писать, но выхода не было видно.

Ну, и соотвественно взялся за дело... Но то дело хлопотное и неохотное. Ну уж слишком не хотелось этого делать, ... и вот пришло озарение!!! Функция Вычислить();. Спасибо тебе Один Эс:)

Вот что умеет делать Один Эс 8:

выражение = "5+6.2*2";

ответ = Вычислить(выражение);

Ну и для общего счастья, можно еще заменить все введенные запятые на точки, и проверить на корректность ввода:

 попытка
     ответ  = Вычислить(СтрЗаменить(выражение,",","."));
 Исключение
    Предупреждение("Введите выражение, состоящее только из чисел, скобок и операций / * + -");

 КонецПопытки;

Тут конечно не проверяется правильная расстановка скобок и их парность. Но этого в моём случае не требовалось.

 

Надеюсь, заметка для кого-нибудь будет полезной Cool

Скачать файлы

Наименование Файл Версия Размер
Строковый калькулятор
.epf 6,44Kb
28.05.12
52
.epf 6,44Kb 52 Скачать

См. также

Комментарии
1. Александр Медведев (anig99) 2554 27.01.11 21:52 Сейчас в теме
Вот прочитали бы желтые книжки или хотя бы синтаксис-помощник и не было бы таких вопросов...
2. Игорь Исхаков (Ish_2) 985 27.01.11 22:01 Сейчас в теме
(1) Автор находится на стадии освоения 1с. Вторая скромная публикация.
Решил поделиться своим строковым калькулятором. И что такого ?
Чего ты со своим минусом лезешь ?
BigB; Spartan; +2 Ответить 1
3. Александр Медведев (anig99) 2554 27.01.11 22:05 Сейчас в теме
(2) для простой публикации нет "фишки" или объема...
А так - это маленький кусок из текста аля "Просты примеры разработки".
4. Ильшат (shatt) 37 27.01.11 22:22 Сейчас в теме
Я признаюсь, редко лезу в эти полезные желтые книжки...
Хотя их надо бы почитать от корки до корки.
Но где у 1сников на это время :)
Сразу полез в поисковики, но в ответ ничего не получил :(
Вот и решил тут выложить этот пост.
Кто-нибудь поищет, и найдет :)
5. Александр Гладких (yku) 264 27.01.11 22:54 Сейчас в теме
(4) Частенько опыт показывает (а мне - довольно часто), что книжки читать надо. Временами перелисываю книжки "для новичков" (даже те, что я уже читал) и удивляюсь тому количеству функционала, о котором я и не подозревал. И это чтение позволяет избежать изобретение велосипеда. Конечно, границу между "читать полностью и всё" и "изучить методом тыка(синтаксис помощника)" каждый выбирает сам, но она как правило со временем смещается в сторону первой.
6. Ильшат (shatt) 37 27.01.11 23:13 Сейчас в теме
Полностью поддерживаю, но почему то мне кажется, что "академических" одинэсников меньшинство.
Так как большинство идут по наторенной дороге:
- типовые обновления
- нетиповые обновления
-легкий перепил печатных форм, доков, отчетов

потихоньку пишем что-то более серьезное, а в это время продолжается первые 3 этапа...
Народу становится больше, а времени меньше... и книжки покрываются пылью :)
7. Ийон Тихий (cool.vlad4) 41 27.01.11 23:55 Сейчас в теме
Умные книжки читают не для того, чтобы все знать, это невозможно, а как говорил наш препод по квантовой механике вы можете ничего не знать, но обязаны знать где это можно найти. Книжки читают еще и для того, чтобы впоследствии научится чему-нибудь - например программировать с помощью языка, а не на языке. Почему на вашу публикацию так набросились - потому что в ней ничего нет, кроме одной типовой функции, которую быстрее всего найти в справочнике. Согласитесь, что этого как-то маловато. Если нет, тогда предлагаю вам скопом сделать обработки Выполнить(Сообщить("Hello, World!")); и прочие
ЗЫ А книжку сама по себе не представляет ничего, но она бесценна в том случае если сумела помочь человеку понять что-то для него новое. Книги я читаю как правило как справочнки, открываю то что меня интересует и пытаюсь понять. В данном случае понять надо то, что всех функций не знать и не запомнить, и поэтому надо научится искать.
8. Доржи Балбаров (Angeros) 28.01.11 05:03 Сейчас в теме
Нда... как низко пал уровень предложений и разработок. :(
9. Иван Т (Spartan) 306 28.01.11 11:25 Сейчас в теме
Злые вы... :D Ну проигнорировали бы, чего минусы-то лепить? Есть и похуже публикации. А тут человек попытался поделиться тем, что для него самого оказалось новым и интересным - хотя бы это похвально.
10. Ийон Тихий (cool.vlad4) 41 28.01.11 12:04 Сейчас в теме
Почему же злые, ...все в порядке вещей - если бы человек не жаждал оценки сообщества, то не делал бы публикацию, а так, пускай получает то что хотел, гораздо хуже если бы никто ничего не сказал и оценки бы не поставил.
11. Ильшат (shatt) 37 28.01.11 12:21 Сейчас в теме
(10) Ну в принципе, любой отзыв это хорошо.
Единственно, цель заметки - восполнить пробел в информации про данную возможность.
В книжку тут не сразу полезешь.
Сначала поищешь в поисковиках.
Кто-то начнет искать, и найдет эту заметку.
...и порадуется, что так легко можно решить эту задачку :)
12. Иван Т (Spartan) 306 28.01.11 12:28 Сейчас в теме
(10) Не знаю, как бы банально это ни звучало, я выкладываю не ради оценки... Просто делюсь наработками и опытом. Оценка сообщества, конечно, дело приятное, но не приоритетное.
И просто такое ощущение, что все стали сразу крутыми 1с-никами... одномоментно... Короче, хуже от этой публикации мне точно не стало, и раздражения во мне она не вызвала, в отличие от некоторых других. Поставил плюс только ради того, чтоб компенсировать минусы, а так бы прошел мимо.
Ish_2; shatt; +2 Ответить 1
13. Ильшат (shatt) 37 28.01.11 12:32 Сейчас в теме
(12) теперь "строковый калькулятор 1с" в поисковике выводит нужный ответ
14. Яков Коган (Yashazz) 2121 28.01.11 12:32 Сейчас в теме
(7) Только, извините, не
Выполнить(Сообщить("Hello, World!"));
а, наверное,
Выполнить("Сообщить(""Hello, World!"")");
;)
15. Ийон Тихий (cool.vlad4) 41 28.01.11 12:50 Сейчас в теме
(14) опечатки у всех бывают, не думал что этот код кому-то понадобится...
16. Игорь Исхаков (Ish_2) 985 28.01.11 15:05 Сейчас в теме
(15) В (14) тебя поймали - а ты не зевай !
17. Ийон Тихий (cool.vlad4) 41 28.01.11 16:18 Сейчас в теме
(16) ну да,...чай стыдится нечего - я ж не одинесник...помнится раньше да и сейчас, в некоторых блогах специально ошибки делали, чтоб не копипастили просто так некоторые понимаешь ли...
18. Яков Коган (Yashazz) 2121 28.01.11 18:01 Сейчас в теме
19. dimon_upi (dimon_upi) 02.02.11 20:24 Сейчас в теме
Рекомендую поискать в поиске - обратная польская запись и все что с этим связано - тогда можно будет сделать могучий калькулятор, а ежели еще прилепить сюда С++ или Delphi, то будет совсем гуд.
За разработку (+), за идею реализации (-).
20. Ярослав Радкевич (WKBAPKA) 202 05.02.11 11:42 Сейчас в теме
эта статья больше похожа на "О! Эврика". Вот если бы написали свой разбор строки и его вычисление, хотя бы с помощью той же польской записи, это было бы интереснее :)
21. Александр Рытов (Арчибальд) 2660 05.02.11 11:51 Сейчас в теме
Плюс за пробуждение ностальгии по моим первым шагам на ИС http://infostart.ru/public/18898/ :D
22. Ильшат (shatshat) 26.05.12 19:29 Сейчас в теме
Спасибо, тезка

2all: мне помогло. споткнулся на моменте, когда надо складывать (а может и не складывать, а делить или умножать) заранее не известно что. "нутром знал" что 1с - интерпретатор а не компилятор, поэтому такая функция синтаксразбора и вычисления "на лету" просто обязана быть, а вот где искать?
в "желтых книжках"? в каком разделе? ... погуглить быстрее и проще

p.s. синтаксический разбор арифметического выражения я в свое время писал (не для 1с) - смертельного ничего в этом нет, вопрос лишь затрат времени и их обоснованности
23. Виталий Барилко (Diversus) 2296 28.05.12 08:54 Сейчас в теме
Следующая публикация будет:
Выполнение произвольного кода в режиме предприятия

Ну и

Выполнить(ТекстКода)

:D

Автору удачи в освоении встроенного языка.
24. al petrov (petrov_al) 10 28.05.12 09:21 Сейчас в теме
Ну вы уж совсем ...там весь код в одну строчку помещается, автор не стыдно такое публиковать?
25. Владимир Чаклин (vec435) 15 30.05.12 20:36 Сейчас в теме
очень часто нужно складывать столбец. А вообще где здесь уже был калькулятор в табличном документе
26. Sergio Bargio (sergiobargio1) 116 31.05.12 12:57 Сейчас в теме
спасибо Вам. я тоже, к своему стыду, не знал.
безусловно, достойны уважения профессиональные кодеры, и к максимализму при оценках Вы великодушно снисходительны.
27. Дмитрий Шерстобитов (DitriX) 2499 18.09.12 16:15 Сейчас в теме
А мне вот помогло. Язык программирования как обычный язык - запоминаешь только те схемы, которые часто используешь. А те которые не использовал долгое время, но помнишь что они были, вот тут такая помощь хороша. Кстати нашел через гуглю.
28. Роберт В е р т и н с к и й (v3rter) 28.03.17 13:22 Сейчас в теме
Интересно, ЗавершитьРаботуСистемы(Ложь) он тоже правильно вычислит? )
Оставьте свое сообщение