Вычисление формул в 1С через обратную польскую запись

06.07.15

Разработка - Математика и алгоритмы

Преобразование обычного выражения в постфиксную форму и вычисление значения формулы через стек.
Понадобилось рассчитывать формулы прямо из документа 1С, гугл в первых ссылках выдает алгоритм Дейкстры и обратную польскую запись. По нему и была решена поставленная задача.

Скачать исходный код

Наименование Файл Версия Размер
МодульСтека
.epf 7,97Kb
11
.epf 1.0 7,97Kb 11 Скачать

 Тестировалось на:

Обычная запись ОПЗ Результат
2-1+3*4 21-34*+ 13
2-(1+3)*4 213+4*- -14
(2-(1+3)*4)*5 213+4*-5* -70
2-(1+3*4)*5 2134*+5*- -63

Работу с стеком и разбор строки прикладываю в обработке.

Привожу основные функции:

 

//преобразование в ОПЗ
	Пока лпСтрокаВход <> "" Цикл
		лпТокен = ТокенПолучить(лпСтрокаВход);
		лпТипТокена = ТокенТип(лпТокен);
		Если лпТипТокена = "Число" Тогда
			лпСтрокаВыход = лпСтрокаВыход + лпТокен + "!";
		КонецЕсли;
		Если лпТипТокена = "(" Тогда
			СтекДобавить(лпСтек, "(");
		КонецЕсли;
		Если лпТипТокена = ")" Тогда
			Пока СтекВершина(лпСтек) <> "(" Цикл
				лпВершина = СтекВершина(лпСтек);
				лпСтрокаВыход = лпСтрокаВыход + лпВершина + "!";
				СтекУдалить(лпСтек);
			КонецЦикла;
			СтекУдалить(лпСтек);
		КонецЕсли;
		Если лпТипТокена = "Функция" Тогда
			Пока (НЕ СтекПустой(лпСтек)) И (ДатьПриоритетОперации(лпТокен) >= ДатьПриоритетОперации(СтекВершина(лпСтек))) И СтекВершина(лпСтек) <> "("  Цикл
				лпСтрокаВыход = лпСтрокаВыход + СтекВершина(лпСтек) + "!";
				СтекУдалить(лпСтек);
			КонецЦикла;
			СтекДобавить(лпСтек, лпТокен);
		КонецЕсли;
		
		лпСтрокаВход = Сред(лпСтрокаВход, 2, 777);
	КонецЦикла;
	
	Пока НЕ СтекПустой(лпСтек) Цикл
		лпСтрокаВыход = лпСтрокаВыход + СтекВершина(лпСтек) + "!";
		СтекУдалить(лпСтек);
	КонецЦикла;
	
	пвПостфиксная = лпСтрокаВыход;
 
//вычисление через стек:
	лпТекс = СтрЗаменить(лпСтрокаВход, "!", Символы.ПС);
	Для Ит = 1 По СтрЧислоСтрок(лпТекс) Цикл
		лпТокен = СтрПолучитьСтроку(лпТекс, Ит);
		лпТипТокена = ТокенТип(лпТокен);
		Если лпТипТокена = "Число" Тогда
			СтекДобавить(лпСтек, Число(лпТокен));
		КонецЕсли;
		Если лпТипТокена = "Функция" Тогда
			лпОператор2 = СтекВершина(лпСтек);
			СтекУдалить(лпСтек);
			лпОператор1 = СтекВершина(лпСтек);
			СтекУдалить(лпСтек);
			Если лпТокен = "+" Тогда
				лпРезультат = лпОператор1 + лпОператор2;
			КонецЕсли;
			Если лпТокен = "-" Тогда
				лпРезультат = лпОператор1 - лпОператор2;
			КонецЕсли;
			Если лпТокен = "*" Тогда
				лпРезультат = лпОператор1 * лпОператор2;
			КонецЕсли;
			Если лпТокен = "/" Тогда
				лпРезультат = лпОператор1 / лпОператор2;
			КонецЕсли;
			СтекДобавить(лпСтек, лпРезультат);
		КонецЕсли;
	КонецЦикла;

Обратная польская запись алгоритм Дейкстры

См. также

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9324    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2197    24    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16327    142    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7343    quazare    8    

110

Хитрости СКД. Часть 3

СКД Универсальные функции Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    9381    milkers    11    

94

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной статье я рассматриваю несколько полезных "классических" функций и процедур для работы с данными, которые уже встроены в БСП и готовы к использованию.

25.04.2022    15254    quazare    11    

138

Несколько простых приемов для удобной работы в конфигураторе

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    17586    acces969    95    

148
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. IvanBoychuk123 10 06.07.15 17:27 Сейчас в теме
А чем функция Вычислить(<Выражение>) не подошла?
aexeel; dmpas; vasyak319; +3 Ответить
2. dmpas 418 06.07.15 20:29 Сейчас в теме
я, конечно, люблю польские записи, всякую алгоритмику и прочее, но раз уж тут приведена исходная задача, то присоединюсь к (1).
3. wbazil 138 06.07.15 21:57 Сейчас в теме
тем что это просто модель, а в реальной конфе все по другому но на основе этого модуля
PS приводить конфу смысла нет она специфическая
4. wbazil 138 06.07.15 22:03 Сейчас в теме
если сообщество найдет формулу которая преобразовывается не корректно, буду благодарен, я конечно тестил, но через некоторое время в рабочую базу пойдет
лишняя проверка не помеха

заранее спасибо
5. Nikola23 698 07.07.15 07:59 Сейчас в теме
а зачем все это? в 1с памяти не хватает? Википедия пишет, что такая запись - необходимость оптимизации памяти, если речь идет о байтах.
6. wbazil 138 07.07.15 08:11 Сейчас в теме
дело не в памяти, в общем задачу можно сформировать так:
нужно создать документ который сможет повторить формулы с excel, конвертацию валют, получение данных для расчета с внешней программы(не 1с).
RainyAugust22; +1 Ответить
7. logos 210 08.07.15 09:26 Сейчас в теме
(6) Терзают меня смутные сомнения, что делать сие на языке 1С - не самое быстрое решение. Таки транслятор кода модулей конфигурации очень медленный. Не думали о переносе этого функционала во внешнюю компоненту. Мне кажется скорость должна вырасти в разы, если не больше.
9. wbazil 138 08.07.15 15:57 Сейчас в теме
(7) так не спрашивают же, говорят надо
8. Prometeus2011 211 08.07.15 13:00 Сейчас в теме
Оставьте свое сообщение