Всем привет. Подскажите пожалуйста, необходимо удалить одинаковые элементы в массиве, а сумму с удаленного элемента сложить с тем который уже есть в массиве и можно удалить сумму. Делаю так:
Не получается даже удалить сумму всегда даёт ошибку что значение индекса вне диапазона.
Может вообще нужно через другой метод это делать? За ранее спасибо за ответы.
СтруктураОткрытияФормы = Новый Структура("Ключ", Объект.Ссылка);
Докум =ОткрытьФорму("Обработка.ЗагрузкаКоэффициентТранспорта.Форма.Форма",СтруктураОткрытияФормы,ЭтаФорма,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
Массив = Новый Массив;
Для Каждого Строка Из Объект.Товары Цикл
Массив.Добавить(Строка.Поставщик);
Массив.Добавить(Строка.Сумма);
КонецЦикла;
ИндексТекущегоЭлемента = 0;
ВсегоЭлементов = Массив.Количество();
Пока ИндексТекущегоЭлемента < ВсегоЭлементов Цикл
ИндексСледующегоЭлемента = ИндексТекущегоЭлемента + 1;
Пока ИндексСледующегоЭлемента < ВсегоЭлементов Цикл
Если Массив[ИндексСледующегоЭлемента] = Массив[ИндексТекущегоЭлемента] Тогда
Массив.Удалить(ИндексСледующегоЭлемента);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
ИндексСледующегоЭлемента = ИндексСледующегоЭлемента + 1;
КонецЕсли;
КонецЦикла;
ИндексТекущегоЭлемента = ИндексТекущегоЭлемента + 1;
КонецЦикла;
Для Каждого Элемент Из Массив Цикл
Сообщить(Элемент);
НовСтр = Докум.Объект.Товары.Добавить();
НовСтр.Поставщик = Элемент;
НовСтр.СуммаОтПоставщика = Элемент;
КонецЦикла;
ПоказатьНе получается даже удалить сумму всегда даёт ошибку что значение индекса вне диапазона.
Если Массив[ИндексСледующегоЭлемента] = Массив[ИндексТекущегоЭлемента] Тогда
Массив.Удалить(ИндексСледующегоЭлемента);
Массив.Удалить(ИндексСледующегоЭлемента + 1);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
ИндексСледующегоЭлемента = ИндексСледующегоЭлемента + 1;
КонецЕсли;
ПоказатьМожет вообще нужно через другой метод это делать? За ранее спасибо за ответы.
По теме из базы знаний
Найденные решения
(1) А не проще сделать так:
И получаешь таблицу по поставщикам и суммам.
ТаблицаТоваров = Объект.Товары.Выгрузить();
ТаблицаТоваров.Свернуть("Поставщик","Сумма");
Объект.Товары.Загрузить(ТаблицаТоваров);
И получаешь таблицу по поставщикам и суммам.
(5) Но все зависит от того, что нужно сделать в принципе. Если просто свернуть по поставщику суммы (чтобы был один поставщик и одна общая сумма этого поставщика), то существует такая штука, как таблица значений и метод "Свернуть".
Массив.Добавить(Новый Структура("Поставщик, Сумма", Строка.Поставщик, Строка.Сумма));
(10) как то так Причем все это выполняется на сервере. Таблица значений на клиенте недоступна. ЗЫ Копия, возможно, и ни к чему.
ТЗДок = Объект.Товары.Выгрузить();
Копия = ТЗДок.Скопировать();
Копия.Свернуть("Номенклатура", "Количество");
Объект.Номенклатура.Очистить();
Для Каждого Строка Из Копия Цикл
ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(), Строка);
КонецЦикла;
ЭтотОбъект.Записать();
Показать
Делай через соответствие. Тогда на сервер бегать не придется.
Соответствие = Новый Соответствие;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
ТекЗначение = Соответствие[СтрокаТЧ.Поставщик];
Соответствие[СтрокаТЧ.Поставщик] = ?(ТекЗначение=Неопределено,0,ТекЗначение)+СтрокаТЧ.Сумма;
КонецЦикла;
Для каждого КлючЗначение Из Соответствие Цикл
НовСтр = Докум.Объект.Товары.Добавить();
НовСтр.Поставщик = КлючЗначение.Ключ;
НовСтр.СуммаОтПоставщика = КлючЗначение.Значение;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) А не проще сделать так:
И получаешь таблицу по поставщикам и суммам.
ТаблицаТоваров = Объект.Товары.Выгрузить();
ТаблицаТоваров.Свернуть("Поставщик","Сумма");
Объект.Товары.Загрузить(ТаблицаТоваров);
И получаешь таблицу по поставщикам и суммам.
(7) Спасибо огромное. А как мне ее свернуть на сервере и затем передать на клиента? У меня на клиенте по кнопке открывается форма обработки. Пробую получить объект обработки на сервере так:
но вылетает ошибка "интерактивные операции недоступны"
код на клиенте
ВыгрузкаТБ = Объект.Товары.Выгрузить();
ВыгрузкаТБ.Свернуть("Поставщик");
ЗагрузкаКоэффициентов = Обработки.ЗагрузкаКоэффициентТранспорта.ПолучитьФорму("Форма");
но вылетает ошибка "интерактивные операции недоступны"
код на клиенте
ТЗ = РассчетПослеНаСервере();
Сообщить(ТЗ);
(10) как то так Причем все это выполняется на сервере. Таблица значений на клиенте недоступна. ЗЫ Копия, возможно, и ни к чему.
ТЗДок = Объект.Товары.Выгрузить();
Копия = ТЗДок.Скопировать();
Копия.Свернуть("Номенклатура", "Количество");
Объект.Номенклатура.Очистить();
Для Каждого Строка Из Копия Цикл
ЗаполнитьЗначенияСвойств(Объект.Товары.Добавить(), Строка);
КонецЦикла;
ЭтотОбъект.Записать();
Показать
(11)Да, метод свернуть ничего не возвращает(. А к форме обработки которая находиться в самой конфигурации, в этом же коде можно обратиться? форму получить не даёт.
"У меня в обработке форма с табличной частью "Товары" а кнопка вызова этой обработки в документе находиться. По нажатию этой кнопки должна свернуться табличная часть из документа и перенестись в обработку"
"У меня в обработке форма с табличной частью "Товары" а кнопка вызова этой обработки в документе находиться. По нажатию этой кнопки должна свернуться табличная часть из документа и перенестись в обработку"
(5) Но все зависит от того, что нужно сделать в принципе. Если просто свернуть по поставщику суммы (чтобы был один поставщик и одна общая сумма этого поставщика), то существует такая штука, как таблица значений и метод "Свернуть".
Массив.Добавить(Новый Структура("Поставщик, Сумма", Строка.Поставщик, Строка.Сумма));
Делай через соответствие. Тогда на сервер бегать не придется.
Соответствие = Новый Соответствие;
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
ТекЗначение = Соответствие[СтрокаТЧ.Поставщик];
Соответствие[СтрокаТЧ.Поставщик] = ?(ТекЗначение=Неопределено,0,ТекЗначение)+СтрокаТЧ.Сумма;
КонецЦикла;
Для каждого КлючЗначение Из Соответствие Цикл
НовСтр = Докум.Объект.Товары.Добавить();
НовСтр.Поставщик = КлючЗначение.Ключ;
НовСтр.СуммаОтПоставщика = КлючЗначение.Значение;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот