Функция РезультатКодирования(Знач ВходящаяСтрока)
фРезультат = Новый Массив;
Дельта = 0;
ТекущаяПозиция = 0;
СимволовНаВывод = 0;
ТекущийНаибольший = 0;
СкорректированнаяДельта = 0;
Перемещение = 0;
ПредполагаемыйНомерБуквы = 0;
Наибольший = НАЧАЛЬНЫЙ_КОД;
Смещение = НАЧАЛЬНОЕ_СМЕЩЕНИЕ;
ДлинаСтроки = СтрДлина(ВходящаяСтрока);
// Обработка символов ASCII
Для я = 1 По ДлинаСтроки Цикл
ОчереднойСимвол = Сред(ВходящаяСтрока, я, 1);
Если ЭтоСимволASCII(КодСимвола(ОчереднойСимвол)) Тогда
фРезультат.Добавить(ОчереднойСимвол);
СимволовНаВывод = СимволовНаВывод + 1;
КонецЕсли;
КонецЦикла;
ТекущаяПозиция = СимволовНаВывод;
Начало = СимволовНаВывод;
Если Начало > 0 Тогда
фРезультат.Добавить(РАЗДЕЛИТЕЛЬ);
СимволовНаВывод = СимволовНаВывод + 1;
КонецЕсли;
// Кодирование не ASCII символов
Пока ТекущаяПозиция < ДлинаСтроки Цикл
ТекущийНаибольший = НАИБОЛЬШЕЕ_ЧИСЛО;
Для я = 1 По ДлинаСтроки Цикл
Код = КодСимвола(ВходящаяСтрока, я);
Если Код >= Наибольший И Код < ТекущийНаибольший Тогда
ТекущийНаибольший = Код;
КонецЕсли;
КонецЦикла;
Если ТекущийНаибольший - Наибольший > Цел((НАИБОЛЬШЕЕ_ЧИСЛО - Дельта) / (ТекущаяПозиция + 1)) Тогда
ВызватьИсключение "Переполнение";
КонецЕсли;
Дельта = Дельта + (ТекущийНаибольший - Наибольший) * (ТекущаяПозиция + 1);
Наибольший = ТекущийНаибольший;
Для я = 1 По ДлинаСтроки Цикл
Код = КодСимвола(ВходящаяСтрока, я);
Если Код < Наибольший Тогда
Дельта = Дельта + 1;
Если Дельта = 0 Тогда
ВызватьИсключение "Переполнение";
КонецЕсли;
ИначеЕсли Код = Наибольший Тогда
СкорректированнаяДельта = Дельта;
Перемещение = БАЗА;
Пока Истина Цикл
ПредполагаемыйПорядковыйНомер = ?(
Перемещение <= Смещение,
ПЕРВАЯ,
?(Перемещение >= Смещение + ПОСЛЕДНЯЯ, ПОСЛЕДНЯЯ, Перемещение - Смещение)
);
Если СкорректированнаяДельта < ПредполагаемыйПорядковыйНомер Тогда
Прервать;
КонецЕсли;
КодированныйСимвол = ПорядковыйНомерВСимвол(
ПредполагаемыйПорядковыйНомер + (СкорректированнаяДельта - ПредполагаемыйПорядковыйНомер) % (БАЗА - ПредполагаемыйПорядковыйНомер)
);
фРезультат.Добавить(КодированныйСимвол);
СимволовНаВывод = СимволовНаВывод + 1;
СкорректированнаяДельта = Цел((СкорректированнаяДельта - ПредполагаемыйПорядковыйНомер) / (БАЗА - ПредполагаемыйПорядковыйНомер));
Перемещение = Перемещение + БАЗА;
КонецЦикла;
фРезультат.Добавить(ПорядковыйНомерВСимвол(СкорректированнаяДельта));
СимволовНаВывод = СимволовНаВывод + 1;
Смещение = АдаптацияСмещения(Дельта, ТекущаяПозиция + 1, ТекущаяПозиция = Начало);
Дельта = 0;
ТекущаяПозиция = ТекущаяПозиция + 1;
КонецЕсли;
КонецЦикла;
Дельта = Дельта + 1;
Наибольший = Наибольший + 1;
КонецЦикла;
Возврат СтрСоединить(фРезультат);
КонецФункции