Сама процедура выглядит так:
Процедура РазбивкаСтроки(СтруктураСтрок, ИсходнаяСтрока)
Если ИсходнаяСтрока = "" Тогда
Для К = 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 способ разбивки, придуманной тоже мной, для случаев когда заранее неизвестно сколько строк может получится. То есть бить строку до бесконечности пока не кончатся символы 🙂 Чуть позже я ее опубликую.
Возьмите на заметку и деление строк с учетом переноса словКрасивый перенос строк по слогам
Ой, да лови плюс, жалко что-ли? Может станет стимулом для продолжения творчества. 🙂
.. публикуйте. но не забывайте что поле для ввода длинной фразы на печатной форме зачастую фиксрованное — а это значит, что лучше не ьить на строки, а обеспечить автоподбор размера шрифта чтобы строка влезала в отведенное ей место.
(1) gubanoff, это эволюция кода, в будущем я все ж доведу до совершенства эту процедуру в том числе и правильный перенос. Пока задача стояла переносить длинные названия специальностей и дисциплин)
V_V_V спасибо я не раз еще что нибудь опубликую:)
(0) Мне кажется, вы изобрели «велосипед». Первой была платформа)
(5) cleaner_it, платформа умеет только переносить в одной ячейке к сожалению:) А если надо разделить строку на 2 и более ячеек? 🙂
Добавьте в публикацию пример работы алгоритма: вот исходные данные, а вот результат работы
В добавок ко всему не вижу в процедуре нигде обращение к области табличного документа.
Каким образом вы узнаете какие параметры указывать?
Запихивать в структуру число как строку совсем не хорошо:
Вот здесь без попытки нельзя обойтись?
Впечатных формах, что я делал используется алгоритм красивого переноса строк по слогам и проверка умещается ли текст в ячейке
(6) ammorf, понял теперь. Не хватает примера работы алгоритма. А вообще — задача узкоспециализированная.
(9) cleaner_it, добавил пример работы алгоритма.
(3) CheBurator, в корне не согласен, в печатной форме шрифт ты можешь для себя поуменьшать. А если ты документ предоставляешь куда то, зоопарк с разнокалиберными шрифтами…
В общем автору публикации плюс за труды. Думаю буду использовать.
Какой ни какой а труд. Вдруг кому-то надо. +