Функция ПеревестиЧислоИзШестнадцатиричногоВДесятичное(СтрокаХекс) Экспорт
мСтрокаХекс = СокрЛП(СтрокаХекс);
СтрДлинаХексЧисла = СтрДлина(мСтрокаХекс);
ДесятичноеЧисло = 0;
Для Сч = 0 По СтрДлинаХексЧисла-1 Цикл
Множитель = Pow(16,Сч);
//Сообщить(«Множитель:»+Строка(Множитель));
НехЧисло1Байт = Сред(мСтрокаХекс,СтрДлинаХексЧисла-Сч,СтрДлинаХексЧисла-Сч);
//Сообщить(«ХексЧисло1Байт:» + НехЧисло1Байт);
Если НехЧисло1Байт = «A» Тогда
ДесятичноеЧисло = ДесятичноеЧисло + 10*Множитель;
ИначеЕсли НехЧисло1Байт = «B» Тогда
ДесятичноеЧисло = ДесятичноеЧисло + 11*Множитель;
ИначеЕсли НехЧисло1Байт = «C» Тогда
ДесятичноеЧисло = ДесятичноеЧисло + 12*Множитель;
ИначеЕсли НехЧисло1Байт = «D» Тогда
ДесятичноеЧисло = ДесятичноеЧисло + 13*Множитель;
ИначеЕсли НехЧисло1Байт = «E» Тогда
ДесятичноеЧисло = ДесятичноеЧисло + 14*Множитель;
ИначеЕсли НехЧисло1Байт = «F» Тогда
ДесятичноеЧисло = ДесятичноеЧисло + 15*Множитель;
Иначе
Попытка
ДесятичноеЧисло = ДесятичноеЧисло + Число(НехЧисло1Байт)*Множитель;
Исключение;
//не число от 0 до 9
КонецПопытки
КонецЕсли;
КонецЦикла;
Возврат ДесятичноеЧисло;
КонецФункции





да уж… жесть жестяная.
Спасибо за ссылку — теперь будет и на инфостате, если кто будет искать
Во многих типовых есть процедуры типае — ОбщегоНазначения.ДесятичноеВШестнадцатиричное
и ОбщегоНазначенияЗК.ШестнадцатиричноеВДесятичное
Спасибо, посмотрел в конфах: «Розница»,»БСП» — нет такой функции.
В УПП есть:
Функция ДесятичноеВШестнадцатиричное(Источник) Экспорт
ШеснадцатиричныеСимволы = «0123456789ABCDEF»;
Если Источник < 0 Тогда
Возврат «00»;
КонецЕсли;
Если Источник > 255 Тогда
Возврат «FF»;
КонецЕсли;
ПервыйСимвол = Цел(Источник / 16) + 1;
ВтройСимвол = Источник % 16 + 1;
Возврат Сред(ШеснадцатиричныеСимволы, ПервыйСимвол, 1) + Сред(ШеснадцатиричныеСимволы, ВтройСимвол, 1);
КонецФункции
Функция ШестнадцатиричноеВДесятичное(Источник) Экспорт
Результат = 0;
ШеснадцатиричныеСимволы = «0123456789ABCDEF»;
ДлинаСтроки = СтрДлина(Источник);
Для Поз = 1 По ДлинаСтроки Цикл
ИскомыйСимвол = Сред(Источник,Поз,1);
ЗначениеСимвола = Найти(ШеснадцатиричныеСимволы, ВРег(ИскомыйСимвол));
Если ЗначениеСимвола <=0 Тогда
#Если ТолстыйКлиентОбычноеПриложение Тогда
Сообщить(«В числе обнаружен неверный символ: «»» + ИскомыйСимвол+ «»» «);
#КонецЕсли
Результат = 0;
Прервать;
Иначе
ЗначениеСимвола = ЗначениеСимвола — 1;
Результат = Результат + ЗначениеСимвола * Pow(16, ДлинаСтроки-Поз);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Похоже в Вашем коде неточность.
Строку
я бы переписал следующим образом:
После долгих поисков и раздумий
Вот две функции из десятичного в шестнадцатиричное
и обратно.
Просто, понятно и со вкусом 🙂
Показать
Пользуйтесь 🙂
P.S. Сорри за монохромный код. (так и не понял как он тут раскрашивается).
Спасибо за функции!
(7) bzmax, вы тестировали свою функцию DecToHex на значениях меньше 10? Вы же получите строчку с длиной меньше 2!
(9) kotich,
Вы сами то поняли, что сказали? 🙂
Смысл перегонять десятичные в шестнадцатиричные меньше 10 если они ОДИНАКОВЫ!
(1,2,3,4,5,6,7,8,9)
Достаточно из числа например 5, сделать строку «5».
🙂
В ФР Штрих-М овском есть драйвер, который сию команду (установку времени) в 2 строки делает. Без всяких шестнадцатеричных-десятичных приблуд.
(11) Goruch, А обратно из ККМ тоже в десятичном формате?
От ККМ надо разбирать ответы по битам
Тоже можно… ща найду…
ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;
ФискальныйРегистратор.Connect();
Если ФискальныйРегистратор.ResultCode<>0 Тогда
Предупреждение(«Ошибка кассы: «+ФискальныйРегистратор.ResultCodeDescription+»!»);
Возврат;
КонецЕсли;
ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;
ФискальныйРегистратор.GetECRStatus();
Если ФискальныйРегистратор.ResultCode<>0 Тогда
Предупреждение(«Ошибка кассы: «+ФискальныйРегистратор.ResultCodeDescription+»!»);
Возврат;
КонецЕсли;
ДатаВККМ=Дата(ФискальныйРегистратор.Date);
ВремяВККМ=Строка(ФискальныйРегистратор.TimeStr);
Скопировал код целиком с Штрих-М Кассира.
(10) bzmax, вы когда пишите код, добавляйте проверки. Например, если параметр не входит в диапазон, выдавайте предупреждение, а ещё лучше — вызывайте исключение. Поймите, когда данная функция вызывается в цикле для массива десятичных чисел, на выходе собирается , строка шестнадцатеричного представления, подобную ошибку в работе вашего кода отследить довольно трудно, в 15 случаях из 16 она отработает корректно. Для 1С это актуально в том случае, если она работает с внешними базами через уникальные идентификаторы объектов.
(16) Goruch,
Я пользовался драйвером для 1С: Из описания работы с ПО «ШТРИХ-М: Драйвер ФР» в соответствии с «требованиями к разработке драйверов для фискальных регистраторов» компании 1С:
Там нет функций установки даты и времени только через команды: DeviceControl(УправлениеУстройством) или DeviceControlHEX(УправлениеУстройствомХекс)
(18) Обычно для периферии сканеры штрих-кодов, ТСД, Весы для печати этикеток, различные пос приблуды лучше использовать драйвера или атолла или Штрих-М.
Иначе возни и мороки, как в вашем случае море.
Единственное, когда я писал выгрузку товаров из 1С Штрих-М Кассир в весы там пришлось серьезно возиться с 10<->16 системы исчисления. Так что не завидую.:)
Вдогонку — описание драйвера ФР от Штрих-М.
Автора на мыло!!! Смотреть лучше тут
Спасибо за ссылку. А прежде чем ругать сам, то что-нибудь создал?
Проще некуда… перестаньте бездумно возводить в степень!!!
Прикольно тема не поднималась 3 года
Но я же не с пустыми руками пришел. Все же поисковик эту тему охотно выдает, поэтому у нее должен быть счастливый конец.
Оптимистично!!!