Как добавить суммарный вес и объем товара в макет внешней печатной формы УТ 11

Программист Управленческий учет Торговля и дистрибуция
← На главную

При работе с конфигурацией 1С:Управление торговлей 11 (УТ 11) часто возникает необходимость дополнить стандартные печатные формы (например, Счет на оплату или Реализацию товаров и услуг) данными о весогабаритных характеристиках (ВГХ). Это особенно актуально для отделов логистики и складов. В данной статье мы разберем, как «добить» модуль внешней печатной формы (ВПФ), чтобы в подвале документа корректно отображались суммарный вес и объем всех товаров.

Анализ задачи и подготовка макета

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

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

Модификация сбора данных в модуле объекта

В типовых решениях на базе БСП (Библиотеки стандартных подсистем), к которым относится и УТ 11, печать обычно реализована через формирование структуры ДанныеДляПечати. Нам нужно убедиться, что данные о весе и объеме попадают в таблицу товаров, которую мы обходим в цикле. Проанализируем фрагмент кода из модуля:


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

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

Программный расчет веса и объема в цикле

Разберем, как правильно реализовать накопление итогов. Мы не можем просто умножить количество на ЕдиницаИзмерения.Вес, так как в современных версиях УТ 11 весовые характеристики хранятся в справочнике УпаковкиЕдиницыИзмерения или реквизитах номенклатуры в зависимости от настроек. Рассмотрим правильный алгоритм внутри цикла обхода товаров:


// Перед началом цикла инициализируем переменные для итогов
ИтоговыйВес   = 0;
ИтоговыйОбъем = 0;

Для Каждого СтрокаТовары Из ТаблицаТовары Цикл
    // ... здесь идет стандартный код формирования строки макета ...
    
    // Получаем данные ВГХ для текущей номенклатуры
    // В УТ 11 рекомендуется использовать типовые функции для точности
    СтруктураВГХ = НоменклатураСервер.ПолучитьВГХНоменклатуры(СтрокаТовары.Номенклатура, СтрокаТовары.Упаковка);
    
    Если СтруктураВГХ <> Неопределено Тогда
        ТекущийВес = ?(ЗначениеЗаполнено(СтруктураВГХ.Вес), СтруктураВГХ.Вес, 0);
        ТекущийОбъем = ?(ЗначениеЗаполнено(СтруктураВГХ.Объем), СтруктураВГХ.Объем, 0);
        
        ИтоговыйВес   = ИтоговыйВес + (ТекущийВес * СтрокаТовары.Количество);
        ИтоговыйОбъем = ИтоговыйОбъем + (ТекущийОбъем * СтрокаТовары.Количество);
    КонецЕсли;
    
    // ... продолжение цикла ...
КонецЦикла;

Выясним причину, почему стоит использовать НоменклатураСервер.ПолучитьВГХНоменклатуры. Эта функция учитывает, используются ли упаковки, и возвращает корректные коэффициенты пересчета веса и объема именно для той единицы измерения, которая указана в документе. Если же мы будем обращаться напрямую к реквизитам справочника через точку, мы рискуем получить некорректные данные, если товар отгружается в коробках, а вес указан за штуку.

Вывод данных в макет

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

Рассмотрим пример кода для вывода:


// Находим область, где мы добавили параметры
ОбластьСуммаПрописью = Макет.ПолучитьОбласть("СуммаПрописью");

// Заполняем наши новые параметры
ОбластьСуммаПрописью.Параметры.ИтогоВес = "Общий вес (кг): " + Формат(ИтоговыйВес, "ЧЦ=15; ЧДЦ=3");
ОбластьСуммаПрописью.Параметры.ИтогоОбъем = "Общий объем (м3): " + Формат(ИтоговыйОбъем, "ЧЦ=15; ЧДЦ=3");

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

Обратите внимание на использование функции Формат. Для веса и объема критически важно задать количество знаков после запятой (обычно 3), иначе в печатной форме могут появиться числа с длинной «дробной частью» из-за особенностей хранения вещественных чисел в базе данных.

Универсальный способ через типовой механизм (рекомендовано)

Если вы хотите сделать решение максимально надежным и «красивым», проанализируем использование модуля УпаковкиЕдиницыИзмерения. В нем существует метод РассчитатьВесОбъемТабличнойЧасти, который делает всю работу за нас. Посмотрим на пример его использования для внешней печатной формы:


// Подготовим таблицу для расчета
ТаблицаДляРасчета = ТаблицаТовары.Скопировать();
// Убедимся, что колонки называются согласно требованиям функции
// Обычно в Счете это Номенклатура, Упаковка, Количество.

ДанныеВГХ = УпаковкиЕдиницыИзмерения.РассчитатьВесОбъемТабличнойЧасти(ТаблицаДляРасчета);

// Функция возвращает структуру с полями Вес и Объем
ИтоговыйВес   = ДанныеВГХ.Вес;
ИтоговыйОбъем = ДанныеВГХ.Объем;

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

Заключение

Мы рассмотрели несколько способов добавления веса и объема в печатную форму. Главное правило при работе с ВПФ в УТ 11 — стараться использовать существующие экспортные функции серверных модулей конфигурации. Это гарантирует, что при обновлении программы или изменении единиц хранения товаров ваши расчеты останутся верными.

Не забудьте проверить, заполнены ли соответствующие реквизиты в карточках номенклатуры на вкладке «Единицы измерения». Если вес или объем в справочнике равны нулю, то и в печатной форме вы получите нулевые значения, даже если программный код написан идеально.

← На главную