Как в 1С:КА 2.5 реализовать расчет итогов в подвале документа без учета отмененных строк?

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

При работе с типовыми конфигурациями, такими как 1С:Комплексная автоматизация 2.5 или 1С:ERP, разработчики часто сталкиваются с необходимостью изменить логику отображения данных в подвале табличных частей. Стандартный механизм платформы ПутьКДаннымПодвала позволяет автоматически суммировать значения по колонке, однако он не обладает гибкостью: в итог попадают абсолютно все строки, включая помеченные на удаление или имеющие признак «Отменено».

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

Почему стандартный механизм не подходит?

Проанализируем ситуацию: когда мы указываем в свойствах элемента формы (колонки таблицы) путь к данным подвала как Объект.Товары.ИтогКоличество, платформа выполняет суммирование на уровне ядра. У разработчика нет возможности наложить фильтр (условие) на этот процесс. Если в бизнес-логике предприятия строка документа с установленным флагом Отменено не должна влиять на общее количество продукции (в этом помогут гибкие статусы и цветовая индикация документов реализации), нам придется отказаться от автоматического суммирования в пользу программного управления реквизитами формы.

Шаг 1. Создание собственного реквизита для итогов

Первым делом нам необходимо создать место для хранения нашего «правильного» итога. Поскольку этот итог нужен только для отображения в форме, мы не будем менять структуру метаданных документа в основной конфигурации (хотя в некоторых случаях удобнее использовать дополнительные реквизиты табличных частей объекта). Мы воспользуемся расширением формы.

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

Шаг 2. Привязка реквизита к интерфейсу (Подвалу)

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

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

Шаг 3. Реализация алгоритма расчета

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

Рассмотрим пример кода для расчета:


&НаКлиенте
Процедура РасчитатьИтогиБезОтмененных()
    
    ПеременнаяИтог = 0;
    
    // Обходим коллекцию строк формы напрямую на клиенте для скорости
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        
        // Проверяем условие отмены. Имя поля может отличаться (например, "Отменено")
        Если Не СтрокаТЧ.Отменено Тогда
            ПеременнаяИтог = ПеременнаяИтог + СтрокаТЧ.Количество;
        КонецЕсли;
        
    КонецЦикла;
    
    // Записываем результат в наш реквизит формы
    ИтогКоличествоБезОтмененных = ПеременнаяИтог;
    
КонецПроцедуры

Шаг 4. Подключение обработчиков событий

Чтобы итог всегда оставался актуальным, нам нужно внедрить вызов нашей процедуры РасчитатьИтогиБезОтмененных() в типовой цикл работы формы. Используем аннотации &После для безопасного расширения функционала.

Проанализируем необходимые события:

  1. ПриЧтенииНаСервере: чтобы при открытии существующего документа сумма сразу была верной.
  2. ТоварыКоличествоПриИзменении: когда пользователь меняет цифры в строке.
  3. ТоварыОтмененоПриИзменении: когда пользователь ставит или снимает галочку отмены.
  4. ТоварыПриИзменении: общий обработчик изменения состава таблицы (добавление/удаление строк).

Пример подключения через расширение:


&После("ПриЧтенииНаСервере")
Процедура Расшир_ПриЧтенииНаСервере(ТекущийОбъект)
    // На сервере мы также можем вызвать расчет или передать управление на клиент
    // Но проще всего инициализировать значение сразу здесь
    Сумма = 0;
    Для Каждого Стр Из ТекущийОбъект.Товары Цикл
        Если Не Стр.Отменено Тогда
            Сумма = Сумма + Стр.Количество;
        КонецЕсли;
    КонецЦикла;
    ИтогКоличествоБезОтмененных = Сумма;
КонецПроцедуры

&НаКлиенте
&После("ТоварыКоличествоПриИзменении")
Процедура Расшир_ТоварыКоличествоПриИзменении(Элемент)
    РасчитатьИтогиБезОтмененных();
КонецПроцедуры

&НаКлиенте
&После("ТоварыОтмененоПриИзменении")
Процедура Расшир_ТоварыОтмененоПриИзменении(Элемент)
    РасчитатьИтогиБезОтмененных();
КонецПроцедуры

Дополнительные рекомендации

При работе с крупными документами (сотни и тысячи строк) цикл по всей табличной части на клиенте может вызвать кратковременное «замирание» интерфейса. В таких случаях можно оптимизировать алгоритм: не пересчитывать всю таблицу, а прибавлять или вычитать разницу только по измененной строке. Однако для большинства стандартных документов ОтчетПереработчика в КА 2.5 прямой перебор является наиболее надежным и простым в реализации методом.

Также обратите внимание на типовой механизм РассчитатьИтоги, который часто присутствует в модулях формы 1С:ERP/КА. Если вы видите, что конфигурация использует централизованный расчет через ОбщийМодуль, вы можете вклиниться в него, чтобы подменить стандартный ИтогКоличество своим значением, но метод с отдельным реквизитом формы считается более «чистым» с точки зрения поддержки расширения, так как он меньше зависит от обновлений типового кода.

← На главную