При разработке печатных форм в системе 1С:Предприятие одной из самых частых задач является вывод итоговых данных по табличной части документа. Многие начинающие разработчики сталкиваются с ситуацией, когда созданный в макете параметр остается пустым при формировании документа. В этой статье мы подробно разберем, почему это происходит, и изучим несколько эффективных способов расчета и вывода итогов.
Рассмотрим типичную ошибку: разработчик создает в макете ячейку, называет ее «Итого» и пытается указать в свойстве ПутьКДанным ссылку на итог табличной части. Важно понимать, что макет печати — это не форма документа. В макете (табличном документе) механизм ПутьКДанным не работает так же, как в элементах управляемой формы. Чтобы данные попали в печатную форму, их необходимо передать программно через Параметры соответствующей области макета.
Проанализируем ситуацию: для вывода итогов нам нужно выполнить три шага:
Этот метод часто выбирают новички, так как он наиболее нагляден. Мы разберем по шагам, как реализовать расчет суммы непосредственно в процедуре печати в Модуле менеджера или Модуле объекта.
Посмотрим на пример кода, который позволяет суммировать значения в процессе обработки строк табличной части:
// Инициализируем переменную для накопления суммы
ПеременнаяИтоговаяСумма = 0;
// Получаем область подвала из макета
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Предположим, у нас уже есть выборка строк из запроса
Пока ВыборкаСтрок.Следующий() Цикл
// Суммируем значения из каждой строки
ПеременнаяИтоговаяСумма = ПеременнаяИтоговаяСумма + ВыборкаСтрок.ВсегоСНДС;
// Здесь обычно идет вывод строк основной части
// ...
КонецЦикла;
// После завершения цикла передаем накопленный итог в параметр макета
ОбластьПодвал.Параметры.Итого = ПеременнаяИтоговаяСумма;
// Выводим область подвала в табличный документ
ТабДок.Вывести(ОбластьПодвал);
Этот метод надежен, но требует ручного написания алгоритма суммирования. Разберем более изящные варианты.
Система 1С предоставляет мощный встроенный инструмент для работы с табличными частями. Если вы печатаете данные непосредственно из объекта (например, из документа, который уже записан в базу), можно воспользоваться методом Итог(). Это гораздо быстрее и короче, чем написание циклов.
Выясним, как применить этот метод в коде:
// Получаем область макета, где должен стоять итог
ОбластьИтогов = Макет.ПолучитьОбласть("Подвал");
// Рассчитываем сумму одной строкой кода
// Здесь "Товары" - имя табличной части, "Сумма" - имя колонки
СуммаВсего = СсылкаНаОбъект.Товары.Итог("Сумма");
// Заполняем параметр в макете
ОбластьИтогов.Параметры.ВсегоСНДС = СуммаВсего;
// Печатаем область
ТабДок.Вывести(ОбластьИтогов);
Важный нюанс: метод Итог() работает только с коллекциями строк (табличными частями). Если ваша печатная форма строится на сложном запросе, объединяющем данные из нескольких источников, лучше использовать возможности языка запросов.
Профессиональный подход подразумевает, что база данных должна сама отдавать готовые цифры. Использование предложения ИТОГИ в языке запросов 1С позволяет получить агрегированные данные (сумму, количество, среднее) максимально быстро.
Проанализируем пример построения такого запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровТовары.Ссылка,
| ПоступлениеТоваровТовары.Сумма КАК Сумма
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
|ИТОГИ
| СУММА(Сумма)
|ПО
| ОБЩИЕ";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();
// Получаем общие итоги через выборку
ВыборкаИтоги = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Если ВыборкаИтоги.Следующий() Тогда
ОбщаяСумма = ВыборкаИтоги.Сумма;
КонецЕсли;
Этот метод особенно эффективен для документов с огромным количеством строк (тысячи и более), так как расчет происходит на стороне сервера СУБД.
Просто вывести число — это только половина дела. В финансовых документах принято использовать специальное форматирование и дублирование суммы прописью. Разберем, как это реализовать.
1. Форматирование чисел. Чтобы сумма «1500000» превратилась в легкочитаемую «1 500 000,00», используйте функцию Формат():
Область.Параметры.Итого = Формат(СуммаИтого, "ЧДЦ=2; ЧГ=3,0");
Здесь ЧДЦ=2 означает два знака после запятой, а ЧГ=3,0 — разделение групп разрядов по три цифры пробелом.
2. Сумма прописью. Для юридически значимых документов (договоры, накладные) необходимо выводить итог текстом. В 1С для этого есть встроенная функция ЧислоПрописью().
Рассмотрим пример функции, которая выводит сумму в рублях:
ВалютаПараметры = "L=ru_RU; , рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
СуммаТекстом = ЧислоПрописью(ПеременнаяИтоговаяСумма, "L=ru_RU", ВалютаПараметры);
ОбластьПодвал.Параметры.ИтогоПрописью = СуммаТекстом;
Часто пользователи хотят видеть «Итого» не только в печати, но и в самом окне программы при редактировании. Посмотрим, как настроить автоматический расчет без написания кода:
Объект.ИмяТаблицы.ИтогСумма.После этого система сама будет пересчитывать итог внизу таблицы при добавлении или изменении строк пользователем.
Мы проанализировали различные методы вывода итогов: от простых циклов до запросов и автоматических настроек интерфейса. Самым универсальным и простым для печатных форм является метод Итог() в сочетании с грамотным заполнением параметров макета. Помните, что аккуратное форматирование чисел и вывод суммы прописью делают ваши документы гораздо более удобными для конечного пользователя.