Как вывести итоговые значения в подвал внешней печатной формы 1С?

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

Мы с вами сталкивались с задачей, когда необходимо отобразить общие итоговые значения, например, суммарный объем или общую сумму, внизу печатной формы – в её подвале. Это стандартная практика для накладных, актов и других документов. Однако, как показал опыт нашего коллеги на форуме, иногда возникают сложности, особенно при работе с внешними печатными формами в 1С. Часто расчеты производятся корректно, но выводятся не так, как ожидалось – например, списком вместо единого значения в предназначенном для этого параметре. Давайте подробно разберем, как правильно реализовать вывод итогов в подвал печатной формы, выясним причины возможных ошибок и посмотрим на практические примеры.

1. Создание и настройка области подвала в макете

Прежде всего, нам необходимо подготовить макет печатной формы. Это может быть как совершенно новый макет, так и макет, полученный путем копирования стандартного. Мы будем работать с макетом табличного документа.

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

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

Таким образом, мы подготовили "холст" в макете, куда будем выводить наши итоговые значения. Теперь перейдем к их расчету в программном коде.

2. Расчет итогов в программном коде

Расчет итоговых значений – это ключевой этап. Он должен происходить в модуле, отвечающем за формирование печатной формы. Обычно это процедура Печать() в модуле объекта документа или в модуле менеджера, если речь идет о стандартных печатных формах, или в модуле внешней печатной формы.

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

Давайте посмотрим на пример, как это может выглядеть для расчета общего объема:


// Объявляем переменную для хранения итогового объема и инициализируем её нулем.
// Это необходимо сделать до начала цикла, чтобы сумма накапливалась корректно.
ИтогОбъем = 0;

// Предположим, у нас есть объект документа (ДокументОбъект)
// и он содержит табличную часть с именем "Товары", в которой есть колонка "Объем".
// Получаем выборку по строкам табличной части.
ВыборкаТабличнойЧасти = ДокументОбъект.Товары.Выбрать();

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

// После завершения цикла переменная "ИтогОбъем" будет содержать
// общую сумму всех значений "Объем" из табличной части документа.
// Теперь это значение готово для вывода в подвал.

В этом примере мы используем цикл Пока ВыборкаТабличнойЧасти.Следующий() Цикл ... КонецЦикла; для перебора строк табличной части. Это универсальный и понятный способ для расчета итогов.

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

Пример запроса для получения итогового объема:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ СУММА(Товары.Объем) КАК ИтогоОбъем
               |ИЗ Документ.НакладнаяПеремещения.Товары КАК Товары
               |ГДЕ Товары.Ссылка = &Ссылка"; // &Ссылка - параметр, указывающий на наш документ

// Устанавливаем значение параметра "Ссылка" для текущего документа.
Запрос.УстановитьПараметр("Ссылка", ДокументОбъект.Ссылка);

// Выполняем запрос и получаем результат.
РезультатЗапроса = Запрос.Выполнить();
ВыборкаИтогов = РезультатЗапроса.Выбрать();

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

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

3. Заполнение параметров области подвала

После того как мы рассчитали итоговое значение, его необходимо передать в соответствующий параметр области подвала в макете. Это делается до вывода самой области в табличный документ. Запомните: сначала подготовка области, затем её вывод.

Давайте рассмотрим шаги:

  1. Получите область подвала из макета. Мы уже дали этой области имя Подвал на первом шаге. Нам нужно получить объект этой области из макета.
  2. 
    // Предполагаем, что Макет уже получен, например:
    // Макет = ПолучитьМакет("МакетПечати"); // Если это макет объекта
    // Макет = ВнешниеОбработки.ПолучитьМакет("МакетПечати"); // Если это макет внешней обработки
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    
  3. Присвойте рассчитанное итоговое значение параметру области. Здесь критически важно, чтобы имя параметра в коде (например, ИтогоОбъем) точно совпадало с именем параметра, которое вы задали для ячейки в макете (см. пункт 1.3).
  4. ОбластьПодвал.Параметры.ИтогоОбъем = ИтогОбъем;

Это именно та строка, которая была указана в сообщениях 3 и 4 на форуме, и которая решает основную проблему автора. Без этой строки параметр в макете останется пустым или будет выведен некорректно, так как система не будет знать, какое значение туда подставить.

Если у вас несколько итоговых параметров (например, ИтогоОбъем, ИтогоСумма, ИтогоВес), вы должны присвоить значение каждому из них по аналогии:


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

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

4. Порядок вывода областей

Порядок вывода областей имеет критическое значение для корректного отображения печатной формы. Область подвала должна быть выведена в табличный документ после вывода всех строк табличной части документа, но до окончательного отображения всего документа. Если мы выведем подвал раньше строк, он окажется над ними. Если мы забудем его вывести, он не появится вообще.

Общий шаблон формирования печатной формы обычно выглядит так:


// ... (начальная инициализация объекта ТабличногоДокумента и получение объекта Макет) ...

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

// 2. Вывод области шапки табличной части (заголовки колонок, например: "Номенклатура", "Количество", "Объем").
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
// Если в шапке есть параметры, заполняем их.
// ОбластьШапкаТаблицы.Параметры.НаименованиеКолонки = "Номенклатура";
ТабДок.Вывести(ОбластьШапкаТаблицы);

// 3. Расчет итогов (как мы рассмотрели выше в пункте 2).
// Этот шаг должен быть выполнен до вывода области подвала,
// чтобы переменные ИтогОбъем, ИтогСумма и т.д. содержали актуальные значения.
ИтогОбъем = 0;
// ... цикл по табличной части и расчет ИтогОбъем ...
// ... или выполнение запроса для получения ИтогОбъем ...

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

// 5. Заполнение и вывод области подвала.
// Этот шаг выполняется ПОСЛЕ вывода всех строк табличной части.
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.ИтогоОбъем = ИтогОбъем; // Присваиваем рассчитанный итог!
// Если есть другие итоги, заполняем их параметры.
// ОбластьПодвал.Параметры.ИтогоСумма = ИтогСумма;
ТабДок.Вывести(ОбластьПодвал); // Выводим область подвала в табличный документ.

// ... (возможно, вывод других областей, например, подписей, печатей и т.д.) ...

// 6. Окончательное отображение ТабличногоДокумента пользователю.
ТабДок.Показать();

Критически важный момент, на который обратили внимание в обсуждении (сообщения 11 и 12), связан с использованием метода Заполнить(данныеВыборки). Если вы используете этот метод для автоматического заполнения параметров области, будьте внимательны: он может перезаписать параметры, которые вы установили вручную. Поэтому присвоение итоговых значений следует выполнять после вызова Заполнить(), если вы им пользуетесь, но до вызова Присоединить() (если вы добавляете область к уже выведенным данным).

Например, если вы выводите строки табличной части с использованием Заполнить():


// ... (расчет ИтогОбъем) ...

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

// Затем, после вывода всех строк, заполняем и выводим подвал
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
// Здесь присваиваем итог, так как Заполнить() для этой области не вызывается,
// или если бы вызывался, то присвоение вручную было бы после него.
ОбластьПодвал.Параметры.ИтогоОбъем = ИтогОбъем; 

// Если используется Присоединить (например, для добавления области к существующему ТабДок):
// ТабДок.Присоединить(ОбластьПодвал);
// В противном случае просто выводим.
ТабДок.Вывести(ОбластьПодвал); 

Понимание правильной последовательности вызова методов Вывести(), Заполнить() и Присоединить() является залогом успешной работы с печатными формами. Всегда сначала готовим область (получаем, заполняем параметры), а затем выводим её.

5. Особенности доработки типовых форм и внешних печатных форм

Наш коллега столкнулся с доработкой типовых печатных форм, что часто вызывает затруднения из-за большого объема кода, который трудно разобрать с первого раза. Для таких случаев настоятельно рекомендуется использовать внешние печатные формы (ВПФ).

  1. Преимущества ВПФ: Внешние печатные формы позволяют модифицировать логику печати или внешний вид макета без внесения изменений в типовую конфигурацию. Это значительно упрощает процесс обновления информационной базы, так как вам не придется каждый раз сливать изменения, а типовая конфигурация остается на поддержке без изменений.
  2. Структура ВПФ: Внешние печатные формы представляют собой обработки, которые должны реализовывать определенный набор экспортных методов, чтобы быть "узнанными" системой 1С. К таким методам относятся:
    • СведенияОВнешнейОбработке(): Экспортная функция, возвращающая структуру с метаданными обработки (название, вид, команды печати, привязка к документам и т.д.).
    • Печать(): Основная экспортная процедура, которая получает на вход массив ссылок на документы и формирует табличный документ для каждого из них или один общий. Именно в этой процедуре будет весь наш код по расчету и выводу итогов.
    • ВыводИнформацииПоДокументу() (или похожие): Дополнительные экспортные процедуры или функции, которые могут использоваться для получения дополнительных данных, если это необходимо, или для сложной логики печати.
  3. Привязка ВПФ: ВПФ привязываются к конкретным видам документов в режиме предприятия через раздел "НСИ и Администрирование" -> "Печатные формы, отчеты и обработки" -> "Дополнительные отчеты и обработки". Здесь вы можете добавить свою внешнюю печатную форму и указать, для каких документов она будет доступна.

Работа с ВПФ позволяет сохранить типовую конфигурацию в неизменном виде, что делает вашу систему более устойчивой к обновлениям и проще в сопровождении. Это золотое правило при доработках в 1С. Для быстрого создания собственной обработки можно использовать готовый пример внешней печатной формы на БСП 3.1.

6. Управление макетами в режиме предприятия

В современных версиях 1С (начиная с 8.3.10) появилась очень полезная функциональность, позволяющая пользователям и администраторам системы редактировать макеты печатных форм непосредственно в режиме предприятия, без необходимости входить в конфигуратор. Это существенно упрощает жизнь и снижает нагрузку на программистов.

  1. Доступ к макетам: Вы можете найти эту возможность в разделе "НСИ и Администрирование" -> "Печатные формы, отчеты и обработки" -> "Макеты печатных форм". Здесь отображаются все доступные макеты печатных форм из конфигурации и внешних обработок.
  2. Редактирование: В этом разделе можно выбрать нужный макет и открыть его для редактирования. Интерфейс редактирования макета в режиме предприятия очень схож с интерфейсом конфигуратора (табличный документ), что позволяет выполнять несложные изменения. Вы можете:
    • Добавлять и изменять статический текст.
    • Менять шрифты, цвета, выравнивание, границы ячеек.
    • Объединять и разъединять ячейки.
    • И самое главное для нашей задачи: создавать и настраивать новые параметры для вывода данных. То есть, даже создание параметра ИтогоОбъем в подвале может быть выполнено непосредственно пользователем без программиста.
  3. Версионирование: Система позволяет переключаться между стандартной версией макета (из конфигурации) и пользовательской (отредактированной). Это дает возможность экспериментировать с внешним видом, сохраняя при этом возможность в любой момент вернуться к исходному типовому варианту макета.

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

Итак, мы с вами детально разобрали процесс вывода итогов в подвал печатной формы в 1С. Ключевые моменты заключаются в правильной настройке макета с параметрами, корректном расчете итоговых значений в коде (в цикле по табличной части или запросом) и, самое главное, в присвоении этих значений параметрам области подвала до её вывода в табличный документ. Помните о порядке вывода областей и особенностях работы с внешними печатными формами. Надеемся, что этот подробный разбор поможет вам успешно реализовывать подобные задачи. Успехов в ваших доработках!

← На главную