Удаление одинаковых элементов в массиве

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

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

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

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


Не получается даже удалить сумму всегда даёт ошибку что значение индекса вне диапазона.
Если Массив[ИндексСледующегоЭлемента] = Массив[ИндексТекущегоЭлемента] Тогда 				
				Массив.Удалить(ИндексСледующегоЭлемента);  
                 Массив.Удалить(ИндексСледующегоЭлемента + 1); 
				ВсегоЭлементов = ВсегоЭлементов - 1; 
			Иначе 
				ИндексСледующегоЭлемента = ИндексСледующегоЭлемента + 1; 
			КонецЕсли;
Показать

Может вообще нужно через другой метод это делать? За ранее спасибо за ответы.
По теме из базы знаний
Найденные решения
7. Ivanov_OM 38 07.04.22 16:24 Сейчас в теме
(1) А не проще сделать так:
ТаблицаТоваров = Объект.Товары.Выгрузить();
ТаблицаТоваров.Свернуть("Поставщик","Сумма");
Объект.Товары.Загрузить(ТаблицаТоваров);

И получаешь таблицу по поставщикам и суммам.
EvgeniyOlxovskiy; ivan1703; Lllypuk; user1619761; Stref75; +5 Ответить
9. starik-2005 3075 08.04.22 07:47 Сейчас в теме
(5)
Массив.Добавить(Новый Структура("Поставщик, Сумма", Строка.Поставщик, Строка.Сумма));
Но все зависит от того, что нужно сделать в принципе. Если просто свернуть по поставщику суммы (чтобы был один поставщик и одна общая сумма этого поставщика), то существует такая штука, как таблица значений и метод "Свернуть".
user1706724; Lllypuk; +2 Ответить
11. user1619761 08.04.22 14:52 Сейчас в теме
(10) как то так
ТЗДок = Объект.Товары.Выгрузить();
	Копия = ТЗДок.Скопировать();	
	Копия.Свернуть("Номенклатура", "Количество");
	Объект.Номенклатура.Очистить();
	Для Каждого Строка Из Копия Цикл
		
		ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(), Строка);
		
	КонецЦикла;
	ЭтотОбъект.Записать();
Показать
Причем все это выполняется на сервере. Таблица значений на клиенте недоступна. ЗЫ Копия, возможно, и ни к чему.
user1706724; EvgeniyOlxovskiy; +2 Ответить
14. tetraren 35 10.04.22 16:46 Сейчас в теме
Делай через соответствие. Тогда на сервер бегать не придется.
Соответствие = Новый Соответствие;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл  
	ТекЗначение = Соответствие[СтрокаТЧ.Поставщик];
	Соответствие[СтрокаТЧ.Поставщик] = ?(ТекЗначение=Неопределено,0,ТекЗначение)+СтрокаТЧ.Сумма;
КонецЦикла;
Для каждого КлючЗначение Из Соответствие Цикл
	НовСтр = Докум.Объект.Товары.Добавить();
	НовСтр.Поставщик = КлючЗначение.Ключ;
	НовСтр.СуммаОтПоставщика = КлючЗначение.Значение;
КонецЦикла; 
Показать
user1706724; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. Ivanov_OM 38 07.04.22 16:24 Сейчас в теме
(1) А не проще сделать так:
ТаблицаТоваров = Объект.Товары.Выгрузить();
ТаблицаТоваров.Свернуть("Поставщик","Сумма");
Объект.Товары.Загрузить(ТаблицаТоваров);

И получаешь таблицу по поставщикам и суммам.
EvgeniyOlxovskiy; ivan1703; Lllypuk; user1619761; Stref75; +5 Ответить
10. Lllypuk 08.04.22 13:49 Сейчас в теме
(7) Спасибо огромное. А как мне ее свернуть на сервере и затем передать на клиента? У меня на клиенте по кнопке открывается форма обработки. Пробую получить объект обработки на сервере так:
 
ВыгрузкаТБ = Объект.Товары.Выгрузить();
ВыгрузкаТБ.Свернуть("Поставщик");
ЗагрузкаКоэффициентов = Обработки.ЗагрузкаКоэффициентТранспорта.ПолучитьФорму("Форма");

но вылетает ошибка "интерактивные операции недоступны"
код на клиенте
ТЗ = РассчетПослеНаСервере();   
Сообщить(ТЗ);

11. user1619761 08.04.22 14:52 Сейчас в теме
(10) как то так
ТЗДок = Объект.Товары.Выгрузить();
	Копия = ТЗДок.Скопировать();	
	Копия.Свернуть("Номенклатура", "Количество");
	Объект.Номенклатура.Очистить();
	Для Каждого Строка Из Копия Цикл
		
		ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(), Строка);
		
	КонецЦикла;
	ЭтотОбъект.Записать();
Показать
Причем все это выполняется на сервере. Таблица значений на клиенте недоступна. ЗЫ Копия, возможно, и ни к чему.
user1706724; EvgeniyOlxovskiy; +2 Ответить
12. Lllypuk 08.04.22 14:59 Сейчас в теме
(11)Да, метод свернуть ничего не возвращает(. А к форме обработки которая находиться в самой конфигурации, в этом же коде можно обратиться? форму получить не даёт.

"У меня в обработке форма с табличной частью "Товары" а кнопка вызова этой обработки в документе находиться. По нажатию этой кнопки должна свернуться табличная часть из документа и перенестись в обработку"
2. user1203706 14 07.04.22 15:58 Сейчас в теме
(0) создай ТЗ, вгрузи значения в колонку ТЗ из массива, сверни ТЗ.
3. Evgenia060882 86 07.04.22 15:59 Сейчас в теме
если удаляете, то удаляем с конца таблицы
Например, с таблице 20 строк... удаляем с 19 строки....и при удалении ВсегоСтрок =ВсегоСтрок -1....и до 0
4. user1203706 14 07.04.22 15:59 Сейчас в теме
(1) а вот это, конечно, зачет, ага

Массив.Добавить(Строка.Поставщик);
Массив.Добавить(Строка.Сумма);
user1619761; Ivanov_OM; EVKash; +3 Ответить
5. Lllypuk 07.04.22 16:04 Сейчас в теме
(4) А как правильно будет? Можно ли добавить два значения в один элемент?
9. starik-2005 3075 08.04.22 07:47 Сейчас в теме
(5)
Массив.Добавить(Новый Структура("Поставщик, Сумма", Строка.Поставщик, Строка.Сумма));
Но все зависит от того, что нужно сделать в принципе. Если просто свернуть по поставщику суммы (чтобы был один поставщик и одна общая сумма этого поставщика), то существует такая штука, как таблица значений и метод "Свернуть".
user1706724; Lllypuk; +2 Ответить
6. gybson 07.04.22 16:15 Сейчас в теме
Создайте новый массив и перенесите туда элементы из старого с предварительной проверкой, что они уже есть.
8. starjevschik 07.04.22 16:26 Сейчас в теме
Автор кода не понимает, что такое массив. Может быть, стоит поручить задачу программисту.
13. Airlord 08.04.22 15:39 Сейчас в теме
Добрый день! Цепляешь к форме ТЗ, заполняешь ее с формой , сворачиваешь ее по Поставщику и Сумме, обновляешь форму.
14. tetraren 35 10.04.22 16:46 Сейчас в теме
Делай через соответствие. Тогда на сервер бегать не придется.
Соответствие = Новый Соответствие;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл  
	ТекЗначение = Соответствие[СтрокаТЧ.Поставщик];
	Соответствие[СтрокаТЧ.Поставщик] = ?(ТекЗначение=Неопределено,0,ТекЗначение)+СтрокаТЧ.Сумма;
КонецЦикла;
Для каждого КлючЗначение Из Соответствие Цикл
	НовСтр = Докум.Объект.Товары.Добавить();
	НовСтр.Поставщик = КлючЗначение.Ключ;
	НовСтр.СуммаОтПоставщика = КлючЗначение.Значение;
КонецЦикла; 
Показать
user1706724; +1 Ответить
15. Lllypuk 11.04.22 09:29 Сейчас в теме
(14) Работает отлично, спасибо!
16. BenDigget 16.04.24 10:04 Сейчас в теме
ОбщегоНазначенияБПВызовСервера.УдалитьПовторяющиесяЭлементыМассива(ТвойМассив)
Взаимодействия.УдалитьПовторяющиесяЭлементыМассива(ТвойМассив)
LeonidBur; +1 Ответить
Оставьте свое сообщение

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