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

18.04.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Функция "Разложить строку в массив подстрок определенной длины":
.epf 6,79Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

 

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

См. также

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

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    21245    dimanich70    81    

146

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

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

1 стартмани

18.03.2024    4166    3    John_d    11    

57

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

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

12.02.2024    19616    atdonya    24    

58

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

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

30.11.2023    5615    ke.92@mail.ru    16    

65

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

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

28.08.2023    15148    YA_418728146    7    

169

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

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

2 стартмани

22.08.2023    3681    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 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    18639    172    sapervodichka    112    

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

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

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

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

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


Вопрос: а зачем?)
2. alexkozin 51 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 1366 18.04.23 11:50 Сейчас в теме
(2) МенеджерОборудованияКлиентСервер:

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

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

МассивСтрокФиксШириной = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПостроитьПолеПереносом(Текст, ШиринаСтроки),Символы.ПС,"|"),"|"); 
10. ixijixi 1923 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 51 19.04.23 12:23 Сейчас в теме
Как же я рад, что тема вызвала деятельное обсуждение с приведением массы прекрасных примеров.
Теперь жизнь "гуглящего" 1с-программиста станет чуточку проще))
Всем спасибо, коллеги.
12. aSHA-1 19.04.23 18:46 Сейчас в теме
а как будет, когда граница попадет между ПС и ВК ?
13. alexkozin 51 19.04.23 19:41 Сейчас в теме
(12)
Функция не делает различий между символами и спец-символами. С любым символом поступит одинаково.

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