Разложить строку в структуру

1. Manticor 66 26.12.12 15:41 Сейчас в теме
Доброго времени ВСЕМ!
подскажите, нужно разложить строку, в которой содержатся пробелы на значения и их занести в соответствие структуры

&НаСервере	
Функция РазложитьСтроку(Знач Стр, Разделитель = ",")
	
	МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
	|Время, Длит, Номер, CallerID, Dir, DirEx");

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

Ругается
Метод объекта не обнаружен (Вставить)
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
32. SPID 27.12.12 10:27 Сейчас в теме
Из файла видно, что каждый показатель начинается с определенного символа в строке, кроме трех последних показателей, поэтому можно попробовать сделать так:
Функция ПолучитьСтруктуру(Стр,Разделитель);
	
	МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
		    |Время, Длит, Номер, CallerID, Dir, DirEx");
			
	МассивСтрок.Вставить("F",СокрЛП(Сред(Стр,1,2)));
	МассивСтрок.Вставить("CRN1CRN2",СокрЛП(Сред(Стр,3,9)));
	МассивСтрок.Вставить("Orig",СокрЛП(Сред(Стр,12,5)));
	МассивСтрок.Вставить("Dest",СокрЛП(Сред(Стр,17,5)));
	МассивСтрок.Вставить("Дата",СокрЛП(Сред(Стр,22,11)));
	МассивСтрок.Вставить("Время",СокрЛП(Сред(Стр,33,9)));
	МассивСтрок.Вставить("Длит",СокрЛП(Сред(Стр,42,9)));
	МассивСтрок.Вставить("Номер",СокрЛП(Сред(Стр,51,21)));
	
	// Для остальной строки разбор по предыдущему методу
	ДоразложитьСтроку(СокрЛП(Сред(Стр,72,СтрДлина(Стр)-72))," ",МассивСтрок);
	
КонецФункции

Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
	
	
	МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Ложь);
	
	СоответствиеКлючаПоказателю = Новый Соответствие;
	СоответствиеКлючаПоказателю.Вставить(1,"CallerID");
	СоответствиеКлючаПоказателю.Вставить(2,"Dir");
	СоответствиеКлючаПоказателю.Вставить(3,"DirEx");
	
	ЭтоПропуск = Ложь;
	Показатель = 1;
	Для каждого Подстрока из МассивПодстрок Цикл
		
		Если ЗначениеЗаполнено(Подстрока) Тогда
			ЭтоПропуск = Ложь;
			МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
			Показатель = Показатель + 1;
		Иначе
			Если ЭтоПропуск Тогда
				Продолжить;
			Иначе
				ЭтоПропуск = Истина;
				Показатель = Показатель + 1;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
					
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. logos 216 26.12.12 15:49 Сейчас в теме
(1) Manticor, Ну а чего Вы хотите? Вы в коде определяете состав коллекции структуры, но не присваиваете ей значений. У вас все элементы коллекции структуры имеют значение "Неопределено", естественно у них не будет метода "Вставить"
2. Шапокляк 26.12.12 15:47 Сейчас в теме
Элементами структуры являются КлючИЗначение. Для КлючИЗначение нет метода Вставить().
5. logos 216 26.12.12 15:51 Сейчас в теме
(2) Правее, действительно, до инициализированных значений не доходит, Вы неправильно обращаетесь к "КлючИЗначение"
4. Шапокляк 26.12.12 15:50 Сейчас в теме
Наверно, не
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
а
ЭлементСтруктуры.Значение=...
6. mymyka 26.12.12 15:54 Сейчас в теме
для начала стоит перейти на РазложитьСтрокуВМассивПодстрок(СтрокаТекста," "), вместо зубодробительных циклов по элементам пустых структур. А уже потом думать что и куда вставлять.
beldieff; +1 Ответить
7. Manticor 66 26.12.12 16:10 Сейчас в теме
переправил так:
Пока 1=1 Цикл
			Для Каждого ЭлементСтруктуры из МассивСтрок Цикл 
				//Сообщить(Элемент.Ключ + ": " + Элемент.Значение); 
				
				Поз = Найти(Стр,Разделитель);
				Если Поз=0 Тогда
					МассивСтрок.Вставить(ЭлементСтруктуры.Ключ,Стр);
					Возврат МассивСтрок;
				КонецЕсли;
				МассивСтрок.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
				Стр = СокрЛ(Сред(Стр,Поз));
				п=п+1;
			КонецЦикла;
		КонецЦикла; 
Показать

если все поля в строке заполнены(по чсилу полей в структуре) - структура заполняется как надо - каждому значению свое значение. Но, вот если в строке например поле = значению в стркт. Номер пустое, но параметры на 1 сдвигаются.
Как избажать это сдвижение?
8. SPID 26.12.12 16:12 Сейчас в теме
Посмотрите в сторону процедуры РазложитьСтрокуВМассивПодстрок() как писал mymyka, есть в каждой типовой конфигурации или в БСП. Применив к Вашей строке указанную функцию с разделителем " " получите массив слов с индексами соответствующими порядку этих слов в переданной строке. А дальше хоть в свою структуру вставляйте хоть что делайте.

PS Пока 1=1 Цикл, лучше уж заменить на Пока Истина Цикл.
9. Manticor 66 26.12.12 16:26 Сейчас в теме
(8) SPID, да можно наверное через стурктуры сразу сделать?
все равно нужно как то суметь сопоставить индексы массива и ключики структуры, тоесть если значение пусто, то в массиве уже 9 значение а не 10 как нудо и как тут сопоставить?
10. SPID 26.12.12 16:32 Сейчас в теме
В строке как то можно понять что пропущено какое-то слово, например будет три пробела подряд или что то еще?
11. Manticor 66 26.12.12 16:58 Сейчас в теме
(10) SPID, строка такая



думаю файлик надо через excel читать, а так как срока через текстовый не получится(((,
поскольку если номер пустой = то сдвигает все поля, а хотя может посчитать количесово пробелов и задать условие?
12. SPID 26.12.12 17:06 Сейчас в теме
Пробел то тут судя по всему один, как узнать что пропущено было значение хз... не понятно чем Excel поможет тут
13. Manticor 66 26.12.12 17:09 Сейчас в теме
(12) SPID, смотрите ссылку на фото - так яснее гораздо. Фишка в том, что если поле номер пусто, то количество пробелов там=
= 22 символа (пробела). Так может задать условие что если количество в строке более или равно 22 пробела то это тоже как поле.
Но как такое реализовать?
14. delwish 26.12.12 17:16 Сейчас в теме
(13) реализовать такое не проблема. пишите условие, что если не 22, ну и т.п. Дело не в этом, а в том, чтобы сделать это все нормально работающим. Но если у вас файл не имеет строгой разметки, то как-то сомнительно, что все будет нормально работать. Где гарантия, что будет всегда 22 пробела? Мой совет: данные получайте другим путем(другого формата) . Ну и также можно попробовать считать это файл как текстовый с разделителями через ODBC, но думаю это не вариант.
15. mymyka 26.12.12 17:22 Сейчас в теме
Можно резать от строки уже записанные реквизиты и проверять разницу между СокрЛ(СтрДлина(ОстатокСтроки)) и СтрДлина(ОстатокСтроки). Если вариант с СокрЛ сильно короче, значит был пропущен реквизит, причем пофиг сколько там было пробелов. Пишем в структуру значение текущего реквизита = "", режем ОстатокСтроки до СокрЛ(ОстатокСтроки) и переходим к следующему ключу структуры.
16. Шапокляк 26.12.12 17:26 Сейчас в теме
Manticor, можете сюда скопировать разбираемую строку? Есть подозрение, что они у вас одной длины все, просто каждое поле начинается со своей стьрого фиксированной позиции. Если это так, можно изобразить нечто вроде:
Стр=НашаСтрока;
Стр1=Сред(НашаСтрока,1,4);
Стр2=Сред(НашаСтрока,8,10);
и т.д.
...
НашаСтруктура.F=Стр1;
НашаСтруктура.Ква=Стр2;
....
Возврат НашаСтруктура;
19. Manticor 66 26.12.12 17:32 Сейчас в теме
(16) Шапокляк, + 000A0002 3 NET 16.10.2012 09:09:38 00:00:44 88412558752 Внут 12
вот взял из отладчика, как видно после времени 22 пробела
(15) mymyka, можете в коде указать?
17. SPID 26.12.12 17:28 Сейчас в теме
так же можно посмотреть все туже функцию РазложитьСтрокуВМассивПодстрок, там есть параметр ПропускатьПустыеСтроки и если его передать в Ложь то строка типа
"поле1 поле2 поле3 поле4"
При вызове РазложитьСтрокуВМассивПодстрок(МояСтрока," ",Ложь) вернет массив где
"поле1"
"поле2"
" "
" "
" "
"поле3"
" "
"поле4"

Ну а дальше массив в цикле обходим, и если встретили не заполнено значение, значит что то пропущено... ищем следующее заполненое...
20. Manticor 66 26.12.12 17:36 Сейчас в теме
(17) SPID, а это в какой конфе смотрите. Я вот смотрю из БП 2.0 и там не 3 параметра((
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
	
	МассивСтрок = Новый Массив();
	Если Разделитель = " " Тогда
		Стр = СокрЛП(Стр);
		Пока 1=1 Цикл
			Поз = Найти(Стр,Разделитель);
			Если Поз=0 Тогда
				МассивСтрок.Добавить(Стр);
				Возврат МассивСтрок;
			КонецЕсли;
			МассивСтрок.Добавить(Лев(Стр,Поз-1));
			Стр = СокрЛ(Сред(Стр,Поз));
		КонецЦикла;
	Иначе
Показать
и тд
скиньте ваш вариант))
18. SPID 26.12.12 17:30 Сейчас в теме
эх пробелы убрало в тестовой строке, вообщем там между поле2 и поле3 4 пробела, а между поле3 и поле4 2 пробела
21. SPID 26.12.12 17:43 Сейчас в теме
Набросал примерно код, сам не проверял работоспособность
	МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
		    |Время, Длит, Номер, CallerID, Dir, DirEx");
	
	МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Ложь);
	
	СоответствиеКлючаПоказателю = Новый Соответствие;
	СоответствиеКлючаПоказателю.Вставить(1,"F");
	СоответствиеКлючаПоказателю.Вставить(2,"CRN1CRN2");
	СоответствиеКлючаПоказателю.Вставить(3,"Orig");
	СоответствиеКлючаПоказателю.Вставить(4,"Dest");
	СоответствиеКлючаПоказателю.Вставить(5,"Дата");
	СоответствиеКлючаПоказателю.Вставить(6,"Время");
	СоответствиеКлючаПоказателю.Вставить(7,"Длит");
	СоответствиеКлючаПоказателю.Вставить(8,"Номер");
	СоответствиеКлючаПоказателю.Вставить(9,"CallerID");
	СоответствиеКлючаПоказателю.Вставить(10,"Dir");
	СоответствиеКлючаПоказателю.Вставить(11,"DirEx");
	
	ЭтоПропуск = Ложь;
	Показатель = 1;
	Для каждого Подстрока из МассивПодстрок Цикл
		
		Если ЗначениеЗаполнено(Подстрока) Тогда
			ЭтоПропуск = Ложь;
			МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
			Показатель = Показатель + 1;
		Иначе
			Если ЭтоПропуск Тогда
				Продолжить;
			Иначе
				ЭтоПропуск = Истина;
				Показатель = Показатель + 1;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
Показать


Функцию можно посмотреть, например, в конфигурации Документооборот
23. mymyka 26.12.12 17:45 Сейчас в теме
что-то типа такого
Стр = "123 234 345         456     672";
Разделитель = " ";
СтруктураИтог = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
    |Время, Длит, Номер, CallerID, Dir, DirEx");
    
    Стр = СокрЛП(Стр);
    Если Разделитель = " " Тогда
        Для Каждого КлючИЗначение из СтруктураИтог Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                СтруктураИтог.Вставить(КлючИЗначение.Ключ,Стр);
                Прервать;
            ИначеЕсли Поз = 1 Тогда//значит первым стоит пробел
                Если (СтрДлина(Стр) - СтрДлина(СокрЛ(Стр))) > 2 Тогда //Впереди как минимум 2 пробела
                    СтруктураИтог.Вставить(КлючИЗначение.Ключ,""); //создаем пустое значение для текущего ключа
                    Стр = СокрЛП(Стр);
                 Иначе //это просто пробел между словами
                    Стр = Прав(Стр,СтрДлина(Стр)-1);//так или иначе режем до первого значащего символа
                КонецЕсли;
            ИначеЕсли Поз > 1 Тогда
                //Это нормальный параметр, режем, пишем и т.д.
                СтруктураИтог.Вставить(КлючИЗначение.Ключ,Сред(Стр,1,Поз));
                Стр = Прав(Стр,СтрДлина(Стр)-Поз);
            КонецЕсли;                
        КонецЦикла;
    КонецЕсли;

Для Каждого Элемент из СтруктураИтог Цикл
	Сообщить(Элемент.КЛюч + ":"+Элемент.Значение);
КонецЦикла;
Показать


(21)К сожалению, при 22 пробелах она создаст 22 элемента, а нужен только один.
Для примера,
МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("123 234пять_пробелов567", " ",Ложь); возвращает массив из 8 элементов.
24. Manticor 66 26.12.12 17:54 Сейчас в теме
(23) mymyka, Поле объекта недоступно для записи (Значение)
КлючИЗначение.Значение = Сред(Стр,1,Поз)
25. SPID 26.12.12 17:56 Сейчас в теме
(23) mymyka,
Верно, и эти пробелы пропускаем при обходе массива в цикле.
Кстати если будет пропущено подряд два показателя, то работать не будет. Надежнее вариант это конечно изменение формата файла на более удобочитаемый для программ.
Manticor; +1 Ответить
26. Manticor 66 26.12.12 18:03 Сейчас в теме
(25) SPID, Ошибка при вызове метода контекста (Вставить)
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
сначало все хорошо вставляет в структуру, потом сыпится с таокй ошибкой
27. mymyka 26.12.12 18:21 Сейчас в теме
добавил в (23) рабочий пример. Правда к двум подряд пропущенным параметрам оно тоже не устойчиво, что несомненно минус, хотя можно сравнить длину "пробельной" части с максимальной длиной параметра и сделать вывод, если она больше, значит пропущено 2 параметра подряд(что делать с трем и больше я хз). А вообще идеально было бы вывести другой разделитель и не парить мозг.
З.Ы. (21) поизящнее, конечно, выглядит :Р
Manticor; +1 Ответить
29. Manticor 66 26.12.12 21:58 Сейчас в теме
(23) mymyka, да с такой строкой все хорошо проходит))
а если вот как из файла тянет попробовать ))
Стр = "+ 0002000A NET  3    16.10.2012 09:09:06 00:00:28 103                  88412558752 Внут 12";

или
- 000A000B 3    HOLD 16.10.2012 09:09:34 00:00:04                      88412558752[] Внут 0   

может формулу расчте поменять?
В моем случае двух пустых подряд параметров быть не может)), только номер.
(21) так не прокатывате, поскольку при разных строках разное количество параметров получается для сопоставления
22. SPID 26.12.12 17:44 Сейчас в теме
Вот функция эта
// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
//
// Параметры:
//  Строка                 - Строка - текст с разделителями;
//  Разделитель            - Строка - разделитель строк текста, минимум 1 символ;
//  ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
//    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
//     - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
//       включаются в результат.
//     - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
//       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
//       при других разделителях результатом функции будет пустой массив.
//
//
// Возвращаемое значение:
//  Массив - массив строк.
//
// Примеры:
//  РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых  - пустые строки;
//  РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
//  РазложитьСтрокуВМассивПодстрок(" один   два  ", " ") - возвратит массив из двух элементов;
//  РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
//  РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
//  РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт
	
	Результат = Новый Массив;
	
	// для обеспечения обратной совместимости
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Строка) Тогда 
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	//
	
	Позиция = Найти(Строка, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Строка, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Результат.Добавить(Подстрока);
		КонецЕсли;
		Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
		Позиция = Найти(Строка, Разделитель);
	КонецЦикла;
	
	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
		Результат.Добавить(Строка);
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
Показать
28. romansun 194 26.12.12 18:53 Сейчас в теме
юзайте СтрЗаменить(строка, разделитель, Символы.ПС)

получите многострочную строку, сокрЛП на неё и проверку на пробелы.. дальше обычный цикл с переброской в массив или структуру

и делов
30. SPID 27.12.12 09:29 Сейчас в теме
Да, мой код будет некорректно работать(( так как между значениями идущими подряд так же несколько пробелов.
Формат файла видимо фиксированный по количеству символов, выложи файл (или его часть с несколькими строками. Все же придется считать пробелы.
31. Manticor 66 27.12.12 09:34 Сейчас в теме
(30) SPID, по идее ваиант предложенный (23) mymyka - работает, но что то с подсчетом пробелов - косячит(также смещает, если брать строку из файла)
Прикрепленные файлы:
caller.txt
32. SPID 27.12.12 10:27 Сейчас в теме
Из файла видно, что каждый показатель начинается с определенного символа в строке, кроме трех последних показателей, поэтому можно попробовать сделать так:
Функция ПолучитьСтруктуру(Стр,Разделитель);
	
	МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
		    |Время, Длит, Номер, CallerID, Dir, DirEx");
			
	МассивСтрок.Вставить("F",СокрЛП(Сред(Стр,1,2)));
	МассивСтрок.Вставить("CRN1CRN2",СокрЛП(Сред(Стр,3,9)));
	МассивСтрок.Вставить("Orig",СокрЛП(Сред(Стр,12,5)));
	МассивСтрок.Вставить("Dest",СокрЛП(Сред(Стр,17,5)));
	МассивСтрок.Вставить("Дата",СокрЛП(Сред(Стр,22,11)));
	МассивСтрок.Вставить("Время",СокрЛП(Сред(Стр,33,9)));
	МассивСтрок.Вставить("Длит",СокрЛП(Сред(Стр,42,9)));
	МассивСтрок.Вставить("Номер",СокрЛП(Сред(Стр,51,21)));
	
	// Для остальной строки разбор по предыдущему методу
	ДоразложитьСтроку(СокрЛП(Сред(Стр,72,СтрДлина(Стр)-72))," ",МассивСтрок);
	
КонецФункции

Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
	
	
	МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Ложь);
	
	СоответствиеКлючаПоказателю = Новый Соответствие;
	СоответствиеКлючаПоказателю.Вставить(1,"CallerID");
	СоответствиеКлючаПоказателю.Вставить(2,"Dir");
	СоответствиеКлючаПоказателю.Вставить(3,"DirEx");
	
	ЭтоПропуск = Ложь;
	Показатель = 1;
	Для каждого Подстрока из МассивПодстрок Цикл
		
		Если ЗначениеЗаполнено(Подстрока) Тогда
			ЭтоПропуск = Ложь;
			МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
			Показатель = Показатель + 1;
		Иначе
			Если ЭтоПропуск Тогда
				Продолжить;
			Иначе
				ЭтоПропуск = Истина;
				Показатель = Показатель + 1;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
					
КонецПроцедуры
Показать
33. Manticor 66 27.12.12 11:51 Сейчас в теме
(32) SPID, как оказалось все гениальное - просто)), тоесть лучше всего было задат каждому параметру свою длинну = так проще разбить не заморачиваясь с лишними пробелами и их вычислениями))
34. Manticor 66 27.12.12 16:01 Сейчас в теме
(32) SPID, а можете еще с нюаном подмоч) нужно еще номер разложить, тоесть если у нас номер вида 1111[2222], то их на 2 параметра делим номер1 =1111, номер 2= 2222
&НаСервере 
Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
    разд1 ="[";
	разд2 ="]";
    
    МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Истина);
    
    СоответствиеКлючаПоказателю = Новый Соответствие;
	СоответствиеКлючаПоказателю.Вставить(1,"Номер1");
	СоответствиеКлючаПоказателю.Вставить(2,"Номер2");
	СоответствиеКлючаПоказателю.Вставить(3,"CallerID1");
	СоответствиеКлючаПоказателю.Вставить(4,"CallerID2");
    СоответствиеКлючаПоказателю.Вставить(5,"Dir");
    СоответствиеКлючаПоказателю.Вставить(6,"DirEx");
    
    ЭтоПропуск = Ложь;
    Показатель = 1;
    Для каждого Подстрока из МассивПодстрок Цикл
        
		Если ЗначениеЗаполнено(Подстрока) Тогда
			
			///////  84952230404[8884952230404]
			Позиция = Найти(Подстрока, разд1);
			Если Позиция > 0 Тогда
			
				Пока Позиция > 0 Цикл
					ПодПодстрока = Лев(Подстрока, Позиция - 3);
					//Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
					//					Результат.Добавить(ПодПодстрока);
					//КонецЕсли;
					Строка = Сред(Подстрока, Позиция + СтрДлина(разд1));
					Позиция = Найти(Строка, разд2);
					
					СубПодстрока = Прав(Подстрока, Позиция - 1);
					
					//	Подстрока.Добавить(СубПодстрока);
					//КонецЦикла;
					///////
					
					ЭтоПропуск = Ложь;
					//Сообщить(СоответствиеКлючаПоказателю.Получить(Показатель)+Подстрока);
					МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),СубПодстрока); //Подстрока
					//Показатель = Показатель + 1;
					
					//Подстрока.Добавить(СубПодстрока);
				КонецЦикла;
			КонецЕсли;
		Иначе
			МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока); //Подстрока
			Показатель = Показатель + 1;
        Иначе
            Если ЭтоПропуск Тогда
                Продолжить;
            Иначе
                ЭтоПропуск = Истина;
                Показатель = Показатель + 1;
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
                    
КонецПроцедуры
Показать
36. SPID 27.12.12 16:32 Сейчас в теме
(34) Manticor,
Для подстроки с номером вызвать опять РазложитьСтрокуВМассивПодстрок(ПодстрокаСНомером,"[")
Проанализировать сколько элементов массива получили, если один то его и берем, второй части нет, если более одного, то первый это Номер1 , второй это Номер2, в Номер2 делаем СтрЗаменить(Строка, "]", "") и все

PS а если в массиве 0, то нет номеров.
37. Manticor 66 27.12.12 21:24 Сейчас в теме
(36) SPID, вот сделал так, получается, если номер составной(тоесть номер1 и ном2 есть) а также CallerID1 и 2, то все заполняется в соответствии), Но если и номер и Caller простые, то все сдвигается. Что нужно переправить?

&НаСервере
Функция РазложитьСтроку2(Знач Стр, Разделитель = " ")
  МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
            |Время, Длит, Номер1, Номер2, CallerID1, CallerID2, Dir, DirEx");

	//Стр = "- 000A000B 3    HOLD 16.10.2012 09:09:34 00:00:04                      88412558752[] Внут 0   ";
	Стр = "- 000B000D 7    INRT 16.10.2012 09:12:45 00:00:00 151                  107      Внут 18  ";		
	//Стр = "+ 0002000A 2    NET  16.10.2012 09:53:22 00:01:17 84952230404[8884952230404] 102[230784] Внут 13  ";		
	
    МассивСтрок.Вставить("F",СокрЛП(Сред(Стр,1,2)));
    МассивСтрок.Вставить("CRN1CRN2",СокрЛП(Сред(Стр,3,9)));
    МассивСтрок.Вставить("Orig",СокрЛП(Сред(Стр,12,5)));
    МассивСтрок.Вставить("Dest",СокрЛП(Сред(Стр,17,5)));
    МассивСтрок.Вставить("Дата",СокрЛП(Сред(Стр,22,11)));
    МассивСтрок.Вставить("Время",СокрЛП(Сред(Стр,33,9)));
    МассивСтрок.Вставить("Длит",СокрЛП(Сред(Стр,42,9)));
   // МассивСтрок.Вставить("Номер",СокрЛП(Сред(Стр,51,21)));
    
    // Для остальной строки разбор по предыдущему методу
    ДоразложитьСтроку(СокрЛП(Сред(Стр,50,СтрДлина(Стр)-50))," ",МассивСтрок); //49 //72
	
	Для Каждого Элемент из МассивСтрок Цикл
	Сообщить(Элемент.КЛюч + ":"+Элемент.Значение);
	КонецЦикла;
КонецФункции

&НаСервере 
Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
    разд1 ="[";
	разд2 ="]";
    
    МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Истина);
    
    СоответствиеКлючаПоказателю = Новый Соответствие;
	СоответствиеКлючаПоказателю.Вставить(1,"Номер1");
	СоответствиеКлючаПоказателю.Вставить(2,"Номер2");
	СоответствиеКлючаПоказателю.Вставить(3,"CallerID1");
	СоответствиеКлючаПоказателю.Вставить(4,"CallerID2");
	СоответствиеКлючаПоказателю.Вставить(5,"Dir");
	СоответствиеКлючаПоказателю.Вставить(6,"DirEx");
       
    ЭтоПропуск = Ложь;
    Показатель = 1;
	Для каждого Подстрока из МассивПодстрок Цикл
		//84952230404[8884952230404] 102[230784] Внут 13
		Если ЗначениеЗаполнено(Подстрока) Тогда
			ЭтоПропуск = Ложь;
			Врем =  РазложитьСтрокуВМассивПодстрок(Подстрока,"[",истина); 
			Кол_воНомеров = Врем.Количество();
			
			Если Кол_воНомеров = 1  Тогда
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]);
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1), Неопределено);
				Показатель = Показатель + 2;
			ИначеЕсли Кол_воНомеров = 2 Тогда 
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]); //Подстрока
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1),СтрЗаменить(Врем[1], "]", ""));
				Показатель = Показатель + 2;
			Иначе	
				Если ЭтоПропуск Тогда
					Продолжить;
				Иначе
					ЭтоПропуск = Истина;
					Показатель = Показатель + 1;
				КонецЕсли;	
			КонецЕсли; 
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать
38. Manticor 66 27.12.12 22:07 Сейчас в теме
(37) Manticor, вот как то такое условие добавил по пказателю(дабы все жестко задано)

Если Кол_воНомеров = 1 И Показатель<4 Тогда
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]);
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1), Неопределено);
				Показатель = Показатель + 2;
			ИначеЕсли Кол_воНомеров = 1 И Показатель>4 Тогда
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]);
				Показатель = Показатель + 1;	
			ИначеЕсли Кол_воНомеров = 2 Тогда 
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]); //Подстрока
				МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1),СтрЗаменить(Врем[1], "]", ""));
				Показатель = Показатель + 2;
			Иначе	
				Если ЭтоПропуск Тогда
					Продолжить;
Показать

если номер пуст - то сдвигает все((, а так при заполненном номере работает.
то что неопределенное значение в структуру вставляю - потом на создании документа с таким значением как
может отразиться? Или тут как то по другому можно было?
39. SPID 28.12.12 09:00 Сейчас в теме
(38) Manticor,
Про Неопределенно нечего страшного, при присваивании в какой-либо типизированный атрибут документа неопределенно автоматически преобразуется в пустое значение указанного типа, с атрибутами составного типа тоже все нормально - там неопределенно так и будет.

По поводу алгоритма не совсем ясно, если CallerID будет отсутствовать в строке " 88412558752[] Внут 0", то получается неверно отработает алгоритм:
Итерация цикла 1 заполнит значения Номер1 = "88412558752"; Номер2 = "". Итерация цикла 2 заполнит CallerID1 = "Внут "; CallerID1 = неопределенно. Итерация цикла 3 заполнит Dir = "0"; DirEx = неопределено.

Протестируйте, может я где то ошибся.

Отсутствовать может только CallerID? Не самый хороший вариант, но.... так как CallerID числовой, а за ним идет текстовый показатель, то может попробовать преобразовать к числу... преобразовалось - это CallerID.
40. Manticor 66 28.12.12 09:21 Сейчас в теме
(39) SPID, эти действия нужны лишь для того, чтобы разложит если поля составные(номер и callerId). Может лучше создать 2 структуру и уже в отдельной продуре, проходя по ключам-- переносить в другую, так думаю пойдет, чем сейчас менять обработку заполнения)
41. Dinamit_stud 64 28.12.12 17:28 Сейчас в теме
(39) Добрый день, можете мне на почту(dinamit_stud@mail.ru) прислать пример файлика, попробую создать обработку для него. Вам нужно под УФ или обычная форма тоже подойдет?
35. 1C_Prof 27.12.12 16:22 Сейчас в теме
Возможно подойдет: Ну и соответственно вставить проверку, если что-то вставлять не нужно
 
....
СоответствиеРеквизитов=обРазложитьСтрокуВСоответствие(ТекстСтроки, "пробел");
.....
Функция обРазложитьСтрокуВСоответствие(Знач Строка, Разделитель) Экспорт
    Соответствие=Новый Соответствие;
    ЧислоВхождений=СтрЧислоВхождений(Строка, Разделитель);
	
	Для i=1 По ЧислоВхождений Цикл
        ПервоеВхождение=Найти(Строка,Разделитель)-1;
        Значение=Лев(Строка,ПервоеВхождение);
        Строка=Прав(Строка,СтрДлина(Строка)-СтрДлина(Значение)-1);
        Соответствие.Вставить(i,Значение);
    КонецЦикла;    
    Соответствие.Вставить(i,Строка);
	Возврат Соответствие;
КонецФункции
Показать
Оставьте свое сообщение

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