При работе с типовыми конфигурациями, такими как 1С:Комплексная автоматизация 2.5 или 1С:ERP, разработчики часто сталкиваются с необходимостью изменить логику отображения данных в подвале табличных частей. Стандартный механизм платформы ПутьКДаннымПодвала позволяет автоматически суммировать значения по колонке, однако он не обладает гибкостью: в итог попадают абсолютно все строки, включая помеченные на удаление или имеющие признак «Отменено».
В этой статье мы подробно разберем, как с помощью механизма расширений реализовать выборочный расчет итогов в документе ОтчетПереработчика (или любом другом аналогичном), чтобы исключить из финальной суммы количество по отмененным позициям номенклатуры.
Проанализируем ситуацию: когда мы указываем в свойствах элемента формы (колонки таблицы) путь к данным подвала как Объект.Товары.ИтогКоличество, платформа выполняет суммирование на уровне ядра. У разработчика нет возможности наложить фильтр (условие) на этот процесс. Если в бизнес-логике предприятия строка документа с установленным флагом Отменено не должна влиять на общее количество продукции (в этом помогут гибкие статусы и цветовая индикация документов реализации), нам придется отказаться от автоматического суммирования в пользу программного управления реквизитами формы.
Первым делом нам необходимо создать место для хранения нашего «правильного» итога. Поскольку этот итог нужен только для отображения в форме, мы не будем менять структуру метаданных документа в основной конфигурации (хотя в некоторых случаях удобнее использовать дополнительные реквизиты табличных частей объекта). Мы воспользуемся расширением формы.
ИтогКоличествоБезОтмененных (добавление реквизитов и элементов формы на управляемые формы возможно и программным методом).Число (с нужной точностью и длиной, соответствующей колонке количества).Теперь заставим форму отображать наш новый реквизит в нижней части таблицы. Разберем по шагам настройку элемента формы (похожим образом реализуется вывод в табличную форму документа наличия вложенного файла):
ТоварыКоличество (или аналогичную).ИтогКоличествоБезОтмененных.Товары) включено свойство Подвал.Выясним, в какой момент нам нужно пересчитывать итог. Сумма должна обновляться при открытии документа, при изменении количества в строке и при установке флага отмены. Для этого создадим общую процедуру в модуле формы расширения.
Рассмотрим пример кода для расчета:
&НаКлиенте
Процедура РасчитатьИтогиБезОтмененных()
ПеременнаяИтог = 0;
// Обходим коллекцию строк формы напрямую на клиенте для скорости
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Проверяем условие отмены. Имя поля может отличаться (например, "Отменено")
Если Не СтрокаТЧ.Отменено Тогда
ПеременнаяИтог = ПеременнаяИтог + СтрокаТЧ.Количество;
КонецЕсли;
КонецЦикла;
// Записываем результат в наш реквизит формы
ИтогКоличествоБезОтмененных = ПеременнаяИтог;
КонецПроцедуры
Чтобы итог всегда оставался актуальным, нам нужно внедрить вызов нашей процедуры РасчитатьИтогиБезОтмененных() в типовой цикл работы формы. Используем аннотации &После для безопасного расширения функционала.
Проанализируем необходимые события:
Пример подключения через расширение:
&После("ПриЧтенииНаСервере")
Процедура Расшир_ПриЧтенииНаСервере(ТекущийОбъект)
// На сервере мы также можем вызвать расчет или передать управление на клиент
// Но проще всего инициализировать значение сразу здесь
Сумма = 0;
Для Каждого Стр Из ТекущийОбъект.Товары Цикл
Если Не Стр.Отменено Тогда
Сумма = Сумма + Стр.Количество;
КонецЕсли;
КонецЦикла;
ИтогКоличествоБезОтмененных = Сумма;
КонецПроцедуры
&НаКлиенте
&После("ТоварыКоличествоПриИзменении")
Процедура Расшир_ТоварыКоличествоПриИзменении(Элемент)
РасчитатьИтогиБезОтмененных();
КонецПроцедуры
&НаКлиенте
&После("ТоварыОтмененоПриИзменении")
Процедура Расшир_ТоварыОтмененоПриИзменении(Элемент)
РасчитатьИтогиБезОтмененных();
КонецПроцедуры
При работе с крупными документами (сотни и тысячи строк) цикл по всей табличной части на клиенте может вызвать кратковременное «замирание» интерфейса. В таких случаях можно оптимизировать алгоритм: не пересчитывать всю таблицу, а прибавлять или вычитать разницу только по измененной строке. Однако для большинства стандартных документов ОтчетПереработчика в КА 2.5 прямой перебор является наиболее надежным и простым в реализации методом.
Также обратите внимание на типовой механизм РассчитатьИтоги, который часто присутствует в модулях формы 1С:ERP/КА. Если вы видите, что конфигурация использует централизованный расчет через ОбщийМодуль, вы можете вклиниться в него, чтобы подменить стандартный ИтогКоличество своим значением, но метод с отдельным реквизитом формы считается более «чистым» с точки зрения поддержки расширения, так как он меньше зависит от обновлений типового кода.