gifts2017

Алгоритм разбивки длинных фраз и предложений на строчки

Опубликовал Алексей Котов (ammorf) в раздел Программирование - Универсальные функции

Разработал для ВУЗа, где я работаю, алгоритм разбивки длинных названий специальностей и прочих строковых вещей, для вывода в печатные формы заявлений, личных карточек, дипломов и прочего. Возможно, я не первый, но все ж - мой вариант. Может, кому и пригодится. Прошу прощения, если что не так. Это моя самая первая публикация:)

Сама процедура выглядит так:

Процедура РазбивкаСтроки(СтруктураСтрок, ИсходнаяСтрока)
	Если ИсходнаяСтрока = "" Тогда 
		Для К = 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) 24.10.14 14:51
Возьмите на заметку и деление строк с учетом переноса слов Красивый перенос строк по слогам
echo77; BigB; +2 Ответить 1
2. VVV (V_V_V) 24.10.14 19:20
Ой, да лови плюс, жалко что-ли? Может станет стимулом для продолжения творчества. :)
3. Сергей (Che) Коцюра (CheBurator) 25.10.14 03:51
.. публикуйте. но не забывайте что поле для ввода длинной фразы на печатной форме зачастую фиксрованное - а это значит, что лучше не ьить на строки, а обеспечить автоподбор размера шрифта чтобы строка влезала в отведенное ей место.
acapulco; cleaner_it; +2 Ответить 1
4. Алексей Котов (ammorf) 25.10.14 08:34
(1) gubanoff, это эволюция кода, в будущем я все ж доведу до совершенства эту процедуру в том числе и правильный перенос. Пока задача стояла переносить длинные названия специальностей и дисциплин)
V_V_V спасибо я не раз еще что нибудь опубликую:)
5. Роман Осадченко (cleaner_it) 25.10.14 18:28
(0) Мне кажется, вы изобрели "велосипед". Первой была платформа)
Прикрепленные файлы:
6. Алексей Котов (ammorf) 26.10.14 08:47
(5) cleaner_it, платформа умеет только переносить в одной ячейке к сожалению:) А если надо разделить строку на 2 и более ячеек? :)
7. Александр Крынецкий (echo77) 29.10.14 10:31
Добавьте в публикацию пример работы алгоритма: вот исходные данные, а вот результат работы
В добавок ко всему не вижу в процедуре нигде обращение к области табличного документа.
Каким образом вы узнаете какие параметры указывать?
Запихивать в структуру число как строку совсем не хорошо:
СтруктураСтроки = Структура Новый Структура;
СтруктураСтроки.Вставить("Строка1", "30");
СтруктураСтроки.Вставить("Строка2", "100");
СтруктураСтроки.Вставить("Строка2", "80");
...Показать Скрыть


Вот здесь без попытки нельзя обойтись?
Попытка 
      ДлинаРазрешения = Число(СтруктураСтрок[СтрТек]);
Исключение
      Сообщить("Неверно указанны параметры для разбивки!", СтатусСообщения.Внимание);
      Возврат;
КонецПопытки;
...Показать Скрыть
8. Александр Крынецкий (echo77) 29.10.14 10:35
В печатных формах, что я делал используется алгоритм красивого переноса строк по слогам и проверка умещается ли текст в ячейке
9. Роман Осадченко (cleaner_it) 30.10.14 17:50
(6) ammorf, понял теперь. Не хватает примера работы алгоритма. А вообще - задача узкоспециализированная.
10. Алексей Котов (ammorf) 31.10.14 10:37
(9) cleaner_it, добавил пример работы алгоритма.
11. Владимир Ацута (acuta) 01.11.14 13:39
(3) CheBurator, в корне не согласен, в печатной форме шрифт ты можешь для себя поуменьшать. А если ты документ предоставляешь куда то, зоопарк с разнокалиберными шрифтами...
В общем автору публикации плюс за труды. Думаю буду использовать.
12. Сергей Валутин (Bacemo) 03.11.14 21:04
Какой ни какой а труд. Вдруг кому-то надо. +
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа