При оформлении оптовых заказов и выставлении счетов покупателям часто требуется отображать не только количественные показатели и суммы, но и суммарные весовые характеристики товаров. Это необходимо для расчета стоимости логистики и подбора подходящего транспорта. Разберем по шагам, как реализовать учет веса номенклатуры в конфигурациях на обычных формах (на примере «1С:Управление торговлей 10.3»), вывести его в табличную часть документа СчетНаОплатуПокупателю и рассчитать суммарный вес в печатной форме.
Прежде чем приступать к доработке конфигурации, проанализируем доступные варианты хранения информации о весе:
ЕдиницыИзмерения. В нем для каждой единицы (базовой, единицы хранения остатков, единицы мест) уже предусмотрен реквизит Вес. Если заполнить вес в единице хранения остатков, добавлять новые реквизиты в конфигураторе не потребуется.ЗначенияСвойствОбъектов.Номенклатура добавляется реквизит (например, ВесТовара с типом Число, длина 10, точность 3) и выводится на форму элемента.Выясним, каким способом лучше отобразить вес позиции в табличной части Товары документа СчетНаОплатуПокупателю. Существует два основных подхода:
Вариант 1. Динамическое отображение без создания реквизита в базе данных.
Этот вариант подходит, если вес не должен жестко фиксироваться в строке документа. Добавляем в табличное поле на форме документа новую колонку с именем Вес (без привязки к данным) и используем обработчики событий табличного поля.
Рассмотрим простейший способ заполнения ячейки через событие ПриВыводеСтроки:
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Получаем вес на единицу и рассчитываем общий вес строки
Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
ВесЕдиницы = ДанныеСтроки.Номенклатура.ВесТовара;
ВесСтроки = ВесЕдиницы * ДанныеСтроки.Количество;
ОформлениеСтроки.Ячейки.Вес.УстановитьТекст(Строка(ВесСтроки));
КонецЕсли;
КонецПроцедуры
Важно: прямое обращение через точку ДанныеСтроки.Номенклатура.ВесТовара в событии ПриВыводеСтроки создает дополнительные запросы к базе данных при прокрутке списка. Для оптимизации быстродействия больших документов рекомендуется использовать обработчик ПриПолученииДанных, где веса всех отображаемых строк считываются одним пакетным запросом.
Вариант 2. Добавление физического реквизита в табличную часть документа.
Если требуется зафиксировать вес на момент выставления счета (чтобы при изменении веса в карточке старые документы не менялись), добавляем реквизит ВесТовара в табличную часть Товары самого документа. В таком случае напишем код автозаполнения в модуле формы документа:
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
Если СтрокаТабличнойЧасти <> Неопределено И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
СтрокаТабличнойЧасти.ВесТовара = СтрокаТабличнойЧасти.Номенклатура.ВесТовара * СтрокаТабличнойЧасти.Количество;
КонецЕсли;
КонецПроцедуры
Процедура ТоварыКоличествоПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
Если СтрокаТабличнойЧасти <> Неопределено И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
СтрокаТабличнойЧасти.ВесТовара = СтрокаТабличнойЧасти.Номенклатура.ВесТовара * СтрокаТабличнойЧасти.Количество;
КонецЕсли;
КонецПроцедуры
Разберем, как вывести колонку с весом и итоговый вес по всему документу в печатную форму счета на оплату. Рекомендуется создать внешнюю печатную форму (ВПФ), чтобы не снимать документ с типовой поддержки.
Посмотрим на пример модификации текста запроса, формирующего данные для вывода строк счета:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Счет.Номенклатура КАК Номенклатура,
| Счет.Номенклатура.Артикул КАК Артикул,
| Счет.Номенклатура.НаименованиеПолное КАК Товар,
| Счет.Количество КАК Количество,
| Счет.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Счет.Цена КАК Цена,
| Счет.Сумма КАК Сумма,
| Счет.СуммаНДС КАК СуммаНДС,
| // Расчет общего веса по строке с учетом количества:
| ЕСТЬNULL(Счет.Номенклатура.ВесТовара, 0) * Счет.Количество КАК ВесСтроки
|ИЗ
| Документ.СчетНаОплатуПокупателю.Товары КАК Счет
|ГДЕ
| Счет.Ссылка = &ТекущийДокумент
|ИТОГИ
| СУММА(Количество),
| СУММА(Сумма),
| СУММА(ВесСтроки)
|ПО
| ОБЩИЕ";
Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаДокумент);
Результат = Запрос.Выполнить();
После формирования запроса внесем изменения в макет печатной формы и алгоритм вывода:
ШапкаТаблицы добавляем колонку «Вес (кг)».Строка в соответствующую ячейку прописываем параметр ВесСтроки.
ВыборкаСтрок = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСУпорядочиванием);
Пока ВыборкаСтрок.Следующий() Цикл
// Заполнение параметров строки
ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрок);
ОбластьСтрока.Параметры.ВесСтроки = ВыборкаСтрок.ВесСтроки;
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Итого (или ПодвалТаблицы) макета добавляем параметр для суммарного веса (например, ИтогоВес) и передаем туда значение из общих итогов запроса:
ВыборкаОбщиеИтоги = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Если ВыборкаОбщиеИтоги.Следующий() Тогда
ОбластьПодвал.Параметры.ИтогоВес = ВыборкаОбщиеИтоги.ВесСтроки;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьПодвал);
Таким образом, мы связали вес из карточки номенклатуры с табличной частью счета на оплату и обеспечили автоматический расчет общего веса груза в печатном документе.