новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
danya1606
Приватное сообщение

Расшифровка текстового файла закодированную в строку из 36-кодированного числа GOAN

6 |  1
16 августа 2021 в 17:02:55 (3 года 14 недель 1 день 13 часов назад)
Текст задания
Добрый день!
Ранее была функция написанная на конфигурации 7.7 ЗИК, такого содержания:

Функция глЧисло36ВСтроку(Стр="") Экспорт
// Возвращает исходную закодированную строку из 36-кодированного числа GOAN
// Используется для поиска исходных значений по штрих-коду
//

// Исходная строка является набором символов "0..9", "A".."Z"
// Создадим непрерывный интервал значений
Делимое = ""; Частное = ""; Результ = "";
Для Сч=1 по СтрДлина(Стр) Цикл
Цифра36 = Сред(Стр,Сч,1);
Если Найти("0123456789",Цифра36)>0 Тогда Ч=Симв(Число(Цифра36)+1); Иначе Ч=Симв((КодСимв(Цифра36))-(КодСимв("A"))+10+1); КонецЕсли;
Делимое = Делимое + Ч;
КонецЦикла;

// Переведем в новую систему счисления
Пока СтрДлина(Делимое) > 0 Цикл
// Разделим число по базе 36 на основание новой системы счисления (255) с остатком
ТекОст = Симв(1);
Пока СтрДлина(Делимое) > 0 Цикл
Цифра = Лев(Делимое,1);
ТекДел = (КодСимв(ТекОст)-1)*36+(КодСимв(Цифра)-1);
Частное = Частное+Симв(Цел(ТекДел/255)+1);
ТекОст = Симв(ТекДел%255+1);
Делимое = Прав(Делимое,СтрДлина(Делимое)-1);
КонецЦикла;
// Остаток - значение цифры для новой системы счисления
Результ = ТекОст + Результ;
// Обрежем у частного лидирующие нули
Пока (СтрДлина(Частное)>0) и (Лев(Частное,1)=Симв(1)) Цикл Частное=Сред(Частное,2); КонецЦикла;
// Частное будем делить дальше для получения нового остатка
Делимое = Частное; Частное="";
КонецЦикла;

// Вернем результирующую строку по базе 255
// Для v8 придется перевести строку из набора символов OEM обратно в Unicode
Возврат Результ;
КонецФункции //глЧисло36ВСтроку

Она расшифровывает текстовый документ напримере файла Табель214_021012-зашифрованный и перезаписывает туда же в виде второго текстового документа Табель214_021012 - с 1С 77.

Переведя на код платформы 1С 8.2 ЗУП такого вида:

Функция глЧисло36ВСтроку(Стр="") Экспорт
// Возвращает исходную закодированную строку из 36-кодированного числа GOAN
// Используется для поиска исходных значений по штрих-коду
//

// Исходная строка является набором символов "0..9", "A".."Z"
// Создадим непрерывный интервал значений
Делимое = ""; Частное = ""; Результ = "";
Для Сч=1 по СтрДлина(Стр) Цикл
Цифра36 = Сред(Стр,Сч,1);
Если Найти("0123456789",Цифра36)>0 Тогда Ч=Символ(Число(Цифра36)+1);
Иначе Ч=Символ((КодСимвола(Цифра36))-(КодСимвола("A"))+10+1);
КонецЕсли;
Делимое = Делимое + Ч;
КонецЦикла;

// Переведем в новую систему счисления
Пока СтрДлина(Делимое) > 0 Цикл
// Разделим число по базе 36 на основание новой системы счисления (255) с остатком
ТекОст = Символ(1);
Пока СтрДлина(Делимое) > 0 Цикл
Цифра = Лев(Делимое,1);
ТекДел = (КодСимвола(ТекОст)-1)*36+(КодСимвола(Цифра)-1);
Частное = Частное+Символ(Цел(ТекДел/255)+1);
ТекОст = Символ(ТекДел%255+1);
Делимое = Прав(Делимое,СтрДлина(Делимое)-1);
КонецЦикла;
// Остаток - значение цифры для новой системы счисления
Результ = ТекОст + Результ;
// Обрежем у частного лидирующие нули
Пока (СтрДлина(Частное)>0) и (Лев(Частное,1)=Символ(1)) Цикл Частное=Сред(Частное,2); КонецЦикла;
// Частное будем делить дальше для получения нового остатка
Делимое = Частное; Частное="";
КонецЦикла;

// Вернем результирующую строку по базе 255
// Для v8 придется перевести строку из набора символов OEM обратно в Unicode
Возврат Результ;
КонецФункции //глЧисло36ВСтроку

А результат получается в виде третьего файла Табель214_021012 - с 1c 82

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

Функция РасшифроватьТабель(ЗашифрованныйФайл)
Попытка
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.Прочитать(ЗашифрованныйФайл);

СпрПодразделения = Справочники.Подразделения;
Если СпрПодразделения.НайтиПоКоду(ТекстовыйФайл.ПолучитьСтроку(1)) = 1 Тогда
СпрПодразделения = "";
ТекстовыйФайл = "";
Возврат 1;
Иначе
//расшифруем файл
Состояние("Идет расшифровка файла табеля...");

Для Сч = 1 По ТекстовыйФайл.КоличествоСтрок() Цикл
ТекстовыйФайл.ЗаменитьСтроку(Сч,глЧисло36ВСтроку(СокрЛП(ТекстовыйФайл.ПолучитьСтроку(Сч))));
КонецЦикла;
ТекстовыйФайл.Записать(ЗашифрованныйФайл);

СпрПодразделения = "";
ТекстовыйФайл = "";
Возврат 1;
КонецЕсли;
Исключение
СпрПодразделения = "";
ТекстовыйФайл = "";
Сообщить("Ошибка при открытии файла табеля","!!!");
Возврат 0;
КонецПопытки;
КонецФункции //РасшифроватьТабель
0
Отклики (4)