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

05.06.14

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
АлгоритмПеревода10числаВДругуюСистемуИсчисления
.ert 35,50Kb ver:2014.06.04
16
16 Скачать (1 SM) Купить за 1 850 руб.

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

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

 

Как перевести средствами встроенного языка 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 1C77 Абонемент ($m)

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

10 стартмани

29.04.2015    22670    57    Gvozdod    8    

17

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

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

1 стартмани

23.04.2014    170019    1897    Alexoniq    1603    

500

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

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

1 стартмани

04.09.2013    33635    61    O-Planet    78    

49

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

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

1 стартмани

13.08.2013    22209    Reptile    5    

36

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

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

1 стартмани

14.07.2013    27980    56    adamx    11    

14

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

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

1 стартмани

21.02.2013    18607    36    MarSeN    14    

17

Инструментарий разработчика Программист Платформа 1С v7.7 1C77 Абонемент ($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    36564    51    venger    7    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 Ответить
Оставьте свое сообщение