Работа с кодами — числами, датами, кодами справочников, номерами документов, идентификаторами в 1С и в других базах данных



Поддерживается преобразование Кодов на основе Алфавитов, в том числе »блочных» кодов — состоящих из блоков (подстрок) одинаковой длины (например: 8, 16, 32-битные коды, Хэши и т.п.).
Функции доступны на Клиенте и на Сервере. Демо-примеры сделаны на управляемых формах. Тестировалось на платформах серии 8.3.10.

Первоначально стояла задача взаимно-однозначного соответствия (синхронизации ) областей кодов некоторых справочников, номеров документов 1С с идентификаторами таблиц сторонней Базы Данных. Примененный подход показался  интересным и получил дальнейшее развитие  — это  методы работы с Алфавитами, "блочные"  коды с расчетом  длин блоков,  использование Алфавитов-коллекций с кодами символов. Последние могут пригодиться например  при передаче Клиент-Сервер  "непередаваемых" символов Алфавита.

1. Изменение кода,  добавление числа

Это наиболее востребованная операция : к входному числовому или строковому Коду на основе входного Алфавита добавляется Число , полученное преобразуется в выходной Код на основе выходного Алфавита. Реализовано  функцией:

Функция Код_Изменить(Код,Алфавит,ДобавитьЧисло,АлфавитИлиТипВых,РазмерВых)
//
//Возвращает Код в виде Числа,Даты или Строки (в зависимости от параметра АлфавитИлиТипВых).
//
//ВХОД
//     Код                  -  Число, Дата  или строковый входной Код на основе Алфавита;
//     Алфавит              =(перечислены возможные значения):
//                          - Строка уникальных символов  (не менее двух), на основе которых был создан строковый входной Код; если "" - все Уникоды.
//                          - СписокЗначений Кодов символов, на основе которых создан входной Код.
//                          - Массив Кодов символов, на основе которых создан входной Код.
//                          Не используется, если Код является Числом или Датой.
//      ДобавитьЧисло       - целое положительное или отрицательное число; иначе  0.
//      АлфавитИлиТипВыхода =(перечислены возможные значения):
//                          - Тип("Число") или любое Число (интерпритируется как Тип("Число"));
//                          - Тип("Дата") или любая Дата (интерпритируется как Тип("Дата"));
//                          - Алфавит-строка уникальных символов (не менее двух), на основе которых создается возвращаемый код; если "" - все Уникоды.
//                          - Алфавит-СписокЗначений Кодов символов, на основе которых создается выходной Код
//                          - Алфавит-Массив Кодов символов, на основе которых создается выходной Код.
//                          В других случаях (например, Неопределено) - наследуются входные параметры.
//      РазмерВых           - Количество символов в выходном коде. Недостающие ("нулевые") символы добавляются слева, в качестве "нулевого"
//                            символа берется первый символ выходного Алфавита.
//                            Не используется для  "не алфавитных" выходных Кодов.

Если Код является Числом, производиться суммирование с ДобавитьЧисло, на основе АлфавитИлиТипВыхода  производиться преобразование в  выходной Код. Если добавляемое число равно 0, тогда это просто преобразования Кода из одного Алфавита в другой (например из "десятичного"  в "двоичный", из "русского" в "латиницу"  и т.п.).    

2. Методы Алфавитов

При работе со сторонними БД  (да и с 1С), часто неизвестен Алфавит, на основе которого построены коды той или иной таблицы (таблиц). Здесь может помочь следующая функция:

Код_Алфавит(Метод,Алфавит,Строки,ИсключаемыеСимволы,ДопИзменение,ТипВыхода)
//
//Возвращает Алфавит - Строку символов, СписокЗначений кодов символов или Массив кодов символов.
//
//ВХОД
//   Метод = "+" или "Сумма" - Добавляем к Алфавиту все отсутствующие в нем символы из строк параметра "Строки" ;
//           "-" или "Разность" - Убираем из Алфавита все символы, присутствующие в строках параметра "Строки";
//           "=" или "Пересечение" - Получаем Строку из символов, присутствующих и в Алфавите и в строках параметра "Строки"
//           "#" или "Неповторение" - Получаем Строку из неповторяющихся символов  Алфавита и строк из параметра "Строки" ;
//   Алфавит         - строка из неповторяющихся (уникальных) символов (отсортированность не обязательна,может быть пустым);
//   Строки          - строка или массив строк из любых символов;
//   ИсключаемыеСимв - строка из символов, которые запрещено использовать в алфавите;
//   ДопИзменение    = (перечислены возможные значения):-
//                   - "Возр" - сортировать полученный Алфавит по возрастанию кодов Символов;
//                   - "Убыв" - сортировать полученный Алфавит по убыванию кодов символов;
//                   - "Инв"  - инвертирование полученного Алфавита (переписать справа- налево)
//                   - [целое число] - код для ГСЧ ("случайная" перестановка символов полученного Алфавита.
//    ТипВыхода      - "Строка" или "СписокЗначений" или "Массив" (умолчание - "Строка").



Так, "пролистав"  нужную таблицу  (или таблицы) и собрав Коды в массив Строки, создаем Алфавит для данной таблицы (таблиц):

Алфавит= Код_Алфавит("+","",Строки,,"Возр").

 Можно применять эту функцию и на каждом шаге сканирования :

Алфавит= Код_Алфавит("+",Алфавит,Код); 

 а затем отсортировать:

Алфавит= Код_Алфавит(,Алфавит,,,"Возр");

3. "Блочные" Коды. Изменение, добавление числа.

В некоторых случаях Код-строка состоит  из одинаковых блоков определенной длины (подстрок). Так, например, построены битные строки при 8, 16 или 32 битном кодировании,  Хэши и т.п.   Для преобразования таких строк  предназначена функция:

Код_БлочныйИзменить(Код,Алфавит,ДлинаБлока,ДобавитьЧисло,АлфавитВых,ДлинаБлокаВых,ТипВыхода,Проверять,Ошибка)
//
//Функция возвращает выходной  "блочный"  Код  в зависимости от параметра ТипВыхода:
//  - или в виде Строки из соединенных подстрок  одинаковой длины (блоков)
//  - или в виде Массива подстрок одинаковой длины (блоков)
//  - или в виде Списка Значений подстрок одинаковой длины (блоков)
//  Работает со строковыми  "целыми" (не "дробными") Кодами на основе строковых Алфавитов.
//
//ВХОД
//  Код           - (входной) - строка символов  принадлежащих Алфавиту;
//  Алфавит       - строка уникальных символов  (не менее двух), на основе которых был создан входной Код
//                  (если пустая строка  - подразумеваются все Уникоды).
//  ДлинаБлока    - количество символов во входном  коде, рассматриваемых как единое целое (блок, подстрока).
//  ДобавитьЧисло - Добавляемое к Коду целое положительное или отрицательное число (в других случаях - 0).
//  АлфавитВых    - строка уникальных символов  (не менее двух), на основе которых будет создан выходной Код;
//                  (если пустая строка - подразумеваются все Уникоды).
//  ДлинаБлокаВых - количество символов в выходном коде, рассматриваемых как единое целое (блок,подстрока).
//  ТипВыхода     - "Строка" или "Массив" или "СписокЗначений"  с  блоками
//  Проверять     - Если Истина - проверяются (и пересчитываются, если нужно) длины блоков
//                  входа и выхода  (используется функция Код_ РазмерБлоков(...)).
//
// ВЫХОД
//  Ошибка        - описание ошибки или пустая строка.



4. Проверка и расчет длин блоков

Для расчета  возможных длин блоков  в блочных Кодах предназначена функция:

Код_РазмерБлоков(РазмерАлфавита,ДлинаБлока,РазмерАлфавитаВых,ДлинаБлокаВых,РасчДлинаБлока,РасчДлинаБлокаВых)
//
//Возвращает пустую строку  или, в случае ошибки - строку с описанием ошибки.
//Внимание:  в случае ошибки все равно производиться расчет  "минимальных" значений длин входного и выходного блоков!
//
//ВХОД
//  РазмерАлфавита    - размер входного Алфавита;
//  ДлинаБлока        - количество символов во входном коде, рассматриваемых как единое целое  (блок,подстрока)
//  РазмерАлфавитаВых - размер выходного Алфавита;
//  ДлинаБлокаВых     - количество символов в выходном коде, рассматриваемых как единое целое  (блок,подстрока)
//
//ВЫХОД
//  РасчДлинаБлока    - расчитанная длина входного  Блока
//  РасчДлинаБлокаВых - расчитанная длина выходного Блока

Данная функция используется для проверки-расчета длин блоков в функции  Код_БлочныйИзменить(…). Однако она может использоваться и самостоятельно, например для расчета минимальной длины получаемого кода при перекодировке из одного Алфавита в другой функцией  Код_Изменить(…). Вот так  получаем расчетную длину выходного кода:

РасчетнаяДлинаВыходногоКода=0;
Код_РазмерБлоков(РазмерВходногоАлфавита,ДлинаВходногоКода,РазмерВыходногоАлфавита,,,РасчетнаяДлинаВыходногКода);

 

1 Comment

  1. корум

    Спасибо, взял на заметку.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *