// Разбивает строку (не разрывая слов) на подстроки указанной длинны,
// строки дополняются пробелами, переводы строк удаляются.
// Параметры:
// ТекстСтроки - Строка, которую необходимо разбить на подстроки.
//
// МассивДлинСтрок - Массив длин строк, если в результирующей строке оказалось подстрок больше.
// Чем количество указанных длин, то все "лишние" строки выравниваются по последнему
// значению длинны строки.
// Возвращаемое значение:
// Строка - разбитая на подстроки указанной длинны.
//
Функция РазбитьСтрокуНаПодСтроки(Знач ТекстСтроки, МассивДлинСтрок) Экспорт
ВозвращаемаяСтрока = "";
РазделителиСлов = " .,:;?!%\<>+-*/=_" + Символы.ПС;
ТекстСтроки = СокрЛП(ТекстСтроки);
// Обыграем случай, когда у нас многострочная строка.
Если СтрЧислоСтрок(ТекстСтроки) > 1 Тогда
Для НомерПодстроки = 1 По СтрЧислоСтрок(ТекстСтроки) Цикл
НовыйМассивДлинСтроки = Новый Массив;
Если НомерПодстроки = 1 Тогда
НачальнаяГраница = 0;
Иначе
Если СтрЧислоСтрок(ВозвращаемаяСтрока) > МассивДлинСтрок.ВГраница() Тогда
НачальнаяГраница = МассивДлинСтрок.ВГраница();
Иначе
НачальнаяГраница = СтрЧислоСтрок(ВозвращаемаяСтрока);
КонецЕсли;
КонецЕсли;
Для ИндексСтроки = НачальнаяГраница По МассивДлинСтрок.ВГраница() Цикл
НовыйМассивДлинСтроки.Добавить(МассивДлинСтрок[ИндексСтроки]);
КонецЦикла;
ВозвращаемаяСтрока = ВозвращаемаяСтрока + ?(ПустаяСтрока(ВозвращаемаяСтрока), "", Символы.ПС) + РазбитьСтрокуНаПодСтроки(СтрПолучитьСтроку(ТекстСтроки, НомерПодстроки), НовыйМассивДлинСтроки);
КонецЦикла;
Иначе
ДлинаСтроки = МассивДлинСтрок[0];
// Если длина строки меньше или равна нужной длине - просто вернем ее.
Если СтрДлина(ТекстСтроки) <= ДлинаСтроки Тогда
ВозвращаемаяСтрока = ТекстСтроки;
Иначе
// Заменим все разделители символом _, для удобства анализа.
ТестируемаяСтрока = ТекстСтроки;
Для НомерРазделителя = 1 По СтрДлина(РазделителиСлов) Цикл
РазделительСлов = Сред(РазделителиСлов, НомерРазделителя, 1);
ТестируемаяСтрока = СтрЗаменить(ТестируемаяСтрока, РазделительСлов, "_");
КонецЦикла;
// Найдем первый разделитель
Разрыв = СтрНайти(ТестируемаяСтрока, "_");
ИндексМассиваДлинСтрок = 0;
// Обрабатываем строку пока она не закончится.
Пока СтрДлина(ТекстСтроки) > 0 Цикл
Если ИндексМассиваДлинСтрок <= МассивДлинСтрок.ВГраница() Тогда
ДлинаСтроки = МассивДлинСтрок[ИндексМассиваДлинСтрок];
Иначе
ДлинаСтроки = МассивДлинСтрок[МассивДлинСтрок.ВГраница()];
КонецЕсли;
// Если разрыв больше чем нужная длина
// если разрывов больше нет
// и частный случай, когда есть разрыв - пробел в самом конце строки нужной длины
// или длина оставшейся строки меньше или равна нужной длине.
Если Разрыв >= ДлинаСтроки ИЛИ Разрыв = 0 ИЛИ Сред(ТекстСтроки, ДлинаСтроки + 1, 1) = " " ИЛИ СтрДлина(ТекстСтроки) <= ДлинаСтроки Тогда
ВозвращаемаяСтрока = ВозвращаемаяСтрока + ?(ПустаяСтрока(ВозвращаемаяСтрока), "", Символы.ПС) + СокрЛП(Лев(ТекстСтроки, ДлинаСтроки));
ТекстСтроки = СокрЛП(Сред(ТекстСтроки, ДлинаСтроки + 1));
ТестируемаяСтрока = Сред(ТестируемаяСтрока, ДлинаСтроки + 1);
Если Лев(ТестируемаяСтрока,1) = "_" Тогда
ТестируемаяСтрока = Сред(ТестируемаяСтрока, 2);
КонецЕсли;
ИндексМассиваДлинСтрок = ИндексМассиваДлинСтрок + 1;
Разрыв = СтрНайти(ТестируемаяСтрока, "_");
Иначе
НовыйРазрыв = СтрНайти(Сред(ТестируемаяСтрока, Разрыв + 1), "_");
// Есть еще один разрыв и он вместе с предыдущим меньше или равен длине строки.
Если НовыйРазрыв > 0 И Разрыв + НовыйРазрыв <= ДлинаСтроки Тогда
Разрыв = Разрыв + НовыйРазрыв;
Иначе
// Больше разрывов нет
// или он вместе с предыдущим больше нужной длины.
ВозвращаемаяСтрока = ВозвращаемаяСтрока + ?(ПустаяСтрока(ВозвращаемаяСтрока), "", Символы.ПС) + СокрЛП(Лев(ТекстСтроки, Разрыв));
ТекстСтроки = СокрЛП(Сред(ТекстСтроки, Разрыв + 1));
ТестируемаяСтрока = Сред(ТестируемаяСтрока, Разрыв + 1);
Если Лев(ТестируемаяСтрока,1) = "_" Тогда
ТестируемаяСтрока = Сред(ТестируемаяСтрока, 2);
КонецЕсли;
ИндексМассиваДлинСтрок = ИндексМассиваДлинСтрок + 1;
Разрыв = СтрНайти(ТестируемаяСтрока, "_");
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если СтрЧислоСтрок(ВозвращаемаяСтрока) > 1 Тогда
ВыровненнаяСтрока = "";
Для НомерПодстроки = 1 По СтрЧислоСтрок(ВозвращаемаяСтрока) - 1 Цикл
ВыравниваемаяСтрока = СтрПолучитьСтроку(ВозвращаемаяСтрока, НомерПодстроки);
Если НомерПодстроки - 1 <= МассивДлинСтрок.ВГраница() Тогда
ДлинаСтроки = МассивДлинСтрок[НомерПодстроки - 1];
Иначе
ДлинаСтроки = МассивДлинСтрок[МассивДлинСтрок.ВГраница()];
КонецЕсли;
Для НомерПозицииВСтроке = СтрДлина(ВыравниваемаяСтрока) + 1 По ДлинаСтроки Цикл
ВыравниваемаяСтрока = ВыравниваемаяСтрока + " ";
КонецЦикла;
ВыровненнаяСтрока = ВыровненнаяСтрока + ?(ПустаяСтрока(ВыровненнаяСтрока), "", Символы.ПС) + ВыравниваемаяСтрока;
КонецЦикла;
ВозвращаемаяСтрока = ВыровненнаяСтрока + Символы.ПС + СтрПолучитьСтроку(ВозвращаемаяСтрока, СтрЧислоСтрок(ВозвращаемаяСтрока));
КонецЕсли;
ВозвращаемаяСтрока = СтрЗаменить(ВозвращаемаяСтрока, Символы.ПС, "");
Возврат ВозвращаемаяСтрока;
КонецФункции // РазбитьСтрокуПоСтрочно()
Показать