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