Классификатор слов, кодирование текста, уменьшение разрядности, или просто интересный и быстрый алгоритм по переводу строки в число и числа в строку.

23.10.11

Разработка - Механизмы платформы 1С

Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.

Скачать файл

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

Наименование По подписке [?] Купить один файл
Коды слов - see1c.ru
.epf 6,50Kb
33
33 Скачать (1 SM) Купить за 1 850 руб.

 

Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.

Решение: 

Выложим последовательность букв в ряд, например по алфавиту:

Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";

У каждой буквы есть порядковый номер: А = 1, Б = 2, В = 3 …, Ю = 32, Я = 33.

Если после прохождения всех номеров добавлять разрядность и продолжать нумерацию то получим: АА = 34, АБ = 35, АВ = 36 …  ААА = 1123, ААБ = 1124 ,...

Таким образом, буквенный ряд, как и числовой, будет бесконечным.

Из этого следует, что каждому числу соответствует одна комбинация букв нашего буквенного ряда, но при этом разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10.

Это похоже на запись числа в шестнадцатеричном виде, но алгоритм немного другой и разрядов больше :)

Соответственно чем больше знаков  в исходном буквенном ряде, тем меньше знаков потребуется для кодирования числа.  Например, если составить ряд из букв верхнего и нижнего регистра русского и латинского алфавитов + цифры от 1 до 9 (ноль не используется) то длина его будет 127 символов.

 

Использем этот ряд для преобразование числа 999 999 999 999 в строку, получим значение 48AшяC 

т.е. 12-ти значное число можем "свернуть" в 6-ти символьную строку.

 

Механизм по обратному преобразованию можно использовать не только для определения первоначального числа.

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

так слово КЛАССИФИКАТОР   будет иметь номер 20674162138069284621

   а слово АЛГОРИТМ                                    номер 59583701312

 

Кроме того, добавив в буквенный ряд заглавные буквы, знаки препинания и пробел, можно получать номера целых предложений например:

Без труда не выловишь и рыбку из пруда.   =   19470269484383031306224885067323003470882054702807657091899034219691830


Теперь по реализации преобразования:

Немного математики и получаем механизмы перевода значения числа в строку и обратно используя собственный буквенный ряд.

 

 &НаКлиенте
Процедура Выполнить2(Команда)

//Из числа в строку
    
Алфавит2 = Объект.Алфавит2;
    
КолСимволов = СтрДлина(Алфавит2);

    
Сл = "";
    
Ч = Число(?(ЗначениеЗаполнено(СокрЛП(Объект.Строка2)),СокрЛП(Объект.Строка2),0));
     Пока
Ч > КолСимволов Цикл

        
цел = Цел(Ч/КолСимволов);
        
дроб = (Ч/КолСимволов)-цел;

         Если
дроб = 0 Тогда
            
НомерБуквы = КолСимволов;
            
Ч = цел-1;
         Иначе
            
НомерБуквы = дроб*КолСимволов;
            
Ч = цел;
         КонецЕсли;

        
Сл = Сред(Алфавит2,    Окр(НомерБуквы),1) + Сл;

     КонецЦикла;

     Если
Ч > 0 Тогда
       
Сл = Сред(Алфавит2,Ч,1)+Сл;
     КонецЕсли;

    
Сообщение = Новый СообщениеПользователю;
    
Сообщение.Текст =Строка(Сл);
    
Сообщение.Сообщить();

// Из строки в число
    
Ч = 0;
    
ДлСтроки = СтрДлина(СокрЛП(Объект.Строка));
     Для
А = 1 По ДлСтроки Цикл Ч = Ч+Pow(КолСимволов,ДлСтроки-А)*Найти(Алфавит2,Сред(СокрЛП(Объект.Строка),А,1)) КонецЦикла;

    
Сообщение = Новый СообщениеПользователю;
    
Сообщение.Текст =Строка(Ч);
    
Сообщение.Сообщить();

 КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Объект.Алфавит2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя";
КонецПроцедуры


Способы применения:

 

 - Использование максимального диапазона допустимых символов внутри установленной длинны кода.

 - Визуальное кодирование и декодирование текста.

 - Получение уникального идентификатора приемлемой длинны по нескольким элементам имеющим числовой код.

 - Изменяя строку Алфавит2 (набор и последовательность символов), можно установить уникальную кодировку.

 - Поместить строку в реквизит числового типа

 - Генерировать строковые пароли

 - Использовать как классификатор всех слов

 - ...

Также можно подумать на счет хранения закодированного пароля в обычном реквизите типа число, при этом ключ надежно прятать :) может быть актульно для 7.7 

 

Примеры преобразований:

_____________________________________________________________

число 22123476457584895786769029890898078978678123452153427867862146576367721919322327877721010111775763535555548388

строка рrюгщRPtpzWfнrYТHp1TЬйlЕldVdЙЛэCВщПzqJXлГэНZpmВeJяЧd

_______________________________________________________

строка ЕслиМеханизмИнтересенНажмитеПлюс

число 11214047979048599474046065949637649393355959347429435025149026973969

число 781060657266302177787942157125453912674901582490 (только русский алфавит нижний регистр, 33 знака)

______________________________________________________________


 

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7453    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5946    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    17673    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11225    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23762    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18832    human_new    27    

80

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

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

28.08.2023    14734    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. anig99 2852 20.10.11 09:18 Сейчас в теме
Обозвать нужно по-другому. Длинное название слишком и непонятно из него для чего оно.
Я в свое время (не для 1с) раскладывал число в двоичную систему исчисления (по формуле), разбивал это число на группы по 7 или 8 знаков, обратно переводил их в десятичную и получал соответствующий знак из таблицы ASCII.
2. orsprog 20.10.11 09:20 Сейчас в теме
(1) anig99,
спасибо за подсказку, то же такой вопрос возник, пригодилось
6. see1c.ru 50 20.10.11 10:17 Сейчас в теме
(1) интересно какой вариант компактнее свернет :)
3. marku 63 20.10.11 09:43 Сейчас в теме
Хорошая идея, может пригодится
4. Angeros 20.10.11 10:10 Сейчас в теме
Механизм подобен переводу между разными системами счисления. скажем 10->16.
У себя подобное делал когда надо было уид 36симв сжать до 20ти.
Применил подобный механизм перевода из 16тиричной в 96тиричную систему и обратно в 16тиричную.
5. see1c.ru 50 20.10.11 10:15 Сейчас в теме
(4) да , только разрядность можно любую установить.
7. director04 3659 20.10.11 13:44 Сейчас в теме
Весьма забавный механизм. Что-то типа "забавной математики". Положу в копилку...
8. Арчибальд 2709 20.10.11 14:37 Сейчас в теме
разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10
Минус пока не поставлю. Но вообще-то, то в школе проходят.
И на ИС публиковалось: http://infostart.ru/public/70211/
Понятно, конечно, что для восьмерочника это открытие...
Светлый ум; Valerich; +2 1 Ответить
9. see1c.ru 50 20.10.11 14:46 Сейчас в теме
(8) Разве та обработка тоже самое делает или по такому же алгоритму? Причем тут школьники , ну в общем то все не угодишь, если считаете нужным ставьте минус.
10. anig99 2852 20.10.11 15:07 Сейчас в теме
(9) там как раз до 36значной системы...
12. see1c.ru 50 20.10.11 15:16 Сейчас в теме
(10) почему как раз ? :) теоретически можете все доступные символы использовать, в примере их 127, но можете добавить, главное не использовать 0
11. Арчибальд 2709 20.10.11 15:13 Сейчас в теме
(9) Плюс за адекват. Так редко встречается...
13. DoctorRoza 20.10.11 17:07 Сейчас в теме
Люблю подобные задачи .. хорошая тренировка для мозга, так что + однозначно! )))
14. dimanich70 870 20.10.11 21:16 Сейчас в теме
Не знаю кто и зачем минусовать хочет, типо он в школе это изучал. У нас в школе этого не было.

Считаю, очень интересное решение. Плюсую однозначно.
15. igor_gk 49 21.10.11 14:01 Сейчас в теме
16. sound 536 21.10.11 16:45 Сейчас в теме
Нормальная тема, плюсую. А еще если чуть-чуть развить идею и сильно постараться, то можно будет на основании этого потом написать упаковыватель баз и складывать бекапы тупо на дискеты. Часть кода я уже придумал, это встроенная функция "Вопрос" с примерно таким текстом "Отправить базу УПП на диск 3,5А?" :)
17. see1c.ru 50 21.10.11 16:59 Сейчас в теме
(16) была мысль на счет архиватора, но врятли удастся запаковать сильнее обычного zip. Еще мысль сделать архиватор примерного текста, сжать так, чтобы при распаковке смысл был понятен, а слова не обязательно в точности соответствовали исходным, например сохранялись только согласные. Может и не особо полезная вещь, но интересно попробовать :)
19. CheBurator 2712 23.10.11 03:55 Сейчас в теме
(17)
94НН03 С006Щ3НN3 П0К4ЗЫ8437, К4КN3 У9N8N73ЛЬНЫ3 83ЩN М0Ж37 93Л47Ь Н4Ш Р4ЗУМ! 8П3Ч47ЛЯЮЩN3 83ЩN! СН4Ч4Л4 Э70 6ЫЛ0 7РУ9Н0, Н0 С3ЙЧ4С Н4 Э70Й С7Р0К3 84Ш Р4ЗУМ ЧN7437 Э70 4870М47NЧ3СКN, Н3 З49УМЫ84ЯСЬ 06 Э70М. Г0Р9NСЬ. ЛNШЬ 0ПР393Л3ННЫ3 ЛЮ9N М0ГУ7 ПР0ЧN747Ь Э70.
lefthander; Leja; +2 Ответить
18. marsohod 123 22.10.11 07:44 Сейчас в теме
Начинаю завидовать китайцам и японцам... и корейцам... и... ну вы поняли :)
20. echo77 1906 23.10.11 16:42 Сейчас в теме
А можно сделать обратное преобразование? По данным документа сформировать мнемоническую строку, однозначно описывающую содержимое документа, типа хэша
21. see1c.ru 50 23.10.11 17:06 Сейчас в теме
(20) я не знаю насколько позволит разрядность в 1С, какой длинны максимальное число... можно попробовать все данные документа поместить в число , но оно будет очень большим, есть ли в этом смысл...

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

в моем примере число содержит именно данные первоначальные и их можно обратно из числа получать. Вообще это просто номер комбинации символов полученных перебором. Только перебор не выполняется а по формуле рассчитывается.
22. DrAku1a 1745 24.10.11 08:16 Сейчас в теме
Прикольно. По-сути это действительно перевод между системами счисления, но реализация весьма оригинальна. Можно по-аналогии сделать Base-64 кодирование и много чего еще...
23. dkprim 5 26.10.11 12:34 Сейчас в теме
вспомнились будни из универа. интересная и адекватная публикация, автору спасибо :)
24. Valerich 1636 27.10.11 07:00 Сейчас в теме
обычный перевод из одной системы счисления в другую...

Предлагаю поиграться с ЗиК (7.7): создайте новую базу, внесите одно начисление одному сотруднику и посмотрите уникальный код первой записи в таблице журнала расчетов. А потом скажите, почему там стоит именно такой код (если 1с ничего не поменяла, в методах кодирования записей, то там будет что-то вроде "zik7jz").
Это мне пришлось разбираться с проблемой несколько лет назад, когда у нас встала колом база ЗиК.... - ни добавить начисление, ни выгрузить загрузить данные...
25. ivn75 2 27.10.11 09:56 Сейчас в теме
А смысл было реализовывать это на 1с? Если архиваторы действительно лучше справляются, да и для шифровки/дешифровки нет смысла использовать. Единственно решение ради решения?
26. see1c.ru 50 27.10.11 10:20 Сейчас в теме
(25) Лично мне понадобилось при создании обмена между базами, в которых нельзя было изменять конфигурации.
27. пользователь 27.11.12 12:50
Сообщение было скрыто модератором.
...
28. Светлый ум 415 20.10.16 09:50 Сейчас в теме
не очень читабельный код
Оставьте свое сообщение