Как посчитать итог по количеству в табличной части 1С, исключая услуги и определенные позиции?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке документов в системе 1С часто возникает задача вывода итоговых показателей в табличной части. Стандартный механизм "Отображать итоги в подвале" суммирует все значения в колонке без разбора. Однако на практике часто требуется исключить из расчета определенные строки, например, услуги, тару или специфические артикулы. Рассмотрим подробнее, как реализовать выборочный расчет итогов различными способами.

Метод 1. Программный расчет через перебор строк (Цикл)

Это самый прямолинейный способ, который подходит для реализации логики в любой версии платформы. Мы проанализируем каждую строку табличной части, проверим условие и, если оно выполняется, прибавим значение к общей сумме. Разберем пример кода, который решает задачу автора темы:


// Инициализируем переменную для накопления итога
ПеременнаяИтогоКоличество = 0;

// Запускаем цикл по всей табличной части "Товары"
Для каждого СтрокаТЧ Из Товары Цикл
    
    // Проверяем тип данных или конкретное условие
    // Например, нам нужны только те строки, где заполнен Артикул определенного типа
    Если ТипЗнч(СтрокаТЧ.Артикул) = Тип("СправочникСсылка.Артикулы") Тогда
        
        // Дополнительно можно исключить конкретную номенклатуру
        Если СтрокаТЧ.Номенклатура <> Справочники.Номенклатура.НайтиПоНаименованию("Услуга") Тогда
             ПеременнаяИтогоКоличество = ПеременнаяИтогоКоличество + СтрокаТЧ.Количество;
        КонецЕсли;
        
    КонецЕсли;
    
КонецЦикла;

// Выводим результат в реквизит формы
ИтогоКоличество = ПеременнаяИтогоКоличество;

Проанализируем этот код: использование метода ТипЗнч позволяет нам четко отделить ссылки на справочник товаров от ссылок на услуги, если они хранятся в разных справочниках или имеют разные типы данных. Важно помнить, что такой расчет нужно вызывать в правильных обработчиках событий, таких как ПриИзменении колонки Количество или после автоматического заполнения таблицы.

Метод 2. Использование служебной колонки (Архитектурный подход)

Если нам необходимо, чтобы итог отображался именно в стандартном подвале таблицы и пересчитывался "на лету" платформой, лучшим решением будет использование скрытой служебной колонки. Рассмотрим этот алгоритм по шагам:

  1. В метаданных документа (или в реквизитах формы для управляемых форм) добавим в табличную часть Товары новую колонку, например, КоличествоДляИтога с типом Число.
  2. Для основной колонки Количество, в которой пользователь видит данные, установим в свойствах элемента формы ПутьДанныхПодвала. Но укажем там не саму колонку Количество, а нашу новую колонку КоличествоДляИтога.
  3. В свойстве УстановитьТекстПодвала выберем тип "Итог".
  4. Теперь нам остается только программно управлять значением в невидимой колонке.

Выясним причину, почему это удобно: платформа сама просуммирует значения, нам нужно лишь обнулить их там, где это услуги. Посмотрим на пример реализации в событии изменения номенклатуры или количества:


Процедура ТоварыКоличествоПриИзменении(Элемент)
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    
    // Если это услуга, в скрытую колонку пишем 0, иначе - реальное количество
    Если ТекущаяСтрока.ЭтоУслуга = Истина Тогда
        ТекущаяСтрока.КоличествоДляИтога = 0;
    Иначе
        ТекущаяСтрока.КоличествоДляИтога = ТекущаяСтрока.Количество;
    КонецЕсли;
КонецПроцедуры

Этот метод гарантирует, что пользователь всегда видит актуальный итог в подвале, при этом производительность системы не страдает от лишних циклов при каждом обновлении экрана.

Метод 3. Выбор оптимального события для расчета

Одной из главных ошибок начинающих разработчиков является использование события ПриПолученииДанных или ПриВыводеСтроки для тяжелых расчетов. Эти процедуры вызываются системой крайне часто (при каждом скроллинге, перерисовке окна). Если в таблице сотни строк, расчет итогов в этих событиях приведет к "зависанию" интерфейса.

Проанализируем правильные места для размещения кода расчета:

Метод 4. Проверка типа номенклатуры (для типовых конфигураций)

В современных конфигурациях (УТ 11, ERP, БП 3.0) проверять тип ссылки — не всегда надежно, так как и товары, и услуги часто лежат в одном справочнике Номенклатура. Выясним, как правильно фильтровать строки в таких случаях. У объекта номенклатуры обычно есть реквизит ТипНоменклатуры, который является перечислением.

Рассмотрим пример условия:


Если СтрокаТЧ.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар Тогда
    // Только теперь прибавляем к итогу
    ИтоговоеКоличество = ИтоговоеКоличество + СтрокаТЧ.Количество;
КонецЕсли;

Важный нюанс: Обращение через точку (СтрокаТЧ.Номенклатура.ТипНоменклатуры) в цикле может замедлить работу в клиент-серверном варианте, так как провоцирует отдельные обращения к базе данных для каждой строки. В таких случаях эффективнее выгрузить колонку номенклатуры, получить их типы одним запросом и затем производить расчет.

Метод 5. Использование метода "Вычислить" для Таблицы Значений

Если мы работаем с данными на сервере и табличная часть уже выгружена в объект ТаблицаЗначений, мы можем воспользоваться встроенным методом Вычислить. Это работает значительно быстрее, чем ручной цикл Для каждого.


// Выгружаем ТЧ в таблицу значений
ТаблицаТоваров = Объект.Товары.Выгрузить();

// Добавляем временную колонку-признак для фильтра (если её нет)
// Или используем существующие колонки для отбора
СтрокаОтбора = "ЭтоУслуга = Ложь";
ВсегоТоваров = ТаблицаТоваров.Вычислить("Сумма(Количество)", СтрокаОтбора);

Этот подход позволяет использовать мощь встроенных алгоритмов платформы 1С для быстрой агрегации данных.

Резюме

Для решения задачи автора наиболее подходящим является Метод 1 (простой цикл с условием) при условии, что данных немного, и расчет вызывается в момент заполнения документа. Однако для профессиональной разработки в долгосрочной перспективе рекомендуется использовать Метод 2 со скрытой колонкой — это обеспечит нативную работу интерфейса 1С и удобство для пользователя, который привык видеть итоги именно в подвале таблицы.

← На главную