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

06.07.15

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
МодульСтека
.epf 7,97Kb ver:1.0
11
11 Скачать (1 SM) Купить за 1 850 руб.

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

Обычная запись ОПЗ Результат
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;
			КонецЕсли;
			СтекДобавить(лпСтек, лпРезультат);
		КонецЕсли;
	КонецЦикла;

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

См. также

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

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

21.05.2024    20125    dimanich70    81    

144

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

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

28.08.2023    14730    YA_418728146    7    

166

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

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

2 стартмани

22.08.2023    3580    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18478    171    sapervodichka    112    

135

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

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

18.07.2022    8371    quazare    8    

111

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

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

28.05.2022    10435    milkers    11    

98

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

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

25.04.2022    19169    quazare    11    

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

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