Всем привет. Подскажите пожалуйста, необходимо удалить одинаковые элементы в массиве, а сумму с удаленного элемента сложить с тем который уже есть в массиве и можно удалить сумму. Делаю так:

```1c
    СтруктураОткрытияФормы = Новый Структура("Ключ", Объект.Ссылка);
    Докум =ОткрытьФорму("Обработка.ЗагрузкаКоэффициентТранспорта.Форма.Форма",СтруктураОткрытияФормы,ЭтаФорма,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

    Массив = Новый Массив;
    Для Каждого Строка Из Объект.Товары Цикл
    Массив.Добавить(Строка.Поставщик);
    Массив.Добавить(Строка.Сумма);
    КонецЦикла;

    ИндексТекущегоЭлемента = 0;
    ВсегоЭлементов = Массив.Количество();
    Пока ИндексТекущегоЭлемента < ВсегоЭлементов Цикл
    ИндексСледующегоЭлемента = ИндексТекущегоЭлемента + 1;
    Пока ИндексСледующегоЭлемента < ВсегоЭлементов Цикл
    Если Массив[ИндексСледующегоЭлемента] = Массив[ИндексТекущегоЭлемента] Тогда
    Массив.Удалить(ИндексСледующегоЭлемента);
    ВсегоЭлементов = ВсегоЭлементов - 1;
    Иначе
    ИндексСледующегоЭлемента = ИндексСледующегоЭлемента + 1;
    КонецЕсли;
    КонецЦикла;
    ИндексТекущегоЭлемента = ИндексТекущегоЭлемента + 1;
    КонецЦикла;

    Для Каждого Элемент Из Массив Цикл
    Сообщить(Элемент);
    НовСтр = Докум.Объект.Товары.Добавить();
    НовСтр.Поставщик = Элемент;
    НовСтр.СуммаОтПоставщика = Элемент;
    КонецЦикла;
```

Не получается даже удалить сумму всегда даёт ошибку что значение индекса вне диапазона.

```1c
    Если Массив[ИндексСледующегоЭлемента] = Массив[ИндексТекущегоЭлемента] Тогда
    Массив.Удалить(ИндексСледующегоЭлемента);
    Массив.Удалить(ИндексСледующегоЭлемента + 1);
    ВсегоЭлементов = ВсегоЭлементов - 1;
    Иначе
    ИндексСледующегоЭлемента = ИндексСледующегоЭлемента + 1;
    КонецЕсли;
```

Может вообще нужно через другой метод это делать? За ранее спасибо за ответы.
---
А не проще сделать так:

```1c
    ТаблицаТоваров = Объект.Товары.Выгрузить();
    ТаблицаТоваров.Свернуть("Поставщик","Сумма");
    Объект.Товары.Загрузить(ТаблицаТоваров);
```

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

    ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(), Строка);

    КонецЦикла;
    ЭтотОбъект.Записать();
```
 Причем все это выполняется на сервере. Таблица значений на клиенте недоступна. ЗЫ Копия, возможно, и ни к чему.
---
Делай через соответствие. Тогда на сервер бегать не придется.

```1c
    Соответствие = Новый Соответствие;
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    ТекЗначение = Соответствие[СтрокаТЧ.Поставщик];
    Соответствие[СтрокаТЧ.Поставщик] = ?(ТекЗначение=Неопределено,0,ТекЗначение)+СтрокаТЧ.Сумма;
    КонецЦикла;
    Для каждого КлючЗначение Из Соответствие Цикл
    НовСтр = Докум.Объект.Товары.Добавить();
    НовСтр.Поставщик = КлючЗначение.Ключ;
    НовСтр.СуммаОтПоставщика = КлючЗначение.Значение;
    КонецЦикла;
```
---
А не проще сделать так:

```1c
    ТаблицаТоваров = Объект.Товары.Выгрузить();
    ТаблицаТоваров.Свернуть("Поставщик","Сумма");
    Объект.Товары.Загрузить(ТаблицаТоваров);
```

И получаешь таблицу по поставщикам и суммам.
---
Спасибо огромное. А как мне ее свернуть на сервере и затем передать на клиента? У меня на клиенте по кнопке открывается форма обработки. Пробую получить объект обработки на сервере так:
```1c
    ВыгрузкаТБ = Объект.Товары.Выгрузить();
    ВыгрузкаТБ.Свернуть("Поставщик");
    ЗагрузкаКоэффициентов = Обработки.ЗагрузкаКоэффициентТранспорта.ПолучитьФорму("Форма");
```

но вылетает ошибка "интерактивные операции недоступны"
код на клиенте

```1c
    ТЗ = РассчетПослеНаСервере();
    Сообщить(ТЗ);
```
---
как то так
```1c
    ТЗДок = Объект.Товары.Выгрузить();
    Копия = ТЗДок.Скопировать();
    Копия.Свернуть("Номенклатура", "Количество");
    Объект.Номенклатура.Очистить();
    Для Каждого Строка Из Копия Цикл

    ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(), Строка);

    КонецЦикла;
    ЭтотОбъект.Записать();
```
 Причем все это выполняется на сервере. Таблица значений на клиенте недоступна. ЗЫ Копия, возможно, и ни к чему.
---
Да, метод свернуть ничего не возвращает(. А к форме обработки которая находиться в самой конфигурации, в этом же коде можно обратиться? форму получить не даёт.

"У меня в обработке форма с табличной частью "Товары" а кнопка вызова этой обработки в документе находиться. По нажатию этой кнопки должна свернуться табличная часть из документа и перенестись в обработку"
---
создай ТЗ, вгрузи значения в колонку ТЗ из массива, сверни ТЗ.
---
если удаляете, то удаляем с конца таблицы
Например, с таблице 20 строк... удаляем с 19 строки....и при удалении ВсегоСтрок =ВсегоСтрок -1....и до 0
---
а вот это, конечно, зачет, ага

 Массив.Добавить(Строка.Поставщик);
            Массив.Добавить(Строка.Сумма);
---
А как правильно будет? Можно ли добавить два значения в один элемент?
---
```1c
    Массив.Добавить(Новый Структура("Поставщик, Сумма", Строка.Поставщик, Строка.Сумма));
```
Но все зависит от того, что нужно сделать в принципе. Если просто свернуть по поставщику суммы (чтобы был один поставщик и одна общая сумма этого поставщика), то существует такая штука, как таблица значений и метод "Свернуть".
---
Создайте новый массив и перенесите туда элементы из старого с предварительной проверкой, что они уже есть.
---
Автор кода не понимает, что такое массив. Может быть, стоит поручить задачу программисту.
---
Добрый день! Цепляешь к форме ТЗ, заполняешь ее с формой , сворачиваешь ее по Поставщику и Сумме, обновляешь форму.
---
Делай через соответствие. Тогда на сервер бегать не придется.

```1c
    Соответствие = Новый Соответствие;
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    ТекЗначение = Соответствие[СтрокаТЧ.Поставщик];
    Соответствие[СтрокаТЧ.Поставщик] = ?(ТекЗначение=Неопределено,0,ТекЗначение)+СтрокаТЧ.Сумма;
    КонецЦикла;
    Для каждого КлючЗначение Из Соответствие Цикл
    НовСтр = Докум.Объект.Товары.Добавить();
    НовСтр.Поставщик = КлючЗначение.Ключ;
    НовСтр.СуммаОтПоставщика = КлючЗначение.Значение;
    КонецЦикла;
```
---
Работает отлично, спасибо!
---
ОбщегоНазначенияБПВызовСервера.УдалитьПовторяющиесяЭлементыМассива(ТвойМассив)
  Взаимодействия.УдалитьПовторяющиесяЭлементыМассива(ТвойМассив)