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

```1c
    &НаСервере
    Функция РазложитьСтроку(Знач Стр, Разделитель = ",")

    МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
    |Время, Длит, Номер, CallerID, Dir, DirEx");

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

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

Ругается
Метод объекта не обнаружен (Вставить)
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
---
Из файла видно, что каждый показатель начинается с определенного символа в строке, кроме трех последних показателей, поэтому можно попробовать сделать так:

```1c
    Функция ПолучитьСтруктуру(Стр,Разделитель);

    МассивСтрок = Новый Структура("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;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Manticor, Ну а чего Вы хотите? Вы в коде определяете состав коллекции структуры, но не присваиваете ей значений. У вас все элементы коллекции структуры имеют значение "Неопределено", естественно у них не будет метода "Вставить"
---
Элементами структуры являются КлючИЗначение. Для КлючИЗначение нет метода Вставить().
---
Правее, действительно, до инициализированных значений не доходит, Вы неправильно обращаетесь к "КлючИЗначение"
---
Наверно, не
                ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
а
ЭлементСтруктуры.Значение=...
---
для начала стоит перейти на РазложитьСтрокуВМассивПодстрок(СтрокаТекста," "), вместо зубодробительных циклов по элементам пустых структур. А уже потом думать что и куда вставлять.
---
переправил так:

```1c
    Пока 1=1 Цикл
    Для Каждого ЭлементСтруктуры из МассивСтрок Цикл
    //Сообщить(Элемент.Ключ + ": " + Элемент.Значение);

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

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

PS Пока 1=1 Цикл, лучше уж заменить на Пока Истина Цикл.
---
SPID, да можно наверное через стурктуры сразу сделать?
все равно нужно как то суметь сопоставить индексы массива и ключики структуры, тоесть если значение пусто, то в массиве уже 9 значение а не 10 как нудо и как тут сопоставить?
---
В строке как то можно понять что пропущено какое-то слово, например будет три пробела подряд или что то еще?
---
SPID, строка такая

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

Ну а дальше массив в цикле обходим, и если встретили не заполнено значение, значит что то пропущено... ищем следующее заполненое...
---
SPID, а это в какой конфе смотрите. Я вот смотрю из БП 2.0 и там не 3 параметра((

```1c
    Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт

    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
    Стр = СокрЛП(Стр);
    Пока 1=1 Цикл
    Поз = Найти(Стр,Разделитель);
    Если Поз=0 Тогда
    МассивСтрок.Добавить(Стр);
    Возврат МассивСтрок;
    КонецЕсли;
    МассивСтрок.Добавить(Лев(Стр,Поз-1));
    Стр = СокрЛ(Сред(Стр,Поз));
    КонецЦикла;
    Иначе
```
 и тд
скиньте ваш вариант))
---
эх пробелы убрало в тестовой строке, вообщем там между поле2 и поле3 4 пробела, а между поле3 и поле4 2 пробела
---
Набросал примерно код, сам не проверял работоспособность

```1c
    МассивСтрок = Новый Структура("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;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;
```

Функцию можно посмотреть, например, в конфигурации Документооборот
---
что-то типа такого

```1c
    Стр = "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 элементов.
---
mymyka, Поле объекта недоступно для записи (Значение)
                КлючИЗначение.Значение = Сред(Стр,1,Поз)
---
mymyka,
Верно, и эти пробелы пропускаем при обходе массива в цикле.
Кстати если будет пропущено подряд два показателя, то работать не будет. Надежнее вариант это конечно изменение формата файла на более удобочитаемый для программ.
---
SPID, Ошибка при вызове метода контекста (Вставить)
            МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
сначало все хорошо вставляет в структуру, потом сыпится с таокй ошибкой
---
добавил в (23) рабочий пример. Правда к двум подряд пропущенным параметрам оно тоже не устойчиво, что несомненно минус, хотя можно сравнить длину "пробельной" части с максимальной длиной параметра и сделать вывод, если она больше, значит пропущено 2 параметра подряд(что делать с трем и больше я хз). А вообще идеально было бы вывести другой разделитель и не парить мозг.
З.Ы. (21) поизящнее, конечно, выглядит :Р
---
mymyka, да с такой строкой все хорошо проходит))
а если вот как из файла тянет попробовать ))

```1c
    Стр = "+ 0002000A NET 3 16.10.2012 09:09:06 00:00:28 103 88412558752 Внут 12";
```

или

```1c
    - 000A000B 3 HOLD 16.10.2012 09:09:34 00:00:04 88412558752[] Внут 0
```

может формулу расчте поменять?
В моем случае двух пустых подряд параметров быть не может)), только номер.
(21) так не прокатывате, поскольку при разных строках разное количество параметров получается для сопоставления
---
Вот функция эта

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

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

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

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

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

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

    КонецФункции
```
---
юзайте СтрЗаменить(строка, разделитель, Символы.ПС)

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

и делов
---
Да, мой код будет некорректно работать(( так как между значениями идущими подряд так же несколько пробелов.
Формат файла видимо фиксированный по количеству символов, выложи файл (или его часть с несколькими строками. Все же придется считать пробелы.
---
SPID, по идее ваиант предложенный (23) mymyka - работает, но что то с подсчетом пробелов - косячит(также смещает, если брать строку из файла)
---
Из файла видно, что каждый показатель начинается с определенного символа в строке, кроме трех последних показателей, поэтому можно попробовать сделать так:

```1c
    Функция ПолучитьСтруктуру(Стр,Разделитель);

    МассивСтрок = Новый Структура("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;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
SPID, как оказалось все гениальное - просто)), тоесть лучше всего было задат каждому параметру свою длинну = так проще разбить не заморачиваясь с лишними пробелами и их вычислениями))
---
SPID, а можете еще с нюаном подмоч) нужно еще номер разложить, тоесть если у нас номер вида 1111[2222], то их на 2 параметра делим номер1 =1111, номер 2= 2222

```1c
    &НаСервере
    Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
    разд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;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Manticor,
Для подстроки с номером вызвать опять РазложитьСтрокуВМассивПодстрок(ПодстрокаСНомером,"[")
Проанализировать сколько элементов массива получили, если один то его и берем, второй части нет, если более одного, то первый это Номер1 , второй это Номер2, в Номер2 делаем СтрЗаменить(Строка, "]", "") и все

PS а если в массиве 0, то нет номеров.
---
SPID, вот сделал так, получается, если номер составной(тоесть номер1 и ном2 есть) а также CallerID1 и 2, то все заполняется в соответствии), Но если и номер и Caller простые, то все сдвигается. Что нужно переправить?

```1c
    &НаСервере
    Функция РазложитьСтроку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;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```
---
Manticor, вот как то такое условие добавил по пказателю(дабы все жестко задано)

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

если номер пуст - то сдвигает все((, а так при заполненном номере работает.
то что неопределенное значение в структуру вставляю - потом на создании документа с таким значением как
может отразиться? Или тут как то по другому можно было?
---
Manticor,
Про Неопределенно нечего страшного, при присваивании в какой-либо типизированный атрибут документа неопределенно автоматически преобразуется в пустое значение указанного типа, с атрибутами составного типа тоже все нормально - там неопределенно так и будет.

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

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

Отсутствовать может только CallerID? Не самый хороший вариант, но.... так как CallerID числовой, а за ним идет текстовый показатель, то может попробовать преобразовать к числу... преобразовалось - это CallerID.
---
SPID, эти действия нужны лишь для того, чтобы разложит если поля составные(номер и callerId). Может лучше создать 2 структуру и уже в отдельной продуре, проходя по ключам-- переносить в другую, так думаю пойдет, чем сейчас менять обработку заполнения)
---
Добрый день, можете мне на почту(dinamit_stud@mail.ru) прислать пример файлика, попробую создать обработку для него. Вам нужно под УФ или обычная форма тоже подойдет?
---
Возможно подойдет: Ну и соответственно вставить проверку, если что-то вставлять не нужно

```1c
    ....
    СоответствиеРеквизитов=обРазложитьСтрокуВСоответствие(ТекстСтроки, "пробел");
    .....
    Функция обРазложитьСтрокуВСоответствие(Знач Строка, Разделитель) Экспорт
    Соответствие=Новый Соответствие;
    ЧислоВхождений=СтрЧислоВхождений(Строка, Разделитель);

    Для i=1 По ЧислоВхождений Цикл
    ПервоеВхождение=Найти(Строка,Разделитель)-1;
    Значение=Лев(Строка,ПервоеВхождение);
    Строка=Прав(Строка,СтрДлина(Строка)-СтрДлина(Значение)-1);
    Соответствие.Вставить(i,Значение);
    КонецЦикла;
    Соответствие.Вставить(i,Строка);
    Возврат Соответствие;
    КонецФункции
```