Как вывести итог по колонке Сумма в печатную форму 1С

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

При разработке печатных форм в системе 1С:Предприятие одной из самых частых задач является расчет и вывод итоговых показателей. Чаще всего требуется просуммировать данные в колонке «Сумма» по всем строкам табличной части документа и красиво вывести этот результат в подвале таблицы. Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с ошибками при определении области видимости переменных или неправильным заполнением параметров макета. В этой статье мы подробно разберем, как правильно реализовать расчет итогов, проанализируем типичные ошибки и рассмотрим альтернативные, более эффективные способы решения этой задачи.

Метод 1: Ручное накопление суммы в цикле обхода выборки

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

Разберем алгоритм по шагам:

  1. Инициализация переменной: Перед началом цикла обхода табличной части (или выборки запроса) создаем переменную, например ИтоговаяСумма, и присваиваем ей начальное значение 0.
  2. Накопление в цикле: Внутри цикла при каждой итерации прибавляем значение текущей строки к нашей переменной.
  3. Заполнение подвала: После завершения цикла передаем накопленное значение в параметр области «Подвал» и выводим эту область в табличный документ.

Проанализируем пример кода, реализующий этот подход:


// Инициализируем переменную для накопления итога
ИтогоСумма = 0;

ВыборкаТовары = Выборка.Товары.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
    
    // Заполняем область строки данными из выборки
    ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
    
    // Накапливаем сумму
    ИтогоСумма = ИтогоСумма + ВыборкаТовары.Сумма;
    
    // Выводим строку в табличный документ
    ТабДок.Вывести(ОбластьТовары);
    
КонецЦикла;

// Теперь, когда цикл завершен, заполняем параметр подвала
ОбластьПодвал.Параметры.ОбщСумма = ИтогоСумма;
ТабДок.Вывести(ОбластьПодвал);

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

Метод 2: Использование встроенного метода Итог() табличной части

Если в процедуру печати передается ссылка на документ (объект Ссылка), то нам вовсе не обязательно считать сумму вручную в цикле. Платформа 1С предоставляет мощный встроенный инструмент для работы с коллекциями строк — метод Итог(). Этот метод работает на уровне платформы и выполняет вычисления значительно быстрее, чем ручной перебор.

Рассмотрим, как упростить код в этом случае:


// Получаем итог напрямую из табличной части документа
ВсегоПоДокументу = Ссылка.Товары.Итог("Сумма");

// При необходимости можно сразу получить и итог по количеству
ВсегоКоличество = Ссылка.Товары.Итог("Количество");

// Заполняем параметры области подвала перед выводом
ОбластьПодвал.Параметры.ОбщСумма = ВсегоПоДокументу;
ОбластьПодвал.Параметры.ВсегоКол = ВсегоКоличество;

ТабДок.Вывести(ОбластьПодвал);

Этот метод предпочтителен, так как он делает код чище и понятнее. Однако помните, что он доступен только если у вас есть доступ к объекту или ссылке документа, и если состав строк в печатной форме полностью совпадает с составом строк в документе (без дополнительных фильтров в запросе).

Метод 3: Расчет итогов средствами языка запросов

Если ваша печатная форма строится на сложном запросе, где данные объединяются из разных таблиц, или применяются сложные фильтры, логично переложить расчет итогов на СУБД. Для этого в языке запросов 1С используется конструкция ИТОГИ.

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


Запрос.Текст = 
"ВЫБРАТЬ
|   ПриобретениеТовараТовары.Ссылка КАК Ссылка,
|   ПриобретениеТовараТовары.Сумма КАК Сумма
|ИЗ
|   Документ.ПриобретениеТовара.Товары КАК ПриобретениеТовараТовары
|ГДЕ
|   ПриобретениеТовараТовары.Ссылка = &Ссылка
|ИТОГИ
|   СУММА(Сумма)
|ПО
|   ОБЩИЕ";

РезультатЗапроса = Запрос.Выполнить();
// Из выборки с общими итогами можно сразу получить сумму
ВыборкаОбщая = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщая.Следующий();
ОбщаяСумма = ВыборкаОбщая.Сумма;

Использование ИТОГИ в запросе позволяет получить готовый результат еще до начала вывода строк в табличный документ, что удобно для заполнения заголовка или подвала формы.

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

Просто вывести число часто бывает недостаточно для качественной печатной формы. Рассмотрим несколько приемов, которые сделают ваш отчет профессиональным:

  1. Форматирование чисел: Чтобы сумма не выглядела как «1250000.5», используйте функцию Формат(). Это позволит добавить разделители групп разрядов и ограничить количество знаков после запятой.

    Пример: ОбластьПодвал.Параметры.ОбщСумма = Формат(ИтогоСумма, "ЧДЦ=2; ЧГ=3,0"); — это превратит число в наглядный вид «1 250 000,50».

  2. Сумма прописью: В официальных документах (счета, накладные) принято дублировать итоговую сумму прописью. Для этого в 1С используется функция ЧислоПрописью().

    Пример: СуммаСтрокой = ЧислоПрописью(ИтогоСумма, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");

  3. Контроль вывода на страницу: Используйте метод ПроверитьВывод(). Перед тем как выводить подвал, программа должна проверить, помещается ли он на текущий лист. Если нет — можно принудительно добавить разделитель страниц, чтобы подвал не «оторвался» от таблицы и не напечатался на отдельном пустом листе.

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

← На главную