Всем Добрый день! Столкнулся с такой задачей, помогите решить. Есть табличное поле на форме документа, состоящее из 2 табличных частей: "ПереченьНоменклатуры" и "Материалы".
На вкладке "Материал" при выделении строки программно фильтруется отбор по значению в строке колонки "Материал" (при нажатии на кнопку Команда 1). В колонке "Количество" должна суммироваться сумма значений отобранных, выделенных строк. У меня не выводит сумму всех выделенных строк. Как реализовать, чтоб суммировались только выделенные строки?
Вот код:
На вкладке "Материал" при выделении строки программно фильтруется отбор по значению в строке колонки "Материал" (при нажатии на кнопку Команда 1). В колонке "Количество" должна суммироваться сумма значений отобранных, выделенных строк. У меня не выводит сумму всех выделенных строк. Как реализовать, чтоб суммировались только выделенные строки?
Вот код:
СтрокаТЧ=Элементы.ПереченьНоменклатуры.ТекущиеДанные;
СтрокаТабличнойЧасти=Элементы.Материалы.ТекущиеДанные;
// установим отбор (фильтр)
ФМ=Новый ФиксированнаяСтруктура("Материал",Элементы.Материалы.ТекущиеДанные.Материал);
Элементы.Материалы.ОтборСтрок=ФМ;
// Выделим строки
Для каждого стр из Объект.Материалы Цикл
Элементы.Материалы.ВыделенныеСтроки.Добавить(стр.НомерСтроки-1);
// Получим список выделенных строк
ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки;
Сумма = 0;
// Обойдем строки и посчитаем сумму
// здесь и возникает проблема
Для Каждого Строка Из ВыделенныеСтроки Цикл
Сумма=Элементы.Материалы.ДанныеСтроки(Строка).Количество;
СтрокаТЧ.Количество = Сумма;
КонецЦикла;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Ректальное программирование: основы для практикующих 1С-программистов
- Роберт Мартин: "Будущее программирования" / Robert Martin: "The Future of Programming"
- Визионное программирование
- Платформа для решения задач по программированию на языке 1С
- Практическое программирование: когда скорость важнее совершенства
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Зачем ты в том же цикле, в котором выделяешь строки пытаешься что-то просуммировать? Суммируй после того, как выделишь.
Для каждого стр из Объект.Материалы Цикл
Элементы.Материалы.ВыделенныеСтроки.Добавить(стр.НомерСтроки-1);
КонецЦикла;
ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки;
Сумма = 0;
Для Каждого Строка Из ВыделенныеСтроки Цикл
Сумма = Сумма + Элементы.Материалы.ДанныеСтроки(Строка).Количество;
СтрокаТЧ.Количество = Сумма;
КонецЦикла;
Показать
строки выделять вручную в одной табличной части выборочно с нажатым контролом и в другую табличную часть показывать итоги по каждому материалу? Можно и так. Тогда в итоговой таблице должно быть по каждому материалу два количества - всего и сколько выделено. И контролом удобно когда сплошное и немного, а когда много и разных то во первых цветом разделять, а во вторых галочками ентером надёжнее.
Теперь считает, но когда отобранной получилась только одна строка, сумма задваивается. То есть, если в строке "Количество" было 6, то в итоге оно выдаёт 12. Пытаюсь задать условие типа
Если Объект.Материалы.Количество()=1 Тогда
СтрокаТЧ.Количество=СтрокаТабличнойЧасти.Количество;
но не работает.
Если Объект.Материалы.Количество()=1 Тогда
СтрокаТЧ.Количество=СтрокаТабличнойЧасти.Количество;
но не работает.
(7)Может так:
СтрокаТЧ=Элементы.ПереченьНоменклатуры.ТекущиеДанные;
СтрокаТабличнойЧасти=Элементы.Материалы.ТекущиеДанные;
// установим отбор (фильтр)
ФМ=Новый ФиксированнаяСтруктура("Материал",Элементы.Материалы.ТекущиеДанные.Материал);
Элементы.Материалы.ОтборСтрок=ФМ;
//Очистим выделение
Элементы.Материалы.ВыделенныеСтроки.Очистить();
// Выделим строки
Для каждого стр из Объект.Материалы Цикл
Элементы.Материалы.ВыделенныеСтроки.Добавить(стр.НомерСтроки-1);
КонецЦикла;
// Получим список выделенных строк
ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки;
Сумма = 0;
// Обойдем строки и посчитаем сумму
// здесь и возникает проблема
Для Каждого Строка Из ВыделенныеСтроки Цикл
Сумма=Элементы.Материалы.ДанныеСтроки(Строка).Количество;
КонецЦикла;
СтрокаТЧ.Количество = Сумма;
Показать
(11) Вот так должно считать правильно:
ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки;
Сумма = 0;
Если ВыделенныеСтроки.Количество() > 0 Тогда
Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
МатериалСтрока = Объект.Материалы.НайтиПоИдентификатору(ВыделеннаяСтрока);
Сумма = Сумма + ?(МатериалСтрока = Неопределено, 0, МатериалСтрока.Сумма);
КонецЦикла;
КонецЕсли;
СуммаМатериалов = Сумма;
Показать
Процедура ОбновлениеОтображения()
МассивСтрок = ЭлементыФормы.Документы.ВыделенныеСтроки;
Сумма = 0;
Для каждого Эл из МассивСтрок Цикл
Сумма = Сумма + Эл.Количество;
КонецЦикла;
ЭлементыФормы.НадписьИтого.Заголовок = ""+Сумма;
КонецПроцедуры
Процедура ДокументыПриАктивизацииЯчейки(Элемент)
ОбновлениеОтображения();
// Вставить содержимое обработчика.
КонецПроцедуры
ПоказатьМой пример рабочего кода, выделение вручную, обычная форма.
В задаче стоит только выделить часть строк по фильтру или отобрать по фильтру и выделить все которые видимы?
ВыбратьДокументыПоОтборуНаСервере();
МассивСтрок = Элементы.Документы.ВыделенныеСтроки;
Для каждого Эл Из Объект.Документы Цикл
Если Эл.Количество>1 Тогда
МассивСтрок.Добавить(Эл.ПолучитьИдентификатор());
КонецЕсли;
КонецЦикла
ПоказатьПример программного выделения части строк, управляемая форма.
Вопрос в том, если контрол не нажимали, то есть ли вообще что то в выделенных строках при перемещении по списку стрелками без нажатого контрол. Возможно, строка отмечена как текущая, но она не выделена, в массиве ее нет и визуально эти варианты не отличаются.
Всем привет, вот как я реализовал в одной из обработок. есть динамический список документов, при выделении некоторого количества строк высчитывается сумма выделенных документов и выводится на форму в поле СуммаДокументов и суммаДокументовНДС
Как то так. Не уверен что код весь мой, возможно где то подсмотрел, но идея должна быть понятна
&НаКлиенте
Процедура РеализацииСписокПриАктивизацииСтроки(Элемент)
ИнтервалОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 1, 0.2);
ПодключитьОбработчикОжидания("Подключаемый_РезультатПриАктивизацииОбластиПодключаемый", ИнтервалОжидания, Истина);
КонецПроцедуры
&НаСервере
Функция ПолучитьСумму(Стр)
Об = Стр.ПолучитьОбъект();
Попытка
Возврат Об.СуммаДокумента;
Исключение
КонецПопытки;
КонецФункции
&НаКлиенте
Процедура Подключаемый_РезультатПриАктивизацииОбластиПодключаемый()
Выделено = Элементы.РеализацииСписок.ВыделенныеСтроки;
СуммаДок = 0;
Для Каждого Стр Из Выделено Цикл
СуммаДок = СуммаДок + ПолучитьСумму(Стр);
КонецЦикла;
СуммаДокументов = СуммаДок;
ПроцНДС = 18;
СуммаДокументовНДС = РассчитатьСуммуНДС(СуммаДокументов, Истина, ПроцНДС);
ОтключитьОбработчикОжидания("Подключаемый_РезультатПриАктивизацииОбластиПодключаемый");
КонецПроцедуры
ПоказатьКак то так. Не уверен что код весь мой, возможно где то подсмотрел, но идея должна быть понятна
(14)
Стр.ПолучитьОбъект() - лишнее...
а Попытка для того случая, что не во всех документах есть СуммаДокумента...
тогда надо добавить
Об = Стр.ПолучитьОбъект();
Попытка
Возврат Об.СуммаДокумента;
Исключение
КонецПопытки;
-
Попытка
Возврат Об.СуммаДокумента;
Исключение
КонецПопытки;
Стр.ПолучитьОбъект() - лишнее...
а Попытка для того случая, что не во всех документах есть СуммаДокумента...
тогда надо добавить
Попытка
Возврат Стр.СуммаДокумента;
Исключение
Возврат 0
КонецПопытки
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот