Перевод десятичного числа в HEX, BIN, OCT, _IdToStr и другие системы

05.06.14

Разработка - Инструментарий разработчика

Два алгоритма перевода десятичного числа в другую систему исчисления от 2 до 36 только средствами 1С (без ВК)

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

Наименование Файл Версия Размер
АлгоритмПеревода10числаВДругуюСистемуИсчисления
.ert 35,50Kb
16
.ert 2014.06.04 35,50Kb 16 Скачать

Задача вроде бы тривиальная.

Но не нашел БЫСТРОГО ответа на вопрос :

 

Как перевести средствами встроенного языка 1С 10-ное число в HEX ?

Ну и заодно - в BIN, в OCT и в другие системы исчисления ?

 

Пришлось достать учебники по математике Laughing и написать эту статью.

В результате - получил 2ва алгоритма:

- первый : с рекурсивными вызовами после остатка от деления по основанию Х

- второй : через логарифмы с циклом

 

Коротко о главном:

1) первый алгоритм - получился быстрее. Вот результаты:

   

	//Вариант 1: время = 77.697 сек , Обработано чисел = 1 000 000
	//65535 (HEX) = FFFF
	//65535 (BIN) = 1111111111111111
	//65535 (OCT) = 177777
	//65535 (_IdToStr) = 1EKF
	//на одно вычисление = 0,000077697 сек для случая _IdToStr

	//Вариант 2: время = 85.547 сек, Обработано чисел = 1 000 000
	//65535 (HEX) = FFFF
	//65535 (BIN) = 1111111111111111
	//65535 (OCT) = 177777
	//65535 (_IdToStr) = 1EKF	
	// на одно вычисление = 0,000085547 сек для случая _IdToStr
 

 

2) второй алгоритм (если честно) был подсмотрен в реализации SQL-функции для _IdToStr
и модифицирован для универсальности (не только для основания 36, а для любого основания).
Эта SQL-функция широко используется в сообществе 1С++
(К сожалению, автора-первооткрывателя : не знаю, поэтому - поклон ему и всем участникам проекта Laughing )

 

Алгоритмы (что во вложении) написаны для 1С.7.7

Алгоритмы универсальные: поэтому легко переделать для 1С8.* с учетом особенностей языков.

алгоритм перевод числа HEX BIN OCT _IdToStr по основанию система исчисления

См. также

Консоль запросов

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    21526    54    Gvozdod    8    

14

StartManager 1.4 - Развитие альтернативного стартера

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    165604    1863    Alexoniq    1596    

496

Tray Informer

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    32866    61    O-Planet    78    

49

Изменение структуры баз 1С 7.7 без долгой реструктуризации. Часть 1. Справочники

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    21179    Reptile    5    

35

v7.7 1CDialogControls: Инструмент в помощь разработчику на 7.7.

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18023    35    MarSeN    14    

16

[Разработчику] Любая таблица значений в OLAP

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36093    51    venger    7    

23

Библиотека кода 1С 7.7 (накопленная за 8 лет)

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Весь код на 1С 7.7, собранный для повторного использования за 8 лет работы.

10 стартмани

25.11.2012    34943    248    adhocprog    51    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Ветер в поле 3 21.07.15 00:18 Сейчас в теме
Понадобилась функция для перевода из одного основания в другое.
Сначала написал свою, потом скачал это.

Вариант 2 содержит ошибку.
Когда число = Основание в степени Н, то происходит лишняя итерация.
Ошибка тут:
Знч = цел(Ln(ч10)/Ln(чОснование)) +1
Для i=1 По Знч-1 Цикл
чСтепень = чСтепень*чОснование;
КонецЦикла;

Вот демонстрация:
Вариант 1: время = 0.475, КвоИтераций=10000
1679616 = 19A100
1679616 = 110011010000100000000
1679616 = 6320400
1679616 = 10000

Вариант 2: время = 0.465, КвоИтераций=10000
1679616 = 19A100
1679616 = 110011010000100000000
1679616 = 6320400
1679616 = 000

Вариант 3: время = 0.046, КвоИтераций=10000
1679616 = 19A100
1679616 = 110011010000100000000
1679616 = 6320400
1679616 = 10000

Благо это самый тормозной алгоритм и его вряд ли кто использовал.
Просто будьте внимательнее.

P.S. 3-й вариант мой, но он использует еще и внешние компоненты.
К сожалению, в 1С++ используется сильно ограниченная версия перевода числа из одной системы в другую.
Она только для чисел до 2^31 - 1. Это чуть больше 2 миллиардов.
2. Ветер в поле 3 21.07.15 00:22 Сейчас в теме
Ну и мой вариант, может кому пригодится:

Используются объекты из 1С++
глМД = СоздатьОбъект("MetaDataWork");
глМатематика = СоздатьОбъект("Математика");

Функция глПеревестиСтрИзОдногоОснованияВДругое(Знач СтрЧисло, ОснованиеИз, ОснованиеВ) Экспорт
	
	СтрСимволов = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
	//сначала переведем в число
	Если ОснованиеИз = 10 Тогда
		Число10 = Число(СтрЧисло); //небольшая оптимизация
		
	Иначе
		СтрЧисло = СокрЛП(СтрЧисло);
		
		//оптимизация: вычислим макс. кол-во знаков, кот. сможет осилить функция глМД.СтрокуВЧисло
		Число10 = 0;
		МощностьПозиции = 0;
		МаксКолвоСимволов = Цел(Лог(2147483646) / Лог(ОснованиеИз));
		
		Пока СтрДлина(СтрЧисло) > 0 Цикл
			Если МощностьПозиции = 0  Тогда
				МощностьПозиции = 1;
				
			Иначе				
				МощностьПозиции = МощностьПозиции * глМатематика.POW(ОснованиеИз, МаксКолвоСимволов);
			КонецЕсли;
			
			Число10 = Число10 + глМД.СтрокаВЧисло(Прав(СтрЧисло, МаксКолвоСимволов), ОснованиеИз) * МощностьПозиции;
			СтрЧисло = Лев(СтрЧисло, СтрДлина(СтрЧисло) - МаксКолвоСимволов);
		КонецЦикла;
	КонецЕсли;
	
	СтрРезультата = "";
	Пока Число10 > 2147483646 Цикл
		СтрРезультата = Сред(СтрСимволов, Строка(1 + (Число10 % ОснованиеВ)), 1) + СтрРезультата;
		Число10 = Цел(Число10 / ОснованиеВ);
	КонецЦикла;
	
	Возврат глМД.ЧислоВСтроку(Число10, ОснованиеВ) + СтрРезультата;
	
КонецФункции //глПеревестиСтрИзОдногоОснованияВДругое
Показать
3. webester 26 07.06.20 07:47 Сейчас в теме
Тем кто ищет для 8ки
Функция Из_10_В_Любую(Знач Значение=0,Нотация=36) Экспорт
	Если Нотация<=0 Тогда Возврат("") КонецЕсли;
	Значение=Число(Значение);
	Если Значение<=0 Тогда Возврат("0") КонецЕсли;
	Значение=Цел(Значение);
	Результат="";
	Пока Значение>0 Цикл
		Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат;
		Значение=Цел(Значение/Нотация) ;
	КонецЦикла;
	Возврат Результат;
КонецФункции

Функция Из_Любой_В_10(Знач Значение="0",Нотация=36) Экспорт
	Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
	Значение=СокрЛП(Значение);
	Если Значение="0" Тогда Возврат(0) КонецЕсли;
	Результат=0;
	Длина=СтрДлина(Значение);
	Для Х=1 По Длина Цикл
		М=1;
		Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
		Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
	КонецЦикла;
	Возврат Окр(Результат);
КонецФункции

Показать
Irwin; check2; +2 Ответить
Оставьте свое сообщение