Функции доступны на Клиенте и на Сервере. Демо-примеры сделаны на управляемых формах. Тестировалось на платформах серии 8.3.10.
Первоначально стояла задача взаимно-однозначного соответствия (синхронизации ) областей кодов некоторых справочников, номеров документов 1С с идентификаторами таблиц сторонней Базы Данных. Примененный подход показался интересным и получил дальнейшее развитие — это методы работы с Алфавитами, "блочные" коды с расчетом длин блоков, использование Алфавитов-коллекций с кодами символов. Последние могут пригодиться например при передаче Клиент-Сервер "непередаваемых" символов Алфавита.
1. Изменение кода, добавление числа
Это наиболее востребованная операция : к входному числовому или строковому Коду на основе входного Алфавита добавляется Число , полученное преобразуется в выходной Код на основе выходного Алфавита. Реализовано функцией:
Функция Код_Изменить(Код,Алфавит,ДобавитьЧисло,АлфавитИлиТипВых,РазмерВых)
//
//Возвращает Код в виде Числа,Даты или Строки (в зависимости от параметра АлфавитИлиТипВых).
//
//ВХОД
// Код - Число, Дата или строковый входной Код на основе Алфавита;
// Алфавит =(перечислены возможные значения):
// - Строка уникальных символов (не менее двух), на основе которых был создан строковый входной Код; если "" - все Уникоды.
// - СписокЗначений Кодов символов, на основе которых создан входной Код.
// - Массив Кодов символов, на основе которых создан входной Код.
// Не используется, если Код является Числом или Датой.
// ДобавитьЧисло - целое положительное или отрицательное число; иначе 0.
// АлфавитИлиТипВыхода =(перечислены возможные значения):
// - Тип("Число") или любое Число (интерпритируется как Тип("Число"));
// - Тип("Дата") или любая Дата (интерпритируется как Тип("Дата"));
// - Алфавит-строка уникальных символов (не менее двух), на основе которых создается возвращаемый код; если "" - все Уникоды.
// - Алфавит-СписокЗначений Кодов символов, на основе которых создается выходной Код
// - Алфавит-Массив Кодов символов, на основе которых создается выходной Код.
// В других случаях (например, Неопределено) - наследуются входные параметры.
// РазмерВых - Количество символов в выходном коде. Недостающие ("нулевые") символы добавляются слева, в качестве "нулевого"
// символа берется первый символ выходного Алфавита.
// Не используется для "не алфавитных" выходных Кодов.
Если Код является Числом, производиться суммирование с ДобавитьЧисло, на основе АлфавитИлиТипВыхода производиться преобразование в выходной Код. Если добавляемое число равно 0, тогда это просто преобразования Кода из одного Алфавита в другой (например из "десятичного" в "двоичный", из "русского" в "латиницу" и т.п.).
2. Методы Алфавитов
При работе со сторонними БД (да и с 1С), часто неизвестен Алфавит, на основе которого построены коды той или иной таблицы (таблиц). Здесь может помочь следующая функция:
Код_Алфавит(Метод,Алфавит,Строки,ИсключаемыеСимволы,ДопИзменение,ТипВыхода)
//
//Возвращает Алфавит - Строку символов, СписокЗначений кодов символов или Массив кодов символов.
//
//ВХОД
// Метод = "+" или "Сумма" - Добавляем к Алфавиту все отсутствующие в нем символы из строк параметра "Строки" ;
// "-" или "Разность" - Убираем из Алфавита все символы, присутствующие в строках параметра "Строки";
// "=" или "Пересечение" - Получаем Строку из символов, присутствующих и в Алфавите и в строках параметра "Строки"
// "#" или "Неповторение" - Получаем Строку из неповторяющихся символов Алфавита и строк из параметра "Строки" ;
// Алфавит - строка из неповторяющихся (уникальных) символов (отсортированность не обязательна,может быть пустым);
// Строки - строка или массив строк из любых символов;
// ИсключаемыеСимв - строка из символов, которые запрещено использовать в алфавите;
// ДопИзменение = (перечислены возможные значения):-
// - "Возр" - сортировать полученный Алфавит по возрастанию кодов Символов;
// - "Убыв" - сортировать полученный Алфавит по убыванию кодов символов;
// - "Инв" - инвертирование полученного Алфавита (переписать справа- налево)
// - [целое число] - код для ГСЧ ("случайная" перестановка символов полученного Алфавита.
// ТипВыхода - "Строка" или "СписокЗначений" или "Массив" (умолчание - "Строка").
Так, "пролистав" нужную таблицу (или таблицы) и собрав Коды в массив Строки, создаем Алфавит для данной таблицы (таблиц):
Алфавит= Код_Алфавит("+","",Строки,,"Возр").
Можно применять эту функцию и на каждом шаге сканирования :
Алфавит= Код_Алфавит("+",Алфавит,Код);
а затем отсортировать:
Алфавит= Код_Алфавит(,Алфавит,,,"Возр");
3. "Блочные" Коды. Изменение, добавление числа.
В некоторых случаях Код-строка состоит из одинаковых блоков определенной длины (подстрок). Так, например, построены битные строки при 8, 16 или 32 битном кодировании, Хэши и т.п. Для преобразования таких строк предназначена функция:
Код_БлочныйИзменить(Код,Алфавит,ДлинаБлока,ДобавитьЧисло,АлфавитВых,ДлинаБлокаВых,ТипВыхода,Проверять,Ошибка)
//
//Функция возвращает выходной "блочный" Код в зависимости от параметра ТипВыхода:
// - или в виде Строки из соединенных подстрок одинаковой длины (блоков)
// - или в виде Массива подстрок одинаковой длины (блоков)
// - или в виде Списка Значений подстрок одинаковой длины (блоков)
// Работает со строковыми "целыми" (не "дробными") Кодами на основе строковых Алфавитов.
//
//ВХОД
// Код - (входной) - строка символов принадлежащих Алфавиту;
// Алфавит - строка уникальных символов (не менее двух), на основе которых был создан входной Код
// (если пустая строка - подразумеваются все Уникоды).
// ДлинаБлока - количество символов во входном коде, рассматриваемых как единое целое (блок, подстрока).
// ДобавитьЧисло - Добавляемое к Коду целое положительное или отрицательное число (в других случаях - 0).
// АлфавитВых - строка уникальных символов (не менее двух), на основе которых будет создан выходной Код;
// (если пустая строка - подразумеваются все Уникоды).
// ДлинаБлокаВых - количество символов в выходном коде, рассматриваемых как единое целое (блок,подстрока).
// ТипВыхода - "Строка" или "Массив" или "СписокЗначений" с блоками
// Проверять - Если Истина - проверяются (и пересчитываются, если нужно) длины блоков
// входа и выхода (используется функция Код_ РазмерБлоков(...)).
//
// ВЫХОД
// Ошибка - описание ошибки или пустая строка.
4. Проверка и расчет длин блоков
Для расчета возможных длин блоков в блочных Кодах предназначена функция:
Код_РазмерБлоков(РазмерАлфавита,ДлинаБлока,РазмерАлфавитаВых,ДлинаБлокаВых,РасчДлинаБлока,РасчДлинаБлокаВых)
//
//Возвращает пустую строку или, в случае ошибки - строку с описанием ошибки.
//Внимание: в случае ошибки все равно производиться расчет "минимальных" значений длин входного и выходного блоков!
//
//ВХОД
// РазмерАлфавита - размер входного Алфавита;
// ДлинаБлока - количество символов во входном коде, рассматриваемых как единое целое (блок,подстрока)
// РазмерАлфавитаВых - размер выходного Алфавита;
// ДлинаБлокаВых - количество символов в выходном коде, рассматриваемых как единое целое (блок,подстрока)
//
//ВЫХОД
// РасчДлинаБлока - расчитанная длина входного Блока
// РасчДлинаБлокаВых - расчитанная длина выходного Блока
Данная функция используется для проверки-расчета длин блоков в функции Код_БлочныйИзменить(…). Однако она может использоваться и самостоятельно, например для расчета минимальной длины получаемого кода при перекодировке из одного Алфавита в другой функцией Код_Изменить(…). Вот так получаем расчетную длину выходного кода:
РасчетнаяДлинаВыходногоКода=0;
Код_РазмерБлоков(РазмерВходногоАлфавита,ДлинаВходногоКода,РазмерВыходногоАлфавита,,,РасчетнаяДлинаВыходногКода);
Спасибо, взял на заметку.