Перевод из шестнадцатеричного числа в десятичное

11.02.13

Разработка - Универсальные функции

Необходимо было сопряжение фискального регистратора(ФР) Штрих..  - установка времени компьютера на фискальном регистраторе - пришлось общаться с ФР с помощью команд в шестнадцатеричном формате. Перевод из десятичного формата в шестнадцатеричный нашел - http://infostart.ru/public/83824/, а обратно нет, пришлось написать. И вот что получилось

Функция ПеревестиЧислоИзШестнадцатиричногоВДесятичное(СтрокаХекс) Экспорт

                мСтрокаХекс = СокрЛП(СтрокаХекс);

                СтрДлинаХексЧисла = СтрДлина(мСтрокаХекс);

                ДесятичноеЧисло = 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

                                               КонецПопытки

                               КонецЕсли;

                КонецЦикла;

                Возврат ДесятичноеЧисло;

 КонецФункции

 

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2664    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4595    atdonya    22    

45

Переоткрытие внешних обработок

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

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3956    ke.92@mail.ru    16    

61

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

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

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

28.08.2023    8802    YA_418728146    6    

141

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

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

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

2 стартмани

22.08.2023    2071    21    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    16140    133    sapervodichka    112    

129

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

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

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

18.07.2022    7242    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. andrewks 1368 07.02.13 14:06 Сейчас в теме
да уж... жесть жестяная.

http://my1c-archive.narod.ru/knowhow/uni_conv.html
imfal; Sergey_Nazarov; vladimir2008; Serj1C; +4 Ответить
2. vladimir2008 13 07.02.13 15:18 Сейчас в теме
Спасибо за ссылку - теперь будет и на инфостате, если кто будет искать
3. Gesperid 2 13.02.13 08:32 Сейчас в теме
Во многих типовых есть процедуры типае - ОбщегоНазначения.ДесятичноеВШестнадцатиричное
vladimir2008; +1 Ответить
4. Gesperid 2 13.02.13 08:33 Сейчас в теме
и ОбщегоНазначенияЗК.ШестнадцатиричноеВДесятичное
5. vladimir2008 13 13.02.13 09:36 Сейчас в теме
Спасибо, посмотрел в конфах: "Розница","БСП" - нет такой функции.
В УПП есть:
Функция ДесятичноеВШестнадцатиричное(Источник) Экспорт

ШеснадцатиричныеСимволы = "0123456789ABCDEF";

Если Источник < 0 Тогда
Возврат "00";
КонецЕсли;
Если Источник > 255 Тогда
Возврат "FF";
КонецЕсли;

ПервыйСимвол = Цел(Источник / 16) + 1;
ВтройСимвол = Источник % 16 + 1;

Возврат Сред(ШеснадцатиричныеСимволы, ПервыйСимвол, 1) + Сред(ШеснадцатиричныеСимволы, ВтройСимвол, 1);

КонецФункции


Функция ШестнадцатиричноеВДесятичное(Источник) Экспорт

Результат = 0;

ШеснадцатиричныеСимволы = "0123456789ABCDEF";

ДлинаСтроки = СтрДлина(Источник);
Для Поз = 1 По ДлинаСтроки Цикл
ИскомыйСимвол = Сред(Источник,Поз,1);
ЗначениеСимвола = Найти(ШеснадцатиричныеСимволы, ВРег(ИскомыйСимвол));
Если ЗначениеСимвола <=0 Тогда
#Если ТолстыйКлиентОбычноеПриложение Тогда
Сообщить("В числе обнаружен неверный символ: """ + ИскомыйСимвол+ """ ");
#КонецЕсли
Результат = 0;
Прервать;
Иначе
ЗначениеСимвола = ЗначениеСимвола - 1;
Результат = Результат + ЗначениеСимвола * Pow(16, ДлинаСтроки-Поз);
КонецЕсли;
КонецЦикла;

Возврат Результат;

КонецФункции
30. kalyaka 1053 27.05.22 17:47 Сейчас в теме
(5) неверно переводит 847 в FF, а должно быть 34F
6. Linx-p 14.08.13 16:16 Сейчас в теме
Похоже в Вашем коде неточность.
Строку
НехЧисло1Байт = Сред(мСтрокаХекс,СтрДлинаХексЧисла-Сч,СтрДлинаХексЧисла-Сч);


я бы переписал следующим образом:
НехЧисло1Байт = Сред(мСтрокаХекс,СтрДлинаХексЧисла-Сч,1);
7. bzmax 14.08.13 17:37 Сейчас в теме
После долгих поисков и раздумий
Вот две функции из десятичного в шестнадцатиричное
и обратно.
Просто, понятно и со вкусом :)
Функция DecToHex(Знач _Dec) Экспорт 
	ДесятичноеЗначение = _Dec; 
	Результат = ""; 
	Пока ДесятичноеЗначение > 0 Цикл 
		Ост = ДесятичноеЗначение % 16 + 1; 
		Результат = Сред("0123456789ABCDEF", Ост, 1) + Результат; 
		ДесятичноеЗначение = Цел(ДесятичноеЗначение/16); 
	КонецЦикла; 
	Возврат Результат; 
КонецФункции 

Функция HexToDec(Знач _Hex) Экспорт
    База = 16;
    _Hex = СокрЛП(_Hex);
    СтаршаяСтепень = СтрДлина(_Hex) - 1;
    Результат = 0;
    счСимволов = 1;
    Пока СтаршаяСтепень >=0 Цикл
                   _HexСимвол = Сред(_Hex, счСимволов, 1);
                   Представление = Найти("0123456789ABCDEF", _HexСимвол) - 1;
                   Результат = Результат + Представление * Pow(База, СтаршаяСтепень);
                   СтаршаяСтепень = СтаршаяСтепень - 1;
                   СчСимволов = СчСимволов + 1;
    КонецЦикла;   
    Возврат Результат;
КонецФункции
Показать

Пользуйтесь :)
P.S. Сорри за монохромный код. (так и не понял как он тут раскрашивается).
kembrik; dept-1c; Grehmin; kalyaka; svilsa; +5 Ответить
9. kotich 15.08.13 13:24 Сейчас в теме
(7) bzmax, вы тестировали свою функцию DecToHex на значениях меньше 10? Вы же получите строчку с длиной меньше 2!
10. bzmax 15.08.13 13:43 Сейчас в теме
(9) kotich,
Вы сами то поняли, что сказали? :)
Смысл перегонять десятичные в шестнадцатиричные меньше 10 если они ОДИНАКОВЫ!
(1,2,3,4,5,6,7,8,9)
Достаточно из числа например 5, сделать строку "5".
:)
17. kotich 15.08.13 15:19 Сейчас в теме
(10) bzmax, вы когда пишите код, добавляйте проверки. Например, если параметр не входит в диапазон, выдавайте предупреждение, а ещё лучше - вызывайте исключение. Поймите, когда данная функция вызывается в цикле для массива десятичных чисел, на выходе собирается , строка шестнадцатеричного представления, подобную ошибку в работе вашего кода отследить довольно трудно, в 15 случаях из 16 она отработает корректно. Для 1С это актуально в том случае, если она работает с внешними базами через уникальные идентификаторы объектов.
31. kalyaka 1053 27.05.22 17:51 Сейчас в теме
(7) Зато работает! Спасибо.
8. vladimir2008 13 14.08.13 21:14 Сейчас в теме
11. Goruch 7 15.08.13 13:47 Сейчас в теме
В ФР Штрих-М овском есть драйвер, который сию команду (установку времени) в 2 строки делает. Без всяких шестнадцатеричных-десятичных приблуд.
12. vladimir2008 13 15.08.13 14:15 Сейчас в теме
(11) Goruch, А обратно из ККМ тоже в десятичном формате?
13. vladimir2008 13 15.08.13 14:17 Сейчас в теме
От ККМ надо разбирать ответы по битам
14. Goruch 7 15.08.13 14:29 Сейчас в теме
Тоже можно... ща найду...
15. Goruch 7 15.08.13 14:32 Сейчас в теме
ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;
ФискальныйРегистратор.Connect();
Если ФискальныйРегистратор.ResultCode<>0 Тогда
Предупреждение("Ошибка кассы: "+ФискальныйРегистратор.ResultCodeDescription+"!");
Возврат;
КонецЕсли;
ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;
ФискальныйРегистратор.GetECRStatus();
Если ФискальныйРегистратор.ResultCode<>0 Тогда
Предупреждение("Ошибка кассы: "+ФискальныйРегистратор.ResultCodeDescription+"!");
Возврат;
КонецЕсли;
ДатаВККМ=Дата(ФискальныйРегистратор.Date);
ВремяВККМ=Строка(ФискальныйРегистратор.TimeStr);
16. Goruch 7 15.08.13 14:32 Сейчас в теме
Скопировал код целиком с Штрих-М Кассира.
18. vladimir2008 13 15.08.13 16:22 Сейчас в теме
(16) Goruch,
Я пользовался драйвером для 1С: Из описания работы с ПО «ШТРИХ-М: Драйвер ФР» в соответствии с «требованиями к разработке драйверов для фискальных регистраторов» компании 1С:
Там нет функций установки даты и времени только через команды: DeviceControl(УправлениеУстройством) или DeviceControlHEX(УправлениеУстройствомХекс)
Прикрепленные файлы:
DriverFR_ specification_1C.pdf
19. Goruch 7 15.08.13 16:44 Сейчас в теме
(18) Обычно для периферии сканеры штрих-кодов, ТСД, Весы для печати этикеток, различные пос приблуды лучше использовать драйвера или атолла или Штрих-М.
Иначе возни и мороки, как в вашем случае море.

Единственное, когда я писал выгрузку товаров из 1С Штрих-М Кассир в весы там пришлось серьезно возиться с 10<->16 системы исчисления. Так что не завидую.:)
20. Goruch 7 15.08.13 16:46 Сейчас в теме
21. DrZombi 286 26.09.14 16:09 Сейчас в теме
Автора на мыло!!! Смотреть лучше тут http://kb.mista.ru/article.php?id=78
It-developer; +1 Ответить
22. vladimir2008 13 26.09.14 20:10 Сейчас в теме
Спасибо за ссылку. А прежде чем ругать сам, то что-нибудь создал?
23. DrZombi 286 30.10.14 13:45 Сейчас в теме
Фсё просто, сударь...

1. Добавляете общий модуль "ФискальникиКлиент" - Только клиент, толстый клиент и внешнее соединение

Функция ТестОборудование(Оборудование, ПолныйЛог = Ложь) Экспорт 
	// Пишем лог
	Лог = Формат(МенеджерОборудованияКлиентПереопределяемый.ДатаСеанса(),"ДЛФ=T") + " Имя команды: ТестУстройства" + Символы.ПС;

	ВходныеПараметры  = Неопределено;
	ВыходныеПараметры = Неопределено;

	ПараметрыУстройства = МенеджерОборудованияКлиентПовтИсп.ПолучитьПараметрыУстройства(Оборудование);

	Результат = МенеджерОборудованияКлиент.ВыполнитьДополнительнуюКоманду("CheckHealth",
	                                                                      ВходныеПараметры,
	                                                                      ВыходныеПараметры,
	                                                                      Оборудование,
	                                                                      ПараметрыУстройства);
	Если Не Результат Тогда
		Попытка 
			ОписаниеОшибки = ВыходныеПараметры[1];
		Исключение
			ОписаниеОшибки = "";
		КонецПопытки;
		
		ОписаниеОшибки = "Тест не был пройден!" + Символы.ПС + ОписаниеОшибки;
		
		РезНаОшибку = Новый Структура("Результат,ОписаниеОшибки,Лог",Ложь,ОписаниеОшибки,"");
		
	Иначе
		Если ПолныйЛог <> Истина Тогда 
			Возврат Неопределено;
		КонецЕсли;
		
		ОписаниеОшибки = "Команда выполнена успешно!"+(?(ВыходныеПараметры.Количество()>1, Символы.ПС+ВыходныеПараметры[1], ""));
		
		РезНаОшибку = Новый Структура("Результат,ОписаниеОшибки,Лог",Истина,ОписаниеОшибки,"");
	КонецЕсли;

	// Пишем лог
	Лог = Лог + Формат(МенеджерОборудованияКлиентПереопределяемый.ДатаСеанса(),"ДЛФ=T") + " " + ОписаниеОшибки + Символы.ПС +
	      "========================================" + Символы.ПС;
	ОтветОтУстройства = Лог + ОтветОтУстройства;
	
	РезНаОшибку.Лог = ОтветОтУстройства;
	
	Возврат РезНаОшибку;
КонецФункции

//Объект - Структура вида: "Команда" (Команда в формате Хекс для ФР через пробелы "13 1E 00 00 00") 
//                         и "КассаККМ" (КассаККМ - касса для отбора, функция доступна только для ФР)
Функция ВыполнитьКоманду(Объект, ФР, УникальИдент, РезультатПробитияЧека = Неопределено) Экспорт 
	Перем РезПечатиЧека;
	
	РезПечатиЧека  = Неопределено; //Нормальное состояние - чек не печатался, возможно просто нет Фискальника
	
	Если ФискальникиСервер.ФискальныйРегистраторПоКассе(Объект.КассаККМ) = Истина Тогда
		//
		
		Если МенеджерОборудованияКлиент.ОбновитьРабочееМестоКлиента() Тогда // Проверка на определенность рабочего места ВО
			
			Если ФР.Пустая() Тогда
				ИдентификаторУстройства = МенеджерОборудованияКлиент.ВыбратьУстройство("ФискальныйРегистратор",
				НСтр("ru='Выберите фискальный регистратор'"),
				НСтр("ru='Фискальный регистратор не подключен'"));
			Иначе
				ИдентификаторУстройства = ФР;
			КонецЕсли;
			
			Если ИдентификаторУстройства <> Неопределено Тогда
				
				РезТестаОборудования = ФискальникиКлиент.ТестОборудование(ИдентификаторУстройства);
				Если РезТестаОборудования <> Неопределено Тогда 
					ТекстСообщения = НСтр("ru = 'При проверке устройства произошла ошибка. Команда не выполнена на фискальном регистраторе.
					|Дополнительное описание:
					|%ДополнительноеОписание%'");
					
					ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ДополнительноеОписание%", РезТестаОборудования.Лог);
					
					ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
					
					РезПечатиЧека = -5; //Число, код ошибки...
					
					Возврат РезПечатиЧека;
				КонецЕсли;
				
				// Подключаем ФР
				ОписаниеОшибки_ = "";
				Результат = МенеджерОборудованияКлиент.ПодключитьОборудованиеПоИдентификатору(УникальИдент,
				ИдентификаторУстройства,
				ОписаниеОшибки_);
				
				Если Результат Тогда
					
					// Готовим данные
					ВходныеПараметры  = Новый Массив;
					ВыходныеПараметры = Неопределено;
					
					ВходныеПараметры.Добавить(Объект.Команда);
					
					// Выполняем команду.
					Попытка
						Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(
						ИдентификаторУстройства,
						"DeviceControlHEX",
						ВходныеПараметры,
						ВыходныеПараметры);
					Исключение
						СтрОписОшибки = ОписаниеОшибки();
						Если ТипЗнч(ВыходныеПараметры) <> Тип("Массив") Тогда 
							ВыходныеПараметры = Новый Массив;
						КонецЕсли;
						КолМасс = ВыходныеПараметры.Количество();
						Для Сч = КолМасс По 4 Цикл 
							ВыходныеПараметры.Добавить(Неопределено);
						КонецЦикла;
						ВыходныеПараметры[0] = 999;
						ВыходныеПараметры[1] = "Вызвыно Исключение ""ВыполнитьКоманду""";
						ВыходныеПараметры[3] = СтрОписОшибки;
						
						Результат = Ложь;
					КонецПопытки;
					// Отключаем ФР
					МенеджерОборудованияКлиент.ОтключитьОборудованиеПоИдентификатору(УникальИдент,
					ИдентификаторУстройства);
					
					Если Результат Тогда
						
						// Установить полученное значение номера чека реквизиту документа.
						
						РезПечатиЧека = 1; //Число, Положительный, все замечательно						
						
					Иначе
						
						ТекстСообщения = НСтр("ru = 'При выполнении команды произошла ошибка. Команда не выполнена на фискальном регистраторе.
						|Дополнительное описание: %ДополнительноеОписание%'");
						
						ТекстСообщения = СтрЗаменить(ТекстСообщения,
						"%ДополнительноеОписание%",
						ВыходныеПараметры[1]);
						ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
						
						РезПечатиЧека = -1; //Число, код ошибки...
						
					КонецЕсли;
					
					Если РезультатПробитияЧека = Неопределено Тогда 
						РезультатПробитияЧека = Новый Структура;
					КонецЕсли;
					
					РезультатПробитияЧека.Вставить("КодОшибки",ВыходныеПараметры[0]);
					РезультатПробитияЧека.Вставить("Расшифровка",ВыходныеПараметры[1]);
					РезультатПробитияЧека.Вставить("ВыхДанные",ВыходныеПараметры[2]);
					РезультатПробитияЧека.Вставить("ОписаниеОшибки",ВыходныеПараметры[3]);
					
				Иначе
					
					ТекстСообщения = НСтр("ru = 'При подключении устройства произошла ошибка. Команда не выполнена на фискальном регистраторе.
					|Дополнительное описание: %ДополнительноеОписание%'");
					
					ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ДополнительноеОписание%", ОписаниеОшибки_);
					
					ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
					
					РезПечатиЧека = -2; //Число, код ошибки...
					
				КонецЕсли;
				
			Иначе
				
				ТекстСообщения = НСтр("ru = 'Не выбран фискальный регистратор.'");
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
				
				РезПечатиЧека = -3; //Число, код ошибки...
				
			КонецЕсли;
			
		Иначе
			
			ТекстСообщения = НСтр("ru = 'Предварительно необходимо выбрать рабочее место внешнего оборудования текущего сеанса.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
			
			РезПечатиЧека = -4; //Число, код ошибки...
			
		КонецЕсли;
		
	ИначеЕсли ФискальникиСервер.ФискальныйРегистраторПоКассе(Объект.КассаККМ) = Ложь Тогда 
		//Это обычная касса, или Чекопичатающая машинка...
		Если РезультатПробитияЧека = Неопределено Тогда 
			РезультатПробитияЧека = Новый Структура;
		КонецЕсли;
		РезультатПробитияЧека.Вставить("ПровестиДокумент",Истина);
	КонецЕсли;
	
	Возврат РезПечатиЧека;
КонецФункции
Показать





2. Добавляете общий модуль "ФискальникиСервер"

Функция Из_10_В_Любую(Знач Значение=0,Нотация=36) Экспорт
     Если Нотация<=0 Тогда Возврат("") КонецЕсли;
     Значение=Число(Значение);
     Если Значение<=0 Тогда Возврат("0") КонецЕсли;
     Значение=Цел(Значение);
     Результат="";
     Пока Значение>0 Цикл
          Результат=Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Значение%Нотация+1,1)+Результат;
          Значение=Цел(Значение/Нотация) ;
     КонецЦикла;
     Возврат Результат;
КонецФункции
//_________________________________________________________

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

Функция ПеревестиЧислоИз16в10(СтрокаХекс) Экспорт
	Возврат Из_Любой_В_10(СтрокаХекс, 16);
КонецФункции

Функция ПеревестиЧислоИз10в16(Число, Байт = Неопределено, НулиСправа = Истина) Экспорт
	
	ЧислВ16 = Из_10_В_Любую(Число, 16);
	
	Если Байт <> Неопределено и Байт > 0 Тогда 
		//Допишем нулики, не достающие...
		пКолСимв = Байт * 2; //1 байт = 2 символам
		
		//Подставим недостающие нули
		СтДлин = СтрДлина(ЧислВ16);
		Если СтДлин = 0 Тогда 
			//Заполним нулями
			Для Сч = 1 По Байт Цикл 
				ЧислВ16 = ЧислВ16 + "00";
			КонецЦикла;
			
		ИначеЕсли СтДлин % 2 <> 0 Тогда 
			//Если нехватает одного нулика
			ЧислВ16 = "0" + ЧислВ16;
		КонецЕсли;
		
		//Проверем на избыток
		СтДлин = СтрДлина(ЧислВ16);
		Если СтДлин > пКолСимв Тогда 
			ЧислВ16 = "";
			Для Сч = 1 По Байт Цикл 
				Если НулиСправа = Истина Тогда 
					ЧислВ16 = ЧислВ16 + "00";
				Иначе 
					ЧислВ16 = "00" + ЧислВ16;
				КонецЕсли;
			КонецЦикла;
		Иначе 
			//Добъем просто нулями до кондиции!!!
			Для Сч = СтДлин+1 По пКолСимв Цикл 
				Если НулиСправа = Истина Тогда 
					ЧислВ16 = ЧислВ16 + "0";
				Иначе 
					ЧислВ16 = "0" + ЧислВ16;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	Иначе 
		//Подставим недостающие нули
		СтДлин = СтрДлина(ЧислВ16);
		Если СтДлин % 2 <> 0 Тогда 
			//Если нехватает одного нулика
			ЧислВ16 = "0" + ЧислВ16;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ЧислВ16;
КонецФункции

//В конец и в начале пробелы сокращатся
Функция МеждуДвумяСимволамиПробел(Число16) Экспорт 
	
	пЧисло16 = СокрЛП(Число16);
	СтрДлин = СтрДлина(пЧисло16);
	КолРаз = Цел(СтрДлин/2);
	Если КолРаз <> (СтрДлин/2) Тогда 
		КолРаз = КолРаз + 1;
	КонецЕсли;
	
	Сч = 1;
	Если Сч <= КолРаз Тогда 
		РезпЧисло16 = "";
		Сч_ = 1;
		Пока Сч <= КолРаз Цикл 
			Симв = Сред(пЧисло16,Сч_,2);
			
			РезпЧисло16 = РезпЧисло16 + Симв + " ";
			
			Сч  = Сч + 1;
			Сч_ = Сч_ + 2;
		КонецЦикла;
	Иначе 
		РезпЧисло16 = пЧисло16;
	КонецЕсли;
	
	Возврат СокрЛП(РезпЧисло16);
КонецФункции

Функция УбратьПробелы(Число16) Экспорт 
	Возврат СтрЗаменить(Число16," ","");
КонецФункции

Функция ПеревернутьСтроку(СтрокаХекс, ПараСимв = 1) Экспорт 
	
	СтрДлин = СтрДлина(СтрокаХекс);
	
	пСтрокаХекс = "";
	
	Сч = 1;
	Пока Сч <= СтрДлин Цикл 
		СледСимв = Сред(СтрокаХекс,Сч, ПараСимв);
		СледСимв = ДополнитьСтрокуСправа(СледСимв, ПараСимв, " ");
		
		пСтрокаХекс = СледСимв + пСтрокаХекс;
		
		Сч = Сч + ПараСимв;
	КонецЦикла;
	
	Возврат СокрЛП(пСтрокаХекс);
КонецФункции

Функция ДополнитьСтрокуСправа(СтрокаСимв, КолСимволов, СимволДоп) Экспорт 
	
	КолСимвВсего = СтрДлина(СтрокаСимв);
	
	Если КолСимвВсего < КолСимволов Тогда 
		пСтрокаСимв = СтрокаСимв;
		
		Для Сч = КолСимвВсего+1 По КолСимволов Цикл 
			пСтрокаСимв = пСтрокаСимв + СимволДоп;
		КонецЦикла;
		
		Возврат пСтрокаСимв;
	Иначе 
		Возврат СтрокаСимв;
	КонецЕсли;
		
КонецФункции

Функция ДополнитьСтрокуСлева(СтрокаСимв, КолСимволов, СимволДоп) Экспорт 
	
	КолСимвВсего = СтрДлина(СтрокаСимв);
	
	Если КолСимвВсего < КолСимволов Тогда 
		пСтрокаСимв = СтрокаСимв;
		
		Для Сч = КолСимвВсего+1 По КолСимволов Цикл 
			пСтрокаСимв = СимволДоп + пСтрокаСимв;
		КонецЦикла;
		
		Возврат пСтрокаСимв;
	Иначе 
		Возврат СтрокаСимв;
	КонецЕсли;
		
КонецФункции
Показать




3. В общем модуле модуле "ПодключаемоеОборудованиеШтрихМФискальныеРегистраторыКлиент"­,
а. в функции "ВыполнитьКоманду", прописываете



	// Передает низкоуровневую команду устройству
	ИначеЕсли Команда = "УправлениеУстройствомХекс" ИЛИ Команда = "DeviceControlHEX" Тогда
		КоманднаяСтрока = ВходныеПараметры[0];
		Результат = УправлениеУстройствомХекс(ОбъектДрайвера, Параметры, ПараметрыПодключения, КоманднаяСтрока, ВыходныеПараметры);


б. добавляете туда же функцию:

Функция УправлениеУстройствомХекс(ОбъектДрайвера, Параметры, ПараметрыПодключения, КоманднаяСтрока, ВыходныеПараметры) Экспорт

	Результат = Истина;
	
	пВходныеПараметры  = КоманднаяСтрока;
	пВыходныеПараметры = "";
	
	Попытка
		ОписОшибки = "";
		Результат = ОбъектДрайвера.DeviceControlHex(ПараметрыПодключения.ИДУстройства, пВходныеПараметры, пВыходныеПараметры);
	Исключение
		ОписОшибки = ОписаниеОшибки();
		ОписОшибки = ОписОшибки + Символы.ПС + "Команда - ["+КоманднаяСтрока+"]";
		Результат = Ложь;
	КонецПопытки;
	
	ВыходныеПараметры.Очистить();
	Если НЕ Результат Тогда
		ВыходныеПараметры.Добавить(999);
	Иначе 
		ВыходныеПараметры.Добавить(0);
	КонецЕсли;
	ВыходныеПараметры.Добавить("");
	ВыходныеПараметры.Добавить(пВыходныеПараметры);
	ВыходныеПараметры.Добавить(ОписОшибки);
	ВыходныеПараметры[0] = ОбъектДрайвера.ПолучитьОшибку(ВыходныеПараметры[1]);
	
	Если ПустаяСтрока(ОписОшибки) Тогда 
		ВыходныеПараметры[3] = "Команда - ["+КоманднаяСтрока+"]";
	КонецЕсли;

	Возврат Результат;

КонецФункции
Показать



4. И далее указываете к примеру обращение к внутренним командам драйвера:

//Печать контрольной ленты

&НаКлиенте
Процедура ФР_КонтрольнаяЛента(Команда)
	// Вставить содержимое обработчика.
	
	Если ФР.Пустая() Тогда
		ТекстСообщения = "Оборудование не выбрано!";
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецЕсли;
	
	Если НЕ ЕстьПравоНаПечатьКЛ_ФР() Тогда 
		ТекстСообщения = "Нет права доступа для печати ""Контрольной ленты по смене""!";
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецЕсли;
	
	ТекстВопроса = "Для печати Контрольной ленты необходимо указать: 
	|номер смены в интервале 0000…2100.
	|
	|Рапечатать Контрольную ленту по смене "+Строка(НомерСменыКЛ)+" ?";
	РезОтвета = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет, "Вопрос...", КодВозвратаДиалога.Нет);
	Если РезОтвета <> КодВозвратаДиалога.Да Тогда 
		Возврат;
	КонецЕсли;
	
	//СтрокаДляКонтрольнойЛенты
	СтрокаДляКонтрольнойЛенты = "A6"; //1 байт, Команда для печати контрольной ленты
	
	//Добавим пароль Администратора, 4 байта
	ПарольСисАдмина = 30;
	СтрокаПароляХекс = ФискальникиСервер.ПеревестиЧислоИз10в16(ПарольСисАдмина, 4, Ложь);
	СтрокаПароляХекс = ФискальникиСервер.ПеревернутьСтроку(СтрокаПароляХекс,2);
	СтрокаДляКонтрольнойЛенты = СтрокаДляКонтрольнойЛенты + СтрокаПароляХекс;
	
	//Номер смены, 2 байта
	СтрокаНомерСмены = ФискальникиСервер.ПеревестиЧислоИз10в16(НомерСменыКЛ, 2, Ложь);
	СтрокаНомерСмены = ФискальникиСервер.ПеревернутьСтроку(СтрокаНомерСмены,2);
	СтрокаДляКонтрольнойЛенты = СтрокаДляКонтрольнойЛенты + СтрокаНомерСмены;
	
	//Допишем пробелы, и того 7 байт на команду, без учета пробелов... :)
	СтрокаДляКонтрольнойЛенты = ФискальникиСервер.МеждуДвумяСимволамиПробел(СтрокаДляКонтрольнойЛенты);
	
	//Сообщить(СтрокаДляКонтрольнойЛенты); //Отладка
	
	// Подготовка данных ФР
	ВходныеПараметры  = Новый Массив;
	ВходныеПараметры.Добавить(СтрокаДляКонтрольнойЛенты);
	ВыходныеПараметры = Неопределено;
	
	ВыполнитьКомандуОборудования(ФР,
	                             "DeviceControlHEX",
	                             ВходныеПараметры,
	                             ВыходныеПараметры);
								 
КонецПроцедуры
Показать



5. Примеры команд можно взять по ссылке ftp://ftp.shtrih-m.ru/download/FR/Doc
24. DrZombi 286 30.10.14 13:52 Сейчас в теме
(23) Вот еще вызов...

&НаКлиенте
Процедура ФР_КонтрольнаяЛента(Команда)
	// Вставить содержимое обработчика.
	
	Если НЕ ЕстьПравоНаПечатьКЛ_ФР() Тогда 
		ТекстСообщения = "Нет права доступа для печати ""Контрольной ленты по смене""!";
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
		Возврат;
	КонецЕсли;
	
	ТекстВопроса = "Для печати Контрольной ленты необходимо указать: 
	|номер смены в интервале 0000…2100.
	|
	|Рапечатать Контрольную ленту по смене "+Строка(НомерСменыКЛ)+" ?";
	РезОтвета = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет, "Вопрос...", КодВозвратаДиалога.Нет);
	Если РезОтвета <> КодВозвратаДиалога.Да Тогда 
		Возврат;
	КонецЕсли;
	
	//СтрокаДляКонтрольнойЛенты
	СтрокаДляКонтрольнойЛенты = "A6"; //1 байт, Команда для печати контрольной ленты
	
	//Добавим пароль Администратора, 4 байта
	ПарольСисАдмина = 30;
	СтрокаПароляХекс = ФискальникиСервер.ПеревестиЧислоИз10в16(ПарольСисАдмина, 4, Ложь);
	СтрокаПароляХекс = ФискальникиСервер.ПеревернутьСтроку(СтрокаПароляХекс,2);
	СтрокаДляКонтрольнойЛенты = СтрокаДляКонтрольнойЛенты + СтрокаПароляХекс;
	
	//Номер смены, 2 байта
	СтрокаНомерСмены = ФискальникиСервер.ПеревестиЧислоИз10в16(НомерСменыКЛ, 2, Ложь);
	СтрокаНомерСмены = ФискальникиСервер.ПеревернутьСтроку(СтрокаНомерСмены,2);
	СтрокаДляКонтрольнойЛенты = СтрокаДляКонтрольнойЛенты + СтрокаНомерСмены;
	
	//Допишем пробелы, и того 7 байт на команду, без учета пробелов... :)
	СтрокаДляКонтрольнойЛенты = ФискальникиСервер.МеждуДвумяСимволамиПробел(СтрокаДляКонтрольнойЛенты);
	
	//Сообщить(СтрокаДляКонтрольнойЛенты); //Отладка
	
	// Подготовка данных ФР
	ОбъектСтр = Новый Структура; //("Команда","131E000000")
	ОбъектСтр.Вставить("Команда",СтрокаДляКонтрольнойЛенты);
	ОбъектСтр.Вставить("КассаККМ",Новый Структура("ТипКассы",ПредопределенноеЗначение("Перечисление.ТипыКасс.ФискальныйРегистратор")));
	
	ФР = ПредопределенноеЗначение("Справочник.ПодключаемоеОборудование.ПустаяСсылка");
	
	РезультатПробитияЧека = Неопределено;
	РезПробитияЧека = ФискальникиКлиент.ВыполнитьКоманду(ОбъектСтр, ФР, УникальныйИдентификатор, РезультатПробитияЧека);
	Если РезПробитияЧека <> Неопределено и РезПробитияЧека < 0 Тогда 
		//Была ошибка //Шантарин СВ 08,09,2014 - Обработка Ошибки ФР
		Сообщить("Ошибка вызова команды: "+Строка(РезПробитияЧека));
		
		Если РезультатПробитияЧека <> Неопределено Тогда 
			Для Каждого ЗначСтрукт Из РезультатПробитияЧека Цикл 
				Сообщить(""+ЗначСтрукт.Ключ+": "+Строка(ЗначСтрукт.Значение));
				
				Если ТипЗнч(ЗначСтрукт.Значение) = Тип("Массив") Тогда 
					Для Каждого ЗначМасс Из ЗначСтрукт.Значение Цикл 
						Сообщить(" - "+ЗначСтрукт);
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	Иначе 
		Сообщить("Команда выполнена...");
	КонецЕсли;
								 
КонецПроцедуры
Показать
25. Euroset1 11 02.03.17 04:27 Сейчас в теме
		
       ДатаТранзакции = ВРЕГ(ДатаТранзакции);
	ДатаТранзакцииЧисло = 0;
	для й = 1 по СтрДлина(ДатаТранзакции) цикл
		ДатаТранзакцииЧисло = ДатаТранзакцииЧисло * 16 + Найти("0123456789ABCDEF", Сред(ДатаТранзакции, й, 1)) - 1;
	КонецЦикла;


Проще некуда... перестаньте бездумно возводить в степень!!!
dctvghbdtn; ilyav; GlukAl; +3 Ответить
29. dctvghbdtn 11.07.21 14:03 Сейчас в теме
(25)
Спасибо! Откуда такой алгоритм?
26. vladimir2008 13 02.03.17 11:27 Сейчас в теме
Прикольно тема не поднималась 3 года
27. Euroset1 11 02.03.17 12:07 Сейчас в теме
Но я же не с пустыми руками пришел. Все же поисковик эту тему охотно выдает, поэтому у нее должен быть счастливый конец.
28. vladimir2008 13 02.03.17 15:27 Сейчас в теме
Оставьте свое сообщение