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

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

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

Процедура РазбивкаСтроки(СтруктураСтрок, ИсходнаяСтрока)
Если ИсходнаяСтрока = "" Тогда
Для К = 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 способ разбивки, придуманной тоже мной, для случаев когда заранее неизвестно сколько строк может получится. То есть бить строку до бесконечности пока не кончатся символы 🙂 Чуть позже я ее опубликую.

12 Comments

  1. gubanoff

    Возьмите на заметку и деление строк с учетом переноса слов Красивый перенос строк по слогам

    Reply
  2. V_V_V

    Ой, да лови плюс, жалко что-ли? Может станет стимулом для продолжения творчества. 🙂

    Reply
  3. CheBurator

    .. публикуйте. но не забывайте что поле для ввода длинной фразы на печатной форме зачастую фиксрованное — а это значит, что лучше не ьить на строки, а обеспечить автоподбор размера шрифта чтобы строка влезала в отведенное ей место.

    Reply
  4. ammorf

    (1) gubanoff, это эволюция кода, в будущем я все ж доведу до совершенства эту процедуру в том числе и правильный перенос. Пока задача стояла переносить длинные названия специальностей и дисциплин)

    V_V_V спасибо я не раз еще что нибудь опубликую:)

    Reply
  5. cleaner_it

    (0) Мне кажется, вы изобрели «велосипед». Первой была платформа)

    Reply
  6. ammorf

    (5) cleaner_it, платформа умеет только переносить в одной ячейке к сожалению:) А если надо разделить строку на 2 и более ячеек? 🙂

    Reply
  7. echo77

    Добавьте в публикацию пример работы алгоритма: вот исходные данные, а вот результат работы

    В добавок ко всему не вижу в процедуре нигде обращение к области табличного документа.

    Каким образом вы узнаете какие параметры указывать?

    Запихивать в структуру число как строку совсем не хорошо:

    СтруктураСтроки = Структура Новый Структура;
    СтруктураСтроки.Вставить(«Строка1», «30»);
    СтруктураСтроки.Вставить(«Строка2», «100»);
    СтруктураСтроки.Вставить(«Строка2», «80»);

    Вот здесь без попытки нельзя обойтись?

    Попытка
    ДлинаРазрешения = Число(СтруктураСтрок[СтрТек]);
    Исключение
    Сообщить(«Неверно указанны параметры для разбивки!», СтатусСообщения.Внимание);
    Возврат;
    КонецПопытки;
    Reply
  8. echo77

    В печатных формах, что я делал используется алгоритм красивого переноса строк по слогам и проверка умещается ли текст в ячейке

    Reply
  9. cleaner_it

    (6) ammorf, понял теперь. Не хватает примера работы алгоритма. А вообще — задача узкоспециализированная.

    Reply
  10. ammorf

    (9) cleaner_it, добавил пример работы алгоритма.

    Reply
  11. acuta

    (3) CheBurator, в корне не согласен, в печатной форме шрифт ты можешь для себя поуменьшать. А если ты документ предоставляешь куда то, зоопарк с разнокалиберными шрифтами…

    В общем автору публикации плюс за труды. Думаю буду использовать.

    Reply
  12. Bacemo

    Какой ни какой а труд. Вдруг кому-то надо. +

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *