Внешняя обработка. Свертка строк табличной части.
Не соображу, как во внешней обработке организовать свертку строк табличной части в документе инвентаризации в БП 3.0..
Запутался совсем в "НаСервере/НаКлиенте", то там ругается, то тут..
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПОбъект) Экспорт
ТЗ = ВладелецФормы.Объект.Товары;
ПеречитатьТаблЧастьНаСервере(ТЗ);
КонецПроцедуры
&НаСервере
Процедура ПеречитатьТаблЧастьНаСервере(ТЗ)
ТЗ.Выгрузить();
ТЗ.Свернуть("ТоварыНоменклатураАртикул, ТоварыНоменклатура", "Количество, Сумма, Всего");
ВладелецФормы.Объект.Товары.Загрузить(ТЗ);
КонецПроцедуры
ПоказатьЗапутался совсем в "НаСервере/НаКлиенте", то там ругается, то тут..
Прикрепленные файлы:
РАНЖ_инвентаризация_удаление_строк_3.epf
По теме из базы знаний
Найденные решения
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПОбъект) Экспорт
Для каждого ТекущаяСтрока из ВладелецФормы.Объект.Товары Цикл
СтруктураДляПоиска = Новый Структура;
СтруктураДляПоиска.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
СтруктураДляПоиска.Вставить("Артикул", ТекущаяСтрока.Артикул);
МассивСтрок = ВладелецФормы.Объект.Товары.НайтиСтроки(СтруктураДляПоиска);
Количество = 0;
ПерваяСтрока = Истина;
Для каждого Строка Из МассивСтрок Цикл
Количество = Количество + Строка.Количество;
Если Не ПерваяСтрока Тогда
ВладелецФормы.Объект.Товары.Удалить(Строка);
Сообщить("Сгруппирована номенклатура " + ТекущаяСтрока.Номенклатура);
КонецЕсли;
ПерваяСтрока = Ложь;
КонецЦикла;
ТекущаяСтрока.Количество = Количество;
КонецЦикла;
КонецПроцедуры
ПоказатьВсё оказалось куда проще.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
1. Таблицу значений с клиента на сервер гнать нельзя
Она вообще на клиенте не существует (только как реквизит т.е. данные формы)
Нужно использовать: ДанныеФормыВЗначение, РеквизитФормыВЗначение, КопироватьДанныеФормы и обратные к ним
2. Не совсем понятно почему в дополнительной обработке использовано использование "ВызовКлиентскогоМетода"
Здесь вроде бы форму обработки открывать не нужно, наверное можно использовать вызов серверного. Иначе в комеаде нужно Использование = "ОткрытиеФормы"
Она вообще на клиенте не существует (только как реквизит т.е. данные формы)
Нужно использовать: ДанныеФормыВЗначение, РеквизитФормыВЗначение, КопироватьДанныеФормы и обратные к ним
2. Не совсем понятно почему в дополнительной обработке использовано использование "ВызовКлиентскогоМетода"
ДобавитьКоманду(ТаблицаКоманд, "Удалить строки", "Удалить строки", "ВызовКлиентскогоМетода", Истина);
Здесь вроде бы форму обработки открывать не нужно, наверное можно использовать вызов серверного. Иначе в комеаде нужно Использование = "ОткрытиеФормы"
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПОбъект) Экспорт
Для каждого ТекущаяСтрока из ВладелецФормы.Объект.Товары Цикл
СтруктураДляПоиска = Новый Структура;
СтруктураДляПоиска.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
СтруктураДляПоиска.Вставить("Артикул", ТекущаяСтрока.Артикул);
МассивСтрок = ВладелецФормы.Объект.Товары.НайтиСтроки(СтруктураДляПоиска);
Количество = 0;
ПерваяСтрока = Истина;
Для каждого Строка Из МассивСтрок Цикл
Количество = Количество + Строка.Количество;
Если Не ПерваяСтрока Тогда
ВладелецФормы.Объект.Товары.Удалить(Строка);
Сообщить("Сгруппирована номенклатура " + ТекущаяСтрока.Номенклатура);
КонецЕсли;
ПерваяСтрока = Ложь;
КонецЦикла;
ТекущаяСтрока.Количество = Количество;
КонецЦикла;
КонецПроцедуры
ПоказатьВсё оказалось куда проще.
(3) Еще можно было сделать так:
А вообще в данном случае лучше было использовать ВызовСерверногоМетода, если конечно вы не захотите добавить, например, вопрос пользователю.
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПОбъект) Экспорт
ЗаполнитьДанными(ПОбъект[0]);
ОбъектСсылка = ВыполнитьКомандуНаСервере();
ПараметрыДок = Новый Структура("Ключ",ОбъектСсылка);
ФормаДок = ПолучитьФорму("Документ.НужныйНамДокумент.Форма.ФормаДокумента",ПараметрыДок);
ФормаДок.Прочитать(); //Возможно, что обновить данные на форме можно каким-то другим способом, но я его не знаю)
КонецПроцедуры
Процедура ЗаполнитьДанными(ОбъектНазначения)
НашДокумент = ОбъектНазначения; //НашДокумент - реквизит на форме
КонецПроцедуры
Процедура ВыполнитьКомандуНаСервере()
НашДокументОбъект = НашДокумент.ПолучитьОбъект();
ТЗ = НашДокументОбъект .Товары.Выгрузить();
ТЗ.Свернуть("ТоварыНоменклатураАртикул, ТоварыНоменклатура", "Количество, Сумма, Всего");
НашДокументОбъект.Товары.Загрузить(ТЗ);
Возврат НашДокументОбъект.Ссылка;
КонецПроцедуры
ПоказатьА вообще в данном случае лучше было использовать ВызовСерверногоМетода, если конечно вы не захотите добавить, например, вопрос пользователю.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот