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

18.04.23

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

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

Файлы

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

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

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

 

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3623    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6722    DeerCven    15    

59

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    49718    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    7400    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    62433    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9232    ke.92@mail.ru    17    

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

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

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

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

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


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

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

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

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

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