При разработке печатных форм в системе 1С начинающие программисты часто сталкиваются с ситуацией, когда итоговые строки таблицы (например, "Итого", "Сумма НДС", "Всего к оплате") начинают дублироваться после каждой строки товара или услуги. Это происходит из-за логических ошибок в структуре макета или в самом программном коде вывода областей. Разберем подробно, почему так происходит и как правильно организовать вывод данных в ТабличныйДокумент.
Рассмотрим стандартный механизм печати. Процесс формирования таблицы всегда состоит из трех этапов: вывод "Шапки", циклический вывод "Строк" с данными и завершающий вывод "Подвала" с итогами. Проанализируем типичную ошибку, когда итог "задваивается". Чаще всего причина кроется в том, что разработчик случайно включил область с итоговыми показателями в именованную область строки.
В коде это выглядит так: программа получает область Строка, заполняет её параметрами из текущей строки табличной части и выводит в документ. Если в макете область с именем Строка физически захватывает и ту строку, где написаны формулы итогов, то при каждой итерации цикла Для каждого система будет печатать не только данные товара, но и пустую (или заполненную) строку итогов.
Для того чтобы избежать подобных проблем, нам необходимо четко разграничить области в редакторе макета. Посмотрим, как это сделать правильно:
ШапкаТаблицы). Важно: выделять нужно именно строки целиком, нажимая на серые номера строк слева, а не просто ячейки.Строка. В этой строке не должно быть никаких итоговых подписей.Всего, СуммаНДС и т.д., и назовем эту область Подвал или Итого.Проверим назначенные имена через меню "Таблица — Имена — Назначенные имена". Убедимся, что области не пересекаются и не "вложены" друг в друга. Если область Строка включает в себя ячейки из области Подвал, итог неизбежно будет дублироваться.
Теперь разберем, как должен выглядеть корректный код на языке 1С. Основное правило: вывод подвала должен происходить строго после завершения цикла по строкам товаров. Рассмотрим пример кода:
// 1. Выводим шапку
ОбластьШапки = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьШапки.Параметры.Заполнить(СведенияОДокументе);
ТабличныйДокумент.Вывести(ОбластьШапки);
// 2. Выводим строки в цикле
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для каждого СтрокаТЧ Из Объект.Товары Цикл
ОбластьСтроки.Параметры.Заполнить(СтрокаТЧ);
// Здесь выполняем только вывод данных по конкретной позиции
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
// 3. Расчет и вывод итогов (ВНЕ ЦИКЛА)
СуммаИтого = Объект.Товары.Итог("Сумма");
ОбластьПодвала = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвала.Параметры.Всего = СуммаИтого;
ТабличныйДокумент.Вывести(ОбластьПодвала);
В данном примере мы используем метод Итог() для получения суммы по колонке табличной части. Это гораздо эффективнее, чем суммировать значения вручную внутри цикла в переменную. Обратите внимание, что метод Вывести(ОбластьПодвала) вызывается один раз, что гарантирует наличие только одного итога в конце документа.
Иногда возникает другая проблема: код написан верно, но при выполнении Макет.ПолучитьОбласть("Итого") система выдает ошибку, сообщая, что область не найдена. Рассмотрим основные причины этой ситуации:
"Итого ". Для программного кода "Итого" и "Итого " — это разные идентификаторы.Для того чтобы итоги выглядели профессионально (с разделением разрядов и нужным количеством знаков после запятой), проанализируем использование функций форматирования. В типовых конфигурациях для этого предусмотрены специальные модули.
Например, вместо простой передачи числа можно использовать метод:
ОбластьПодвала.Параметры.Всего = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаИтого);
Это позволит автоматически выводить сумму в виде "1 250,00" вместо "1250". Если же вы работаете в самописной конфигурации, воспользуйтесь стандартной функцией Формат():
ОбластьПодвала.Параметры.Всего = Формат(СуммаИтого, "ЧЦ=15; ЧДЦ=2; ЧГ=3");
Важным моментом при выводе подвала является использование метода ПроверитьВывод(). Выясним причину, почему это необходимо. Бывают ситуации, когда таблица товаров заканчивается в самом низу страницы, и строка "Итого" отрывается от нее, печатаясь на следующем пустом листе. Это считается нарушением правил оформления документов.
Проанализируем пример кода для проверки помещаемости подвала:
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьПодвала);
// Проверяем, поместится ли подвал на текущую страницу
Если Не ТабличныйДокумент.ПроверитьВывод(МассивОбластей) Тогда
// Если не помещается, можно принудительно вставить разрыв страницы
ТабличныйДокумент.ВывестиВертикальныйРазделительСтраниц();
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьПодвала);
Важное уточнение: опытные разработчики рекомендуют добавлять в массив для проверки не только подвал, но и последнюю строку с товаром. Тогда, если подвал не влезает, система перенесет на новый лист и последнюю строку товара вместе с итогом, что выглядит гораздо эстетичнее.
Подведем итог нашему разбору. Чтобы печатная форма работала корректно:
Для каждого включал в себя только вывод области Строка.Итог()) и вывод области Подвал выполняйте после завершения цикла.Соблюдение этих правил позволит вам создавать чистые, надежные и легко читаемые отчеты и печатные формы, избегая досадных ошибок с "задваиванием" данных.