Как вывести итог по колонке в подвале формы списка в обычном приложении 1С?

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

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

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

Простой, но неоптимальный способ (быстрое решение для небольших баз)

Наиболее очевидный способ, который часто выбирают начинающие разработчики, заключается в использовании события списка ПриПолученииДанных и объекта ПостроительОтчета. Рассмотрим пример такого кода:


Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументСписок);
    
    Таб = ПостроительОтчета.Результат.Выгрузить();
    СуммаДокументов = Таб.Итог("СуммаДокумента");
КонецПроцедуры

В данном примере СуммаДокументов — это реквизит формы, расположенный под табличным полем списка документов.

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

Оптимальное решение: Вычисление суммы на сервере СУБД

Чтобы избежать передачи всей таблицы документов на клиент, мы должны переложить задачу суммирования на сервер баз данных. Для этого мы получим текст запроса динамического списка (вместе со всеми наложенными пользователем отборами) через ПостроительЗапроса, а затем обернем его во вложенный запрос, который вернет нам ровно одно число — итоговую сумму.

Рассмотрим пример правильной реализации:


Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументСписок);

// Получаем готовый запрос с учетом всех пользовательских настроек и отборов
ЗапросИтога = Построитель.ПолучитьЗапрос();
ЗапросИтога.Текст = "ВЫБРАТЬ СУММА(Вл.СуммаДокумента) КАК Всего ИЗ (" + ЗапросИтога.Текст + ") КАК Вл";

Выборка = ЗапросИтога.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ИтоговаяСумма = Выборка.Всего;
КонецЕсли;

Этот метод работает в разы быстрее, так как сервер СУБД самостоятельно выполняет группировку и возвращает клиенту единственное числовое значение.

Дополнительная оптимизация интерфейса

Даже оптимизированный запрос к базе данных может вызывать задержки, если в списке находятся сотни тысяч документов, а пользователь постоянно меняет отборы. Чтобы сделать работу максимально комфортной, применим следующие подходы:

  1. Расчет по требованию: Не запускайте расчет при каждом изменении списка. Разместите на командной панели формы кнопку "Рассчитать итог" (или "Обновить"). Бухгалтер будет нажимать её только тогда, когда ему действительно нужно увидеть актуальную сумму.
  2. Использование флага управления: Добавьте на форму флажок "Показывать итог". Если флажок снят — расчет не производится. Если установлен — расчет запускается при открытии формы или изменении отборов.
  3. Физический реквизит в шапке: Убедитесь, что сумма документа хранится в физическом реквизите шапки (например, СуммаДокумента), который заполняется в момент записи документа. Если реквизита в шапке нет и сумма каждый раз рассчитывается динамически по табличной части каждого документа, то любой групповой расчет по журналу будет выполняться крайне медленно.

Альтернативные варианты без изменения кода конфигурации

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

Способ 1. Использование встроенного калькулятора (комбинация Ctrl + A + M+)

  1. В списке документов установите курсор на любую ячейку в колонке "Сумма".
  2. Нажмите на клавиатуре комбинацию клавиш Ctrl + A (это выделит все строки в списке с учетом установленных отборов).
  3. Нажмите на стандартную кнопку M+ (или просто M) на верхней панели инструментов 1С.
  4. Откройте встроенный калькулятор 1С — в ячейке памяти "М" отобразится итоговая сумма всех выделенных документов.

Способ 2. Вывод списка в табличный документ

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