Строка с разделителями. Как преобразовать в массив значений?

1. planod 29.02.12 13:17 Сейчас в теме
Есть текстовая строка: Товар#ЦенаПокупки#ЦенаПродажи

Как получить отдельно товар, отдельно цены.

В php есть функция explode() для этого, а как реализовать в 1с?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RusCorsar 29.02.12 14:13 Сейчас в теме
Функция Разложить(Знач Стр, Разделитель = ",") Экспорт

Список = Новый Массив();
Длина = СтрДлина(Разделитель);

Стр = СокрЛП(Стр);
Поз = Найти(Стр, Разделитель);

Пока 0 < Поз Цикл
Список.Добавить(СокрП(Лев(Стр, Поз-1)));

Стр = СокрЛ(Сред(Стр, Поз+Длина));
Поз = Найти(Стр, Разделитель);
КонецЦикла;

Список.Добавить(Стр);

Возврат Список;

КонецФункции //Разложить()
vika64; planod; +2 1 Ответить
3. Триш 29.02.12 17:07 Сейчас в теме
Если конфигурации типовые, то там есть уже функция Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",").
IgorXml; cleaner_it; alsegor; Gendelf; nekit_rdx; Lo1jke; egorcheg1; sknarid; Horsy; +9 Ответить
17. ShamanPro 29.01.19 14:34 Сейчас в теме
(3)
РазложитьСтрокуВМассивПодстрок

В ВДГБ 8.3 и 1С Университет проф не нашел такого.
Зато есть - СтрРазделить (StrSplit)

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

Описание:
Разделяет строку на части по указанным символам-разделителям.

Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
user682948_rusmaxval; Istur; ahachak; dvk09; cleaner_it; SIrina9; Nad_kin; insurgut; greenfest; Darlok; tehas; Sinoptic; user1114234; +13 Ответить
4. Hypertronic 06.02.15 11:55 Сейчас в теме
Я так делаю - (Смотри ниже)
5. Hypertronic 06.02.15 11:56 Сейчас в теме
Функция ИзСтрокиВМассив(НачальнаяСтрока,Разделитель) экспорт
	
	СтрокаПреобразованнаяВМногострочныйТекст 	= СтрЗаменить(НачальнаяСтрока,Разделитель,Символы.ПС);
	ТекстовыйДокументИзСтроки					= Новый ТекстовыйДокумент;
	Результат									= Новый Массив;
	ТекстовыйДокументИзСтроки.УстановитьТекст(СтрокаПреобразованнаяВМногострочныйТекст);
	Для СчетчикСтрок = 1 по ТекстовыйДокументИзСтроки.КоличествоСтрок() цикл
		Результат.Добавить(СокрЛП(ТекстовыйДокументИзСтроки.ПолучитьСтроку(СчетчикСтрок));
	КонецЦикла;
	Возврат Результат;
	
КонецФункции
Показать
aleksey2; alsen; Para_1987; Zayd; natarezn; zoytsa; +6 1 Ответить
20. ybatiaev 58 01.03.24 10:52 Сейчас в теме
(5)
Функция ИзСтрокиВМассив(НачальнаяСтрока,Разделитель) экспорт

СтрокаПреобразованнаяВМногострочныйТекст = СтрЗаменить(НачальнаяСтрока,Разделитель,Символы.ПС);
ТекстовыйДокументИзСтроки = Новый ТекстовыйДокумент;
Результат = Новый Массив;
ТекстовыйДокументИзСтроки.УстановитьТекст(СтрокаПреобразованнаяВМногострочныйТекст);
Для СчетчикСтрок = 1 по ТекстовыйДокументИзСтроки.КоличествоСтрок() цикл
Результат.Добавить(СокрЛП(ТекстовыйДокументИзСтроки.ПолучитьСтроку(СчетчикСтрок));
КонецЦикла;
Возврат Результат;

КонецФункции


Да, в УТ10.3 в их стандартной ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(сВСписке, ",")) нет возможности игнорировать пустышки. Поэтому ВСПИСКЕ это может быть критичным, как у меня именно сейчас. Поэтому чуть изменил.

Функция ИзСтрокиВМассив(НачальнаяСтрока,Разделитель)
    
    СтрокаПреобразованнаяВМногострочныйТекст     = СтрЗаменить(НачальнаяСтрока,Разделитель,Символы.ПС);
    ТекстовыйДокументИзСтроки                    = Новый ТекстовыйДокумент;
    Результат                                    = Новый Массив;
    ТекстовыйДокументИзСтроки.УстановитьТекст(СтрокаПреобразованнаяВМногострочныйТекст);
	Для СчетчикСтрок = 1 по ТекстовыйДокументИзСтроки.КоличествоСтрок() цикл  
		а = СокрЛП(ТекстовыйДокументИзСтроки.ПолучитьСтроку(СчетчикСтрок));
		Если а<> "" Тогда // игнорим пустые
        	Результат.Добавить(а);
		КонецЕсли;
    КонецЦикла;
    Возврат Результат;
    
КонецФункции
Показать
21. user2033930 01.03.24 11:18 Сейчас в теме
(20) Молодец, эксгумировал...
22. ybatiaev 58 01.03.24 11:40 Сейчас в теме
(21) Слава Богу ещё перевёл работу с 10.2 на 10.3. Это хотя бы уменьшило зоопарк версий платформ 1С. На УТ11.5 так и не перешли, пользователям "не удобно", так и эксгумирую )))
6. alljoke 06.02.15 14:26 Сейчас в теме
// Функция "расщепляет" строку на подстроки, используя заданный
// разделитель. Разделитель может иметь любую длину.
// Если в качестве разделителя задан пробел, рядом стоящие пробелы
// считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
// игнорируются.
// Например,
// РазложитьСтрокуВМассивПодстрок(",ку,,,му", ",") возвратит массив значений из пяти элементов,
// три из которых - пустые строки, а
// РазложитьСтрокуВМассивПодстрок(" ку му", " ") возвратит массив значений из двух элементов
//
// Параметры:
// Стр - строка, которую необходимо разложить на подстроки.
// Параметр передается по значению.
// Разделитель - строка-разделитель, по умолчанию - запятая.
//
//
// Возвращаемое значение:
// массив значений, элементы которого - подстроки
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт

МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока Истина Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;

КонецФункции // глРазложить
8. platon_ 10 06.02.15 14:29 Сейчас в теме
(6) alljoke, оформляйте текст в виде кода.
7. alljoke 06.02.15 14:27 Сейчас в теме
ОбщийМоудль.ОбщегоНазначения
Lo1jke; KolyNCo; Denis211990; +3 Ответить
9. NeZar 11.02.15 01:37 Сейчас в теме
Или вот так,рекурсивненько. Последнего разделителя нет. Массив предварительно инициализировать

Процедура СтрокаВМассив (Строка,МассивИзСтроки)
	Позиция=Найти (Строка,Символы.Таб);
	Если Позиция=0 Тогда
		МассивИзСтроки.Добавить(Строка);
		Возврат;
	Иначе
		МассивИзСтроки.Добавить(Сред(Строка,1,Позиция-1));
		Строка=Сред(Строка,Позиция+1);
		СтрокаВМассив(Строка,МассивИзСтроки);
	КонецЕсли;
КонецПроцедуры
Показать
10. natarezn 26.03.16 15:47 Сейчас в теме
из 1с :
//Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
//
//Параметры:
// Строка - Строка - текст с разделителями;
// Разделитель - Строка - разделитель строк текста, минимум 1 символ;
// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
// включаются в результат.
// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
// при других разделителях результатом функции будет пустой массив.
//
// Возвращаемое значение:
// Массив - массив строк.
//
//Примеры:
// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые строки;
// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов;
// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт

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

// для обеспечения обратной совместимости
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//

Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;

Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;

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

КонецФункции
19. Dermidont 11 19.01.23 15:46 Сейчас в теме
(10) Да вы извращенец, батенька.
МнСтр = СтрЗаменить(ИсходнаяСтрока, Разделитель, Символы.ПС);
Для н = 1 По СтрЧислоСтрок(МнСтр) Цикл
Массив.Добавить(СтрПолучитьСтроку(МнСтр, н));
КонецЦикла;
11. sjobnmru 26.03.16 16:18 Сейчас в теме
Надо написать какая конфа, если стандартная там есть уже функции например в общем модуле ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок
12. Xershi 1484 26.03.16 16:23 Сейчас в теме
(11) sjobnmru, тему читайте, уже все написано!

А я для своего парсера в публикациях эту функцию улучшал, чтобы вычленять сложные выражения.
13. avto-torg 26.03.16 16:31 Сейчас в теме
Проще все-же так и быстрее.

Функция СтрокаВМассивСтрок(Знач Стр, Разделитель)
	
	Результат = Новый Массив;
	
	Строки = СтрЗаменить(Стр, Разделитель, Символы.ПС);
	
	Для Индекс = 1 По СтрЧислоСтрок(Строки) Цикл
		Результат.Добавить(СтрПолучитьСтроку(Строки, Индекс));
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции
Показать
agentesecreto; jun-ko; EvgenMokrousov; GUSST1; user608739_serg999h; AlexeyPapanov; oninfostart; miha7447; Sanario; Izzot_22_04; sergbsv; shadowcpu; tdml; elric; +14 Ответить
14. mailrum2004 1 27.03.18 12:49 Сейчас в теме
Если режим совместимости конфигурации не ниже 8.3.6, то можно:
	массив = СтрРазделить("Товар#ЦенаПокупки#ЦенаПродажи","#");    


Глобальный контекст (Global context)
СтрРазделить (StrSplit)
Синтаксис:

СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)
Параметры:

<Строка> (обязательный)

Тип: Строка.
Разделяемая строка.
<Разделитель> (обязательный)

Тип: Строка.
Строка символов, каждый из которых является индивидуальным разделителем.
<ВключатьПустые> (необязательный)

Тип: Булево.
Указывает необходимость включать в результат пустые строки, которые могут образоваться в результате разделения исходной строки.
Значение по умолчанию: Истина.
Возвращаемое значение:

Тип: Массив.
Массив со строками, которые получились в результате разделения исходной строки.
Описание:

Разделяет строку на части по указанным символам-разделителям.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
freeek; Andrew_flyer; GUSST1; dakork; user847300; kasper076; slavikss; burni4; mifka186; +9 Ответить
15. Denis211990 20 21.04.18 19:12 Сейчас в теме
СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",")

Наиболее продвинутый вариант
Это "Библиотека стандартных подсистем"
user1462294; slavikss; +2 Ответить
16. starik-2005 3036 21.04.18 21:38 Сейчас в теме
(15) СтрРазделить - уже года два как есть в платформе. Читайте синтаксис-помощник. Собстно об этом уже сказали в (14).
user682948_rusmaxval; freeek; EMelihoff; vkozak; +4 Ответить
18. vkozak 28.03.19 08:35 Сейчас в теме
СтрРазделить - правильное решение.
user682948_rusmaxval; freeek; Zlohobbit; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот