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

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

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

Анализ проблемы: почему данные не выводятся автоматически?

Рассмотрим типичную ошибку: разработчик создает в макете ячейку, называет ее «Итого» и пытается указать в свойстве ПутьКДанным ссылку на итог табличной части. Важно понимать, что макет печати — это не форма документа. В макете (табличном документе) механизм ПутьКДанным не работает так же, как в элементах управляемой формы. Чтобы данные попали в печатную форму, их необходимо передать программно через Параметры соответствующей области макета.

Проанализируем ситуацию: для вывода итогов нам нужно выполнить три шага:

  1. Получить область макета (обычно это «Подвал»).
  2. Рассчитать итоговую сумму (программно или в запросе).
  3. Присвоить рассчитанное значение параметру области и вывести область в итоговый документ.

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

Этот метод часто выбирают новички, так как он наиболее нагляден. Мы разберем по шагам, как реализовать расчет суммы непосредственно в процедуре печати в Модуле менеджера или Модуле объекта.

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


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

// Получаем область подвала из макета
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

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

// После завершения цикла передаем накопленный итог в параметр макета
ОбластьПодвал.Параметры.Итого = ПеременнаяИтоговаяСумма;

// Выводим область подвала в табличный документ
ТабДок.Вывести(ОбластьПодвал);

Этот метод надежен, но требует ручного написания алгоритма суммирования. Разберем более изящные варианты.

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

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

Выясним, как применить этот метод в коде:


// Получаем область макета, где должен стоять итог
ОбластьИтогов = Макет.ПолучитьОбласть("Подвал");

// Рассчитываем сумму одной строкой кода
// Здесь "Товары" - имя табличной части, "Сумма" - имя колонки
СуммаВсего = СсылкаНаОбъект.Товары.Итог("Сумма");

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

// Печатаем область
ТабДок.Вывести(ОбластьИтогов);

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

Способ 3: Расчет итогов в тексте запроса

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

Проанализируем пример построения такого запроса:


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

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();

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

Этот метод особенно эффективен для документов с огромным количеством строк (тысячи и более), так как расчет происходит на стороне сервера СУБД.

Как сделать документ профессиональным: форматирование и сумма прописью

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

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

Область.Параметры.Итого = Формат(СуммаИтого, "ЧДЦ=2; ЧГ=3,0");

Здесь ЧДЦ=2 означает два знака после запятой, а ЧГ=3,0 — разделение групп разрядов по три цифры пробелом.

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

Рассмотрим пример функции, которая выводит сумму в рублях:


ВалютаПараметры = "L=ru_RU; , рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
СуммаТекстом = ЧислоПрописью(ПеременнаяИтоговаяСумма, "L=ru_RU", ВалютаПараметры);
ОбластьПодвал.Параметры.ИтогоПрописью = СуммаТекстом;

Отображение итогов на форме документа

Часто пользователи хотят видеть «Итого» не только в печати, но и в самом окне программы при редактировании. Посмотрим, как настроить автоматический расчет без написания кода:

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

После этого система сама будет пересчитывать итог внизу таблицы при добавлении или изменении строк пользователем.

Заключение

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

← На главную