Функция "Разложить строку в массив подстрок определенной длины"

18.04.23

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

Почему-то чаще принято "раскладывать" строку в массив подстрок по определенному символу-разделителю, а мы хотим по длине ))

Скачать исходный код

Наименование Файл Версия Размер
Функция "Разложить строку в массив подстрок определенной длины":
.epf 6,79Kb
0
.epf 6,79Kb Скачать

Создадим и отдадим хорошим людям функцию, которая из строки сформирует массив подстрок определенной длины.

Тестировалось на платформе 1С:Предприятие 8.3 (8.3.12.1616)

Функция РазложитьСтрокуВМассивПодстрокУказаннойДлины(СтрокаДляРазделения, ДлинаСтрок)
	
	МассивПодстрок = Новый Массив;
	
	ПозицияКурсора = ДлинаСтрок;
	
	СтрокаДляВставкиВМассив = Лев(СтрокаДляРазделения, ПозицияКурсора);
	
	Пока СтрокаДляВставкиВМассив <> "" Цикл
		
		МассивПодстрок.Добавить(СтрокаДляВставкиВМассив);
		
		СтрокаДляВставкиВМассив = Сред(СтрокаДляРазделения, ПозицияКурсора + 1, ДлинаСтрок);
		
		ПозицияКурсора = ПозицияКурсора + ДлинаСтрок;
		
	КонецЦикла;	
	
	Возврат МассивПодстрок;
	
КонецФункции	

 

Разложить строку в массив подстрок определенной длины

См. также

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

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

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

1 стартмани

18.03.2024    2944    2    John_d    11    

56

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

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

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

12.02.2024    5262    atdonya    22    

52

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

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

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

30.11.2023    4162    ke.92@mail.ru    16    

62

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

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

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

28.08.2023    9598    YA_418728146    6    

143

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

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

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

2 стартмани

22.08.2023    2300    28    progmaster    8    

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    16442    144    sapervodichka    112    

130

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

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

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

18.07.2022    7394    quazare    8    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RocKeR_13 1325 18.04.23 10:49 Сейчас в теме
Функция РазложитьСтрокуВМассивПодстрокУказаннойДлины(СтрокаДляРазделения, ДлинаСтрок)

	Результат = Новый Массив;

	Для К = 1 По Окр(СтрДлина(СтрокаДляРазделения)/ДлинаСтрок+0.5, 0, 0) Цикл
		Результат.Добавить(Сред(СтрокаДляРазделения, ДлинаСтрок*(К-1)+1, ДлинаСтрок));
	КонецЦикла;

	Возврат Результат

КонецФункции
Показать


Вопрос: а зачем?)
2. alexkozin 45 18.04.23 11:27 Сейчас в теме
(1) Да хотя бы вот зачем:
Есть касса ККМ, которая умеет выводить в одну нефискальную строку чека только 32 символа.
Я хочу выводить в клише фразы переменной длины более 32 символов.
Ввиду оного фразу надо делить на массив "подфраз" по 32 символа и выводить их друг за другом:

<Positions>
<TextString Text="________________________________"/>
<TextString Text=" ***** ! РАСПРОДАЖА ! ***** "/>
<TextString Text="Арт.9027633O, Золотой шар со звё"/>
<TextString Text="здами, посыпанный блестящей пудр"/>
<TextString Text="ой. Цена - 97 руб."/>
<TextString Text="________________________________"/>

............
</Positions>
5. RocKeR_13 1325 18.04.23 11:50 Сейчас в теме
(2) МенеджерОборудованияКлиентСервер:

// Выстраивает строку по длине поля, если поле длинное - переносит на следующую строку.
//
Функция ПостроитьПолеПереносом(Знач Текст, Знач ДлинаПоля, ДобСимвол = "", ПоЦентру = Ложь) Экспорт
6. alexkozin 45 18.04.23 11:57 Сейчас в теме
(5)
строитьПолеПереносом(

Благодарю, но я не хочу строку с переносами, мне массив подстрок нужен.
7. RocKeR_13 1325 18.04.23 11:59 Сейчас в теме
(6) Ну это как бы функция из БПО специально для построения строк при работе с ККТ) Всегда ее использовал для печати нефискальных чеков - никаких проблем не было
8. alexkozin 45 18.04.23 12:02 Сейчас в теме
(7)про фискальные соглашусь категорически, там всё норм.
А вот в нефискальных строках почему-то "Символы.ПС" и ¶ мой ФР не воспринимает.
3. RustIG 1619 18.04.23 11:43 Сейчас в теме
Именно массив нужен? Можно ведь перенос строки вставить в конце каждой подстроки определенной длины.
4. alexkozin 45 18.04.23 11:47 Сейчас в теме
(3)перенос не подходит, пробовал, касса его просто не воспринимает, режет строку подобно Лев(...., 32)
Прикрепленные файлы:
9. dima_home 239 18.04.23 16:11 Сейчас в теме
Или так

МассивСтрокФиксШириной = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПостроитьПолеПереносом(Текст, ШиринаСтроки),Символы.ПС,"|"),"|"); 
10. ixijixi 1801 19.04.23 09:52 Сейчас в теме
Код из ЗУПа
// Разбивает строку (не разрывая слов) на подстроки указанной длинны, 
//							строки дополняются пробелами, переводы строк удаляются.
// Параметры:
//  ТекстСтроки  - Строка, которую необходимо разбить на подстроки.
//                 
//  МассивДлинСтрок  - Массив длин строк, если в результирующей строке оказалось подстрок больше.
//                     Чем количество указанных длин, то все "лишние" строки выравниваются по последнему
//                     значению длинны строки.
// Возвращаемое значение:
//   Строка   - разбитая на подстроки указанной длинны.
//
Функция РазбитьСтрокуНаПодСтроки(Знач ТекстСтроки, МассивДлинСтрок) Экспорт

	ВозвращаемаяСтрока = "";
	
	РазделителиСлов = " .,:;?!%\<>+-*/=_" + Символы.ПС;
	
	ТекстСтроки = СокрЛП(ТекстСтроки);
	
	// Обыграем случай, когда у нас многострочная строка.
	Если СтрЧислоСтрок(ТекстСтроки) > 1 Тогда
	
		Для НомерПодстроки = 1 По СтрЧислоСтрок(ТекстСтроки) Цикл
			
			НовыйМассивДлинСтроки = Новый Массив;
			
			Если НомерПодстроки = 1 Тогда
			
				НачальнаяГраница = 0;
			
			Иначе
				
				Если СтрЧислоСтрок(ВозвращаемаяСтрока) > МассивДлинСтрок.ВГраница() Тогда
				
					НачальнаяГраница = МассивДлинСтрок.ВГраница();
					
				Иначе
					
					НачальнаяГраница = СтрЧислоСтрок(ВозвращаемаяСтрока);
				
				КонецЕсли; 
			
			КонецЕсли; 
			
			Для ИндексСтроки = НачальнаяГраница По МассивДлинСтрок.ВГраница() Цикл
			
				НовыйМассивДлинСтроки.Добавить(МассивДлинСтрок[ИндексСтроки]);
			
			КонецЦикла; 
		
			ВозвращаемаяСтрока = ВозвращаемаяСтрока + ?(ПустаяСтрока(ВозвращаемаяСтрока), "", Символы.ПС) + РазбитьСтрокуНаПодСтроки(СтрПолучитьСтроку(ТекстСтроки, НомерПодстроки), НовыйМассивДлинСтроки);
		
		КонецЦикла; 
		
	Иначе
		
		ДлинаСтроки = МассивДлинСтрок[0];
		
		// Если длина строки меньше или равна нужной длине - просто вернем ее.
		Если СтрДлина(ТекстСтроки) <= ДлинаСтроки Тогда
		
			ВозвращаемаяСтрока = ТекстСтроки; 
			
		Иначе
			
			// Заменим все разделители символом _, для удобства анализа.
			ТестируемаяСтрока = ТекстСтроки;
			
			Для НомерРазделителя = 1 По СтрДлина(РазделителиСлов)  Цикл
				
				РазделительСлов = Сред(РазделителиСлов, НомерРазделителя, 1);
				
				ТестируемаяСтрока = СтрЗаменить(ТестируемаяСтрока, РазделительСлов, "_");
			
			КонецЦикла; 
			
			// Найдем первый разделитель
			Разрыв = СтрНайти(ТестируемаяСтрока, "_");
			
			ИндексМассиваДлинСтрок = 0;
			
			// Обрабатываем строку пока она не закончится.
			Пока СтрДлина(ТекстСтроки) > 0 Цикл
				
				Если ИндексМассиваДлинСтрок <= МассивДлинСтрок.ВГраница() Тогда
				
					ДлинаСтроки = МассивДлинСтрок[ИндексМассиваДлинСтрок];
				
				Иначе
				
					ДлинаСтроки = МассивДлинСтрок[МассивДлинСтрок.ВГраница()];
				
				КонецЕсли; 
				
				// Если разрыв больше чем нужная длина
				// если разрывов больше нет
				// и частный случай, когда есть разрыв - пробел в самом конце строки нужной длины
				// или длина оставшейся строки меньше или равна нужной длине.
				Если Разрыв >= ДлинаСтроки ИЛИ Разрыв = 0 ИЛИ Сред(ТекстСтроки, ДлинаСтроки + 1, 1) = " " ИЛИ СтрДлина(ТекстСтроки) <= ДлинаСтроки Тогда
				
					ВозвращаемаяСтрока = ВозвращаемаяСтрока + ?(ПустаяСтрока(ВозвращаемаяСтрока), "", Символы.ПС) + СокрЛП(Лев(ТекстСтроки, ДлинаСтроки));
					
					ТекстСтроки = СокрЛП(Сред(ТекстСтроки, ДлинаСтроки + 1));
					
					ТестируемаяСтрока = Сред(ТестируемаяСтрока, ДлинаСтроки + 1);
					
					Если Лев(ТестируемаяСтрока,1) = "_" Тогда
					
						ТестируемаяСтрока = Сред(ТестируемаяСтрока, 2);
					
					КонецЕсли; 
					
					ИндексМассиваДлинСтрок = ИндексМассиваДлинСтрок + 1;
					
					Разрыв = СтрНайти(ТестируемаяСтрока, "_");
				
				Иначе 
					
					НовыйРазрыв = СтрНайти(Сред(ТестируемаяСтрока, Разрыв + 1), "_");
					
					// Есть еще один разрыв и он вместе с предыдущим меньше или равен длине строки.
					Если НовыйРазрыв > 0 И Разрыв + НовыйРазрыв <= ДлинаСтроки Тогда
						
						Разрыв = Разрыв + НовыйРазрыв;
						
					Иначе
						
						// Больше разрывов нет
						// или он вместе с предыдущим больше нужной длины.
						ВозвращаемаяСтрока = ВозвращаемаяСтрока + ?(ПустаяСтрока(ВозвращаемаяСтрока), "", Символы.ПС) + СокрЛП(Лев(ТекстСтроки, Разрыв));
						
						ТекстСтроки = СокрЛП(Сред(ТекстСтроки, Разрыв + 1));
						
						ТестируемаяСтрока = Сред(ТестируемаяСтрока, Разрыв + 1);
						
						Если Лев(ТестируемаяСтрока,1) = "_" Тогда
					
							ТестируемаяСтрока = Сред(ТестируемаяСтрока, 2);
					
						КонецЕсли; 
					
						ИндексМассиваДлинСтрок = ИндексМассиваДлинСтрок + 1;
					
						Разрыв = СтрНайти(ТестируемаяСтрока, "_");
						
					КонецЕсли;
				
				КонецЕсли;
				
			КонецЦикла; 
				
		КонецЕсли; 
	
	КонецЕсли;
	
	Если СтрЧислоСтрок(ВозвращаемаяСтрока) > 1 Тогда
		
		ВыровненнаяСтрока = "";
		
		Для НомерПодстроки = 1 По СтрЧислоСтрок(ВозвращаемаяСтрока) - 1 Цикл
			
			ВыравниваемаяСтрока = СтрПолучитьСтроку(ВозвращаемаяСтрока, НомерПодстроки);
			
			Если НомерПодстроки - 1 <= МассивДлинСтрок.ВГраница() Тогда
				
				ДлинаСтроки = МассивДлинСтрок[НомерПодстроки - 1];
				
			Иначе
				
				ДлинаСтроки = МассивДлинСтрок[МассивДлинСтрок.ВГраница()];
				
			КонецЕсли; 
				
			Для НомерПозицииВСтроке = СтрДлина(ВыравниваемаяСтрока) + 1 По ДлинаСтроки Цикл
			
				ВыравниваемаяСтрока = ВыравниваемаяСтрока + " ";
			
			КонецЦикла; 
			
			ВыровненнаяСтрока = ВыровненнаяСтрока + ?(ПустаяСтрока(ВыровненнаяСтрока), "", Символы.ПС) + ВыравниваемаяСтрока;
		
		КонецЦикла;
		
		ВозвращаемаяСтрока = ВыровненнаяСтрока + Символы.ПС + СтрПолучитьСтроку(ВозвращаемаяСтрока, СтрЧислоСтрок(ВозвращаемаяСтрока));
		
	КонецЕсли; 
	
	ВозвращаемаяСтрока = СтрЗаменить(ВозвращаемаяСтрока, Символы.ПС, "");
	
	Возврат ВозвращаемаяСтрока;

КонецФункции // РазбитьСтрокуПоСтрочно()

Показать
11. alexkozin 45 19.04.23 12:23 Сейчас в теме
Как же я рад, что тема вызвала деятельное обсуждение с приведением массы прекрасных примеров.
Теперь жизнь "гуглящего" 1с-программиста станет чуточку проще))
Всем спасибо, коллеги.
12. aSHA-1 19.04.23 18:46 Сейчас в теме
а как будет, когда граница попадет между ПС и ВК ?
13. alexkozin 45 19.04.23 19:41 Сейчас в теме
(12)
Функция не делает различий между символами и спец-символами. С любым символом поступит одинаково.

СтрокаДляРазложения = "Мороз и солнце; день чудесный! Еще ты дремлешь" + Символы.ВК + ", друг прелестный — Пора, красавица, проснись: Открой сомкнуты негой взоры Навстречу северной Авроры, Звездою севера явись!";
Прикрепленные файлы:
Оставьте свое сообщение