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

24.10.14

Разработка - Универсальные функции

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

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

Процедура РазбивкаСтроки(СтруктураСтрок, ИсходнаяСтрока)
	Если ИсходнаяСтрока = "" Тогда 
		Для К = 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С8 Разработка

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2671    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4612    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8831    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2077    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16148    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. gubanoff 63 24.10.14 14:51 Сейчас в теме
Возьмите на заметку и деление строк с учетом переноса слов Красивый перенос строк по слогам
echo77; BigB; +2 Ответить
4. ammorf 25 25.10.14 08:34 Сейчас в теме
(1) gubanoff, это эволюция кода, в будущем я все ж доведу до совершенства эту процедуру в том числе и правильный перенос. Пока задача стояла переносить длинные названия специальностей и дисциплин)
V_V_V спасибо я не раз еще что нибудь опубликую:)
2. V_V_V 24.10.14 19:20 Сейчас в теме
Ой, да лови плюс, жалко что-ли? Может станет стимулом для продолжения творчества. :)
3. CheBurator 3119 25.10.14 03:51 Сейчас в теме
.. публикуйте. но не забывайте что поле для ввода длинной фразы на печатной форме зачастую фиксрованное - а это значит, что лучше не ьить на строки, а обеспечить автоподбор размера шрифта чтобы строка влезала в отведенное ей место.
E_BEREZIN; cleaner_it; +2 Ответить
11. acuta 01.11.14 13:39 Сейчас в теме
(3) CheBurator, в корне не согласен, в печатной форме шрифт ты можешь для себя поуменьшать. А если ты документ предоставляешь куда то, зоопарк с разнокалиберными шрифтами...
В общем автору публикации плюс за труды. Думаю буду использовать.
5. cleaner_it 220 25.10.14 18:28 Сейчас в теме
(0) Мне кажется, вы изобрели "велосипед". Первой была платформа)
Прикрепленные файлы:
6. ammorf 25 26.10.14 08:47 Сейчас в теме
(5) cleaner_it, платформа умеет только переносить в одной ячейке к сожалению:) А если надо разделить строку на 2 и более ячеек? :)
9. cleaner_it 220 30.10.14 17:50 Сейчас в теме
(6) ammorf, понял теперь. Не хватает примера работы алгоритма. А вообще - задача узкоспециализированная.
10. ammorf 25 31.10.14 10:37 Сейчас в теме
(9) cleaner_it, добавил пример работы алгоритма.
7. echo77 1868 29.10.14 10:31 Сейчас в теме
Добавьте в публикацию пример работы алгоритма: вот исходные данные, а вот результат работы
В добавок ко всему не вижу в процедуре нигде обращение к области табличного документа.
Каким образом вы узнаете какие параметры указывать?
Запихивать в структуру число как строку совсем не хорошо:
СтруктураСтроки = Структура Новый Структура;
СтруктураСтроки.Вставить("Строка1", "30");
СтруктураСтроки.Вставить("Строка2", "100");
СтруктураСтроки.Вставить("Строка2", "80");


Вот здесь без попытки нельзя обойтись?
Попытка 
      ДлинаРазрешения = Число(СтруктураСтрок[СтрТек]);
Исключение
      Сообщить("Неверно указанны параметры для разбивки!", СтатусСообщения.Внимание);
      Возврат;
КонецПопытки;
8. echo77 1868 29.10.14 10:35 Сейчас в теме
В печатных формах, что я делал используется алгоритм красивого переноса строк по слогам и проверка умещается ли текст в ячейке
12. Bacemo 03.11.14 21:04 Сейчас в теме
Какой ни какой а труд. Вдруг кому-то надо. +
Оставьте свое сообщение