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