1 С программирование

1. VKuser10243732 13.10.18 08:55 Сейчас в теме
Всем Добрый день! Столкнулся с такой задачей, помогите решить. Есть табличное поле на форме документа, состоящее из 2 табличных частей: "ПереченьНоменклатуры" и "Материалы".
На вкладке "Материал" при выделении строки программно фильтруется отбор по значению в строке колонки "Материал" (при нажатии на кнопку Команда 1). В колонке "Количество" должна суммироваться сумма значений отобранных, выделенных строк. У меня не выводит сумму всех выделенных строк. Как реализовать, чтоб суммировались только выделенные строки?
Вот код:

СтрокаТЧ=Элементы.ПереченьНоменклатуры.ТекущиеДанные;
       СтрокаТабличнойЧасти=Элементы.Материалы.ТекущиеДанные;

       // установим отбор (фильтр)
      ФМ=Новый ФиксированнаяСтруктура("Материал",Элементы.Материалы.ТекущиеДанные.Материал);
      Элементы.Материалы.ОтборСтрок=ФМ;

       // Выделим строки
      Для каждого стр из Объект.Материалы Цикл
      Элементы.Материалы.ВыделенныеСтроки.Добавить(стр.НомерСтроки-1);

      // Получим список выделенных строк
        ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки; 
        Сумма = 0; 
 
        // Обойдем строки и посчитаем сумму
        // здесь и возникает проблема

         Для Каждого Строка Из ВыделенныеСтроки Цикл
         Сумма=Элементы.Материалы.ДанныеСтроки(Строка).Количество;
         СтрокаТЧ.Количество = Сумма;

     КонецЦикла;
КонецЦикла;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. qazaas 13.10.18 09:10 Сейчас в теме
(1) Зачем ты в том же цикле, в котором выделяешь строки пытаешься что-то просуммировать? Суммируй после того, как выделишь.

Для каждого стр из Объект.Материалы Цикл 
Элементы.Материалы.ВыделенныеСтроки.Добавить(стр.НомерСтроки-1); 
КонецЦикла;

ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки; 
Сумма = 0; 

Для Каждого Строка Из ВыделенныеСтроки Цикл 
Сумма = Сумма  + Элементы.Материалы.ДанныеСтроки(Строка).Количество; 
СтрокаТЧ.Количество = Сумма; 
КонецЦикла;
 
Показать
3. qazaas 13.10.18 09:12 Сейчас в теме
(2) Upd: а еще ты просто затирал свою сумму каждой следующей итерацией цикла.

Я подправил в коде выше.
19. пользователь 14.10.18 23:22
Сообщение было скрыто модератором.
...
4. acanta 13.10.18 09:50 Сейчас в теме
строки выделять вручную в одной табличной части выборочно с нажатым контролом и в другую табличную часть показывать итоги по каждому материалу? Можно и так. Тогда в итоговой таблице должно быть по каждому материалу два количества - всего и сколько выделено. И контролом удобно когда сплошное и немного, а когда много и разных то во первых цветом разделять, а во вторых галочками ентером надёжнее.
5. VKuser10243732 13.10.18 17:46 Сейчас в теме
Теперь считает, но когда отобранной получилась только одна строка, сумма задваивается. То есть, если в строке "Количество" было 6, то в итоге оно выдаёт 12. Пытаюсь задать условие типа

Если Объект.Материалы.Количество()=1 Тогда
СтрокаТЧ.Количество=СтрокаТабличнойЧасти.Количество;


но не работает.
6. user705522_constantin_h 35 13.10.18 19:32 Сейчас в теме
(5)Вы выделенные строки добавляете. Перед этим выделение следовало бы очистить.
7. VKuser10243732 13.10.18 22:32 Сейчас в теме
(6) Каким образом? Если я убираю выделение строк, то вообще считается сумма некорректно.
8. user705522_constantin_h 35 13.10.18 22:46 Сейчас в теме
(7)Может так:

СтрокаТЧ=Элементы.ПереченьНоменклатуры.ТекущиеДанные; 
СтрокаТабличнойЧасти=Элементы.Материалы.ТекущиеДанные; 

// установим отбор (фильтр) 
ФМ=Новый ФиксированнаяСтруктура("Материал",Элементы.Материалы.ТекущиеДанные.Материал); 
Элементы.Материалы.ОтборСтрок=ФМ; 

//Очистим выделение
Элементы.Материалы.ВыделенныеСтроки.Очистить();
// Выделим строки 
Для каждого стр из Объект.Материалы Цикл 
    Элементы.Материалы.ВыделенныеСтроки.Добавить(стр.НомерСтроки-1); 

КонецЦикла; 

// Получим список выделенных строк 
ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки; 
Сумма = 0; 

// Обойдем строки и посчитаем сумму 
// здесь и возникает проблема 

Для Каждого Строка Из ВыделенныеСтроки Цикл 
     Сумма=Элементы.Материалы.ДанныеСтроки(Строка).Количество; 
КонецЦикла; 

СтрокаТЧ.Количество = Сумма; 
Показать
11. VKuser10243732 14.10.18 11:59 Сейчас в теме
(8) (9) (10) Ребят, пробую уже по всякому. Всё-равно не считает правильно, если отобрана одна строка.
12. spacecraft 14.10.18 12:39 Сейчас в теме
(11) Вот так должно считать правильно:
ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки;
Сумма = 0;
Если ВыделенныеСтроки.Количество() > 0 Тогда
	Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
		МатериалСтрока = Объект.Материалы.НайтиПоИдентификатору(ВыделеннаяСтрока);
		Сумма = Сумма + ?(МатериалСтрока = Неопределено, 0, МатериалСтрока.Сумма);
	КонецЦикла;
КонецЕсли;
СуммаМатериалов = Сумма;
Показать
9. acanta 13.10.18 22:57 Сейчас в теме
Процедура ОбновлениеОтображения()
	МассивСтрок = ЭлементыФормы.Документы.ВыделенныеСтроки;
	Сумма = 0;
	Для каждого Эл из МассивСтрок Цикл
		Сумма = Сумма + Эл.Количество;
	КонецЦикла;
	ЭлементыФормы.НадписьИтого.Заголовок = ""+Сумма;
КонецПроцедуры

Процедура ДокументыПриАктивизацииЯчейки(Элемент)
	ОбновлениеОтображения();
	// Вставить содержимое обработчика.
КонецПроцедуры
Показать


Мой пример рабочего кода, выделение вручную, обычная форма.
В задаче стоит только выделить часть строк по фильтру или отобрать по фильтру и выделить все которые видимы?
18. VKuser10243732 14.10.18 19:10 Сейчас в теме
(9) В задаче стоит вычислить общую сумму по отобранным строкам, не зависимо от того, выделены они или нет.
22. herfis 499 16.10.18 15:22 Сейчас в теме
(18)
        
СуммаПоОтбору = 0;
Для Каждого СтрокаМатериала Из Объект.Материалы Цикл
     Если Элементы.Материалы.ПроверитьСтроку(СтрокаМатериала.ПолучитьИдентификатор()) Тогда
          СуммаПоОтбору =  СуммаПоОтбору + СтрокаМатериала.Сумма;
     КонецЕсли;
КонецЦикла;
10. acanta 13.10.18 23:23 Сейчас в теме
	
        ВыбратьДокументыПоОтборуНаСервере();
	МассивСтрок = Элементы.Документы.ВыделенныеСтроки;
	Для каждого Эл Из Объект.Документы Цикл 
		Если Эл.Количество>1 Тогда
			МассивСтрок.Добавить(Эл.ПолучитьИдентификатор());
		КонецЕсли;
	КонецЦикла
Показать


Пример программного выделения части строк, управляемая форма.
13. acanta 14.10.18 12:48 Сейчас в теме
Вопрос в том, если контрол не нажимали, то есть ли вообще что то в выделенных строках при перемещении по списку стрелками без нажатого контрол. Возможно, строка отмечена как текущая, но она не выделена, в массиве ее нет и визуально эти варианты не отличаются.
14. lefthander 14.10.18 13:05 Сейчас в теме
Всем привет, вот как я реализовал в одной из обработок. есть динамический список документов, при выделении некоторого количества строк высчитывается сумма выделенных документов и выводится на форму в поле СуммаДокументов и суммаДокументовНДС


&НаКлиенте
Процедура РеализацииСписокПриАктивизацииСтроки(Элемент)
	
	ИнтервалОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 1, 0.2);
	ПодключитьОбработчикОжидания("Подключаемый_РезультатПриАктивизацииОбластиПодключаемый", ИнтервалОжидания, Истина);
	
КонецПроцедуры

&НаСервере
Функция ПолучитьСумму(Стр)
	Об = Стр.ПолучитьОбъект();
	Попытка
		Возврат Об.СуммаДокумента;
	Исключение
	КонецПопытки;
	
КонецФункции	


&НаКлиенте
Процедура Подключаемый_РезультатПриАктивизацииОбластиПодключаемый()
	
	Выделено = Элементы.РеализацииСписок.ВыделенныеСтроки;
	СуммаДок = 0;
	Для Каждого Стр Из Выделено Цикл
		
		СуммаДок = СуммаДок + ПолучитьСумму(Стр);
		
	КонецЦикла;
	СуммаДокументов = СуммаДок;
	ПроцНДС = 18;
	СуммаДокументовНДС = РассчитатьСуммуНДС(СуммаДокументов, Истина, ПроцНДС);
	
	
	ОтключитьОбработчикОжидания("Подключаемый_РезультатПриАктивизацииОбластиПодключаемый");
	
КонецПроцедуры


Показать

Как то так. Не уверен что код весь мой, возможно где то подсмотрел, но идея должна быть понятна
16. spacecraft 14.10.18 13:32 Сейчас в теме
(14) хмм. серверные вызовы и запрос в цикле...
24. lefthander 18.10.18 23:16 Сейчас в теме
(16)можете не использовать серверные вызовы и запросы в цикле... :)
21. alex-l19041 8 16.10.18 15:09 Сейчас в теме
(14)
Об = Стр.ПолучитьОбъект();
Попытка
Возврат Об.СуммаДокумента;
Исключение
КонецПопытки;
-


Стр.ПолучитьОбъект() - лишнее...

а Попытка для того случая, что не во всех документах есть СуммаДокумента...
тогда надо добавить

Попытка
        Возврат Стр.СуммаДокумента;
    Исключение
     Возврат 0
    КонецПопытки
23. lefthander 18.10.18 23:13 Сейчас в теме
(21)нет конечно, так как это список определенных документов, то сумма документа есть во всех, и она по определению может быть равна 0 или не равна.
26. alex-l19041 8 19.10.18 08:36 Сейчас в теме
(23) тогда Попытка не нужна....
27. lefthander 19.10.18 22:05 Сейчас в теме
(26)Согласен, говорю же подсмотрел где то, и там что то еще было... мне не нужное, а попытка осталась...
15. acanta 14.10.18 13:15 Сейчас в теме
А запрос будет хуже? Обычные или управляемые формы? В массиве ссылки или коллекция строк? Я пыталась тоже самое на форме регистра сведений, не подходит.
17. acanta 14.10.18 15:40 Сейчас в теме
Ок, как на клиенте получить содержимое колонок, без обращения к серверу? Мы их видим в форме списка или табличной части, а программа получается нет.
Есть идентификатор строки, возможно по идентификатору как то можно?
25. lefthander 18.10.18 23:19 Сейчас в теме
(17)На клиенте в форме вы видите представление данных (форма управляемая) а для манипулирования данными их нужно получить из объекта, а объект на сервере.
20. пользователь 14.10.18 23:32
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

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