Как убрать дублирование итогов в печатной форме 1С и правильно настроить области макета

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

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

Анализ структуры макета и программного цикла

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

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

Правильное разделение макета на области

Для того чтобы избежать подобных проблем, нам необходимо четко разграничить области в редакторе макета. Посмотрим, как это сделать правильно:

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

Проверим назначенные имена через меню "Таблица — Имена — Назначенные имена". Убедимся, что области не пересекаются и не "вложены" друг в друга. Если область Строка включает в себя ячейки из области Подвал, итог неизбежно будет дублироваться.

Программный алгоритм вывода данных

Теперь разберем, как должен выглядеть корректный код на языке 1С. Основное правило: вывод подвала должен происходить строго после завершения цикла по строкам товаров. Рассмотрим пример кода:


// 1. Выводим шапку
ОбластьШапки = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьШапки.Параметры.Заполнить(СведенияОДокументе);
ТабличныйДокумент.Вывести(ОбластьШапки);

// 2. Выводим строки в цикле
ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
Для каждого СтрокаТЧ Из Объект.Товары Цикл
    ОбластьСтроки.Параметры.Заполнить(СтрокаТЧ);
    // Здесь выполняем только вывод данных по конкретной позиции
    ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;

// 3. Расчет и вывод итогов (ВНЕ ЦИКЛА)
СуммаИтого = Объект.Товары.Итог("Сумма");
ОбластьПодвала = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвала.Параметры.Всего = СуммаИтого;
ТабличныйДокумент.Вывести(ОбластьПодвала);

В данном примере мы используем метод Итог() для получения суммы по колонке табличной части. Это гораздо эффективнее, чем суммировать значения вручную внутри цикла в переменную. Обратите внимание, что метод Вывести(ОбластьПодвала) вызывается один раз, что гарантирует наличие только одного итога в конце документа.

Почему система "не видит" область макета?

Иногда возникает другая проблема: код написан верно, но при выполнении Макет.ПолучитьОбласть("Итого") система выдает ошибку, сообщая, что область не найдена. Рассмотрим основные причины этой ситуации:

Использование стандартных функций форматирования

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

Например, вместо простой передачи числа можно использовать метод:


ОбластьПодвала.Параметры.Всего = ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаИтого);

Это позволит автоматически выводить сумму в виде "1 250,00" вместо "1250". Если же вы работаете в самописной конфигурации, воспользуйтесь стандартной функцией Формат():

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

Контроль переноса итогов на новую страницу

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

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


МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьПодвала);

// Проверяем, поместится ли подвал на текущую страницу
Если Не ТабличныйДокумент.ПроверитьВывод(МассивОбластей) Тогда
    // Если не помещается, можно принудительно вставить разрыв страницы
    ТабличныйДокумент.ВывестиВертикальныйРазделительСтраниц();
КонецЕсли;

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

Важное уточнение: опытные разработчики рекомендуют добавлять в массив для проверки не только подвал, но и последнюю строку с товаром. Тогда, если подвал не влезает, система перенесет на новый лист и последнюю строку товара вместе с итогом, что выглядит гораздо эстетичнее.

Итоги и рекомендации

Подведем итог нашему разбору. Чтобы печатная форма работала корректно:

  1. Всегда разделяйте макет на три независимые горизонтальные области: Шапка, Строка, Подвал.
  2. Следите за тем, чтобы цикл Для каждого включал в себя только вывод области Строка.
  3. Расчет сумм (использование метода Итог()) и вывод области Подвал выполняйте после завершения цикла.
  4. Проверяйте уникальность и точность имен областей в макете, избегая скрытых символов и пробелов.

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

← На главную