![]() |
|
Как посчитать итоги по колонке с учетом фильтра в тч документа | ☑ | ||
---|---|---|---|---|
0
aptomilov
18.08.23
✎
13:17
|
Есть УПП последний релиз
есть документ где в табличную часть добавлены расчетные колонки, которые не являются реквизитом документа Обычно у колонки есть свойство считать итоги и они считаются с учетом фильтров в тч выставляемых пользователем. Вот вопрос каким макаром считать итоги в добавленных колонках? |
|||
1
RomanYS
18.08.23
✎
13:21
|
(0) цикл и ПроверитьСтроку
|
|||
2
Garykom
18.08.23
✎
13:23
|
(1) зачем?
выгрузить в ТЗ с фильтром же можно |
|||
3
RomanYS
18.08.23
✎
13:25
|
(2) Можно и так, только
1. фильтры ещё нужно считать как-то 2. в ТЗ всё равно не будет колонок, "которые не являются реквизитом документа" |
|||
4
RomanYS
18.08.23
✎
13:27
|
*(3)
1+. Фильтр может быть сложным (в списке, в группе, содержит....), Выгрузить() такое не поддерживает |
|||
5
aptomilov
18.08.23
✎
15:04
|
НАШЕЛ НА ПРОСТОРАХ ИНЕТА МОЖЕТ КОМУ ПОНЯДОБИТЬСЯ
Вот сама функция (сложного ничего, но все ж может кому сэкономит полчаса времени): // имена отборов должны совпадать с колонками табличной части // не обрабатываются отборы с видом сравнения "Иерархия" // ТекущийЭлементФормы - ТабличноеПоле, в котором анализируются отборы // ТабличнаяЧасть - табличная часть документа или таблица значений, с которой связан ТекущийЭлементФормы // Функция возвращает массив строк табличной части, удовлетворяющих установленным отборам Функция ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборам(ТабличнаяЧасть, ТекущийЭлементФормы) СтруктураОтбора = Новый Структура; // заполним СтруктуруОтбора согласно отборам с ВидСравнения.Равно Для каждого ЭлементОтбора из ТекущийЭлементФормы.ОтборСтрок Цикл Если ЭлементОтбора.Использование И ЭлементОтбора.ВидСравнения = ВидСравнения.Равно Тогда СтруктураОтбора.Вставить(ЭлементОтбора.Имя, ЭлементОтбора.Значение); КонецЕсли; КонецЦикла; // получим массив строк табличной части, соответствующих отборам с ВидСравнения.Равно МассивНайденныхСтрок = ТабличнаяЧасть.НайтиСтроки(СтруктураОтбора); // объявим массив, в который будем записывать номера строк МассивНайденныхСтрок, которые не удовлетворяют отбору МассивНомераУдаляемыхСтрок = Новый Массив; // Обходим остальные отборы с Не ВидСравнения.Равно и исключаем из массива строки, которые не устраивают отбору Для каждого Строка из МассивНайденныхСтрок Цикл УдалитьСтроку = Ложь; Для каждого ЭлементОтбора из ТекущийЭлементФормы.ОтборСтрок Цикл // прекращаем обработку текущего элемента, если не установлено его использование Если Не ЭлементОтбора.Использование Тогда Продолжить КонецЕсли; //Обработаем ВидСравнения.НеРавно Если ЭлементОтбора.ВидСравнения = ВидСравнения.НеРавно Тогда Если Не(Строка[ЭлементОтбора.Имя] <> ЭлементОтбора.Значение) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.ВСписке Если ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке Тогда ЭлементНайденВСписке = Ложь; Для каждого ЭлементСписка из ЭлементОтбора.Значение Цикл Если Строка[ЭлементОтбора.Имя] = ЭлементСписка.Значение Тогда ЭлементНайденВСписке = Истина; Прервать; КонецЕсли; КонецЦикла; Если Не ЭлементНайденВСписке Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.НеВСписке Если ЭлементОтбора.ВидСравнения = ВидСравнения.НеВСписке Тогда ЭлементНайденВСписке = Ложь; Для каждого ЭлементСписка из ЭлементОтбора.Значение Цикл Если Строка[ЭлементОтбора.Имя] = ЭлементСписка.Значение Тогда ЭлементНайденВСписке = Истина; Прервать; КонецЕсли; КонецЦикла; Если ЭлементНайденВСписке Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.Содержит Если ЭлементОтбора.ВидСравнения = ВидСравнения.Содержит Тогда Если Не(Найти(Строка[ЭлементОтбора.Имя], ЭлементОтбора.Значение) > 0) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.НеСодержит Если ЭлементОтбора.ВидСравнения = ВидСравнения.НеСодержит Тогда Если Не (Найти(Строка[ЭлементОтбора.Имя], ЭлементОтбора.Значение) = 0) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.Меньше Если ЭлементОтбора.ВидСравнения = ВидСравнения.Меньше Тогда Если Не (Строка[ЭлементОтбора.Имя] < ЭлементОтбора.Значение) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.МеньшеИлиРавно Если ЭлементОтбора.ВидСравнения = ВидСравнения.МеньшеИлиРавно Тогда Если Не (Строка[ЭлементОтбора.Имя] <= ЭлементОтбора.Значение) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.Больше Если ЭлементОтбора.ВидСравнения = ВидСравнения.Больше Тогда Если Не (Строка[ЭлементОтбора.Имя] > ЭлементОтбора.Значение) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.БольшеИлиРавно Если ЭлементОтбора.ВидСравнения = ВидСравнения.БольшеИлиРавно Тогда Если Не (Строка[ЭлементОтбора.Имя] >= ЭлементОтбора.Значение) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.Интервал Если ЭлементОтбора.ВидСравнения = ВидСравнения.Интервал Тогда Если Не (Строка[ЭлементОтбора.Имя] > ЭлементОтбора.ЗначениеС И Строка[ЭлементОтбора.Имя] < ЭлементОтбора.ЗначениеПо) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.ИнтервалВключаяГраницы Если ЭлементОтбора.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы Тогда Если Не (Строка[ЭлементОтбора.Имя] >= ЭлементОтбора.ЗначениеС И Строка[ЭлементОтбора.Имя] <= ЭлементОтбора.ЗначениеПо) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.ИнтервалВключаяНачало Если ЭлементОтбора.ВидСравнения = ВидСравнения.ИнтервалВключаяНачало Тогда Если Не (Строка[ЭлементОтбора.Имя] >= ЭлементОтбора.ЗначениеС И Строка[ЭлементОтбора.Имя] < ЭлементОтбора.ЗначениеПо) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; //Обработаем ВидСравнения.ИнтервалВключаяОкончание Если ЭлементОтбора.ВидСравнения = ВидСравнения.ИнтервалВключаяОкончание Тогда Если Не (Строка[ЭлементОтбора.Имя] > ЭлементОтбора.ЗначениеС И Строка[ЭлементОтбора.Имя] <= ЭлементОтбора.ЗначениеПо) Тогда УдалитьСтроку = Истина; Перейти ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; ~ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборамКонецЦикла: // удаляем текущую строку из массива, если она не удовлетворила одному из условий Если УдалитьСтроку Тогда МассивНомераУдаляемыхСтрок.Добавить(Строка.НомерСтроки); КонецЕсли; КонецЦикла; // Удалим из МассивНайденныхСтрок строки, номера которых занесены в массив МассивНомеровСтрокДляУдаления Для Индекс = 0 По МассивНайденныхСтрок.Количество() Цикл // условие необходимо, так как в цикле происходит удаление элементов массива Если Индекс > (МассивНайденныхСтрок.Количество() - 1) Тогда прервать КонецЕсли; ТекущаяСтрока = МассивНайденныхСтрок[Индекс]; // Если номер текущей строки массива МассивНайденныхСтрок присутствует в массиве // МассивНомераУдаляемыхСтрок, то удаляем эту строку Если МассивНомераУдаляемыхСтрок.Найти(ТекущаяСтрока.НомерСтроки) <> Неопределено Тогда МассивНайденныхСтрок.Удалить(Индекс); // так как произошло удаление строки, то декрементируем индекс чтоб не произошло перескакивание через один элемент массива Индекс = Индекс - 1; КонецЕсли; КонецЦикла; Возврат МассивНайденныхСтрок; КонецФункции // ПолучитьМассивСтрокТабличнойЧастиПоТекущимОтборам() |
|||
6
RomanYS
18.08.23
✎
15:22
|
(5) ппц, это делается в 5 строчек с помощью (1)
|
|||
7
Garykom
18.08.23
✎
16:46
|
(6) может ему за код платят чем больше тем лучше
интересно по антиплагиату проверяют? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |