Имя: Пароль:
1C
1С v8
Как посчитать итоги по колонке с учетом фильтра в тч документа
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) может ему за код платят чем больше тем лучше

интересно по антиплагиату проверяют?