При работе с конфигурацией 1С:Управление торговлей 11 (УТ 11) часто возникает необходимость дополнить стандартные печатные формы (например, Счет на оплату или Реализацию товаров и услуг) данными о весогабаритных характеристиках (ВГХ). Это особенно актуально для отделов логистики и складов. В данной статье мы разберем, как «добить» модуль внешней печатной формы (ВПФ), чтобы в подвале документа корректно отображались суммарный вес и объем всех товаров.
Прежде чем приступать к написанию кода, проанализируем ситуацию. Нам нужно вывести итоговые значения, а не колонки для каждой строки. Это упрощает задачу: нам не нужно менять структуру таблицы в макете, достаточно добавить новые параметры в область подвала. Рассмотрим последовательность действий:
ПФ_MXL_СчетНаОплату).СуммаПрописью или ПодвалТаблицы).ИтогоВес и ИтогоОбъем.В типовых решениях на базе БСП (Библиотеки стандартных подсистем), к которым относится и УТ 11, печать обычно реализована через формирование структуры ДанныеДляПечати. Нам нужно убедиться, что данные о весе и объеме попадают в таблицу товаров, которую мы обходим в цикле. Проанализируем фрагмент кода из модуля:
// В процедуре ЗаполнитьТабличныйДокументСчетаНаОплату
Товары = ДанныеДляПечати.РезультатПоТабличнойЧасти.Выгрузить();
Проблема заключается в том, что стандартный запрос может не выбирать поля веса и объема из карточки номенклатуры. У нас есть два пути: модифицировать запрос (что требует глубокого погружения в ПечатьСчетаНаОплату.ПодготовитьДанныеДляПечати) или получить эти данные непосредственно в цикле формирования печатной формы. Рассмотрим второй вариант как более простой для внешней печатной формы.
Разберем, как правильно реализовать накопление итогов. Мы не можем просто умножить количество на ЕдиницаИзмерения.Вес, так как в современных версиях УТ 11 весовые характеристики хранятся в справочнике УпаковкиЕдиницыИзмерения или реквизитах номенклатуры в зависимости от настроек. Рассмотрим правильный алгоритм внутри цикла обхода товаров:
// Перед началом цикла инициализируем переменные для итогов
ИтоговыйВес = 0;
ИтоговыйОбъем = 0;
Для Каждого СтрокаТовары Из ТаблицаТовары Цикл
// ... здесь идет стандартный код формирования строки макета ...
// Получаем данные ВГХ для текущей номенклатуры
// В УТ 11 рекомендуется использовать типовые функции для точности
СтруктураВГХ = НоменклатураСервер.ПолучитьВГХНоменклатуры(СтрокаТовары.Номенклатура, СтрокаТовары.Упаковка);
Если СтруктураВГХ <> Неопределено Тогда
ТекущийВес = ?(ЗначениеЗаполнено(СтруктураВГХ.Вес), СтруктураВГХ.Вес, 0);
ТекущийОбъем = ?(ЗначениеЗаполнено(СтруктураВГХ.Объем), СтруктураВГХ.Объем, 0);
ИтоговыйВес = ИтоговыйВес + (ТекущийВес * СтрокаТовары.Количество);
ИтоговыйОбъем = ИтоговыйОбъем + (ТекущийОбъем * СтрокаТовары.Количество);
КонецЕсли;
// ... продолжение цикла ...
КонецЦикла;
Выясним причину, почему стоит использовать НоменклатураСервер.ПолучитьВГХНоменклатуры. Эта функция учитывает, используются ли упаковки, и возвращает корректные коэффициенты пересчета веса и объема именно для той единицы измерения, которая указана в документе. Если же мы будем обращаться напрямую к реквизитам справочника через точку, мы рискуем получить некорректные данные, если товар отгружается в коробках, а вес указан за штуку.
Теперь нам нужно передать накопленные значения в параметры макета. Проанализируем ситуацию: обычно область подвала получается и выводится один раз после завершения цикла по товарам. Нам нужно найти место, где инициализируется область ОбластьСуммаПрописью (или аналогичная ей).
Рассмотрим пример кода для вывода:
// Находим область, где мы добавили параметры
ОбластьСуммаПрописью = Макет.ПолучитьОбласть("СуммаПрописью");
// Заполняем наши новые параметры
ОбластьСуммаПрописью.Параметры.ИтогоВес = "Общий вес (кг): " + Формат(ИтоговыйВес, "ЧЦ=15; ЧДЦ=3");
ОбластьСуммаПрописью.Параметры.ИтогоОбъем = "Общий объем (м3): " + Формат(ИтоговыйОбъем, "ЧЦ=15; ЧДЦ=3");
// Выводим область в табличный документ
ТабличныйДокумент.Вывести(ОбластьСуммаПрописью);
Обратите внимание на использование функции Формат. Для веса и объема критически важно задать количество знаков после запятой (обычно 3), иначе в печатной форме могут появиться числа с длинной «дробной частью» из-за особенностей хранения вещественных чисел в базе данных.
Если вы хотите сделать решение максимально надежным и «красивым», проанализируем использование модуля УпаковкиЕдиницыИзмерения. В нем существует метод РассчитатьВесОбъемТабличнойЧасти, который делает всю работу за нас. Посмотрим на пример его использования для внешней печатной формы:
// Подготовим таблицу для расчета
ТаблицаДляРасчета = ТаблицаТовары.Скопировать();
// Убедимся, что колонки называются согласно требованиям функции
// Обычно в Счете это Номенклатура, Упаковка, Количество.
ДанныеВГХ = УпаковкиЕдиницыИзмерения.РассчитатьВесОбъемТабличнойЧасти(ТаблицаДляРасчета);
// Функция возвращает структуру с полями Вес и Объем
ИтоговыйВес = ДанныеВГХ.Вес;
ИтоговыйОбъем = ДанныеВГХ.Объем;
Этот способ является предпочтительным, так как он полностью соответствует логике типовой конфигурации и автоматически учитывает все нюансы пересчета упаковок в базовые единицы измерения веса (килограммы) и объема (кубические метры).
Мы рассмотрели несколько способов добавления веса и объема в печатную форму. Главное правило при работе с ВПФ в УТ 11 — стараться использовать существующие экспортные функции серверных модулей конфигурации. Это гарантирует, что при обновлении программы или изменении единиц хранения товаров ваши расчеты останутся верными.
Не забудьте проверить, заполнены ли соответствующие реквизиты в карточках номенклатуры на вкладке «Единицы измерения». Если вес или объем в справочнике равны нулю, то и в печатной форме вы получите нулевые значения, даже если программный код написан идеально.