Как добавить вес номенклатуры в карточку товара, документ «Счет на оплату» и печатную форму в 1С?

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

При оформлении оптовых заказов и выставлении счетов покупателям часто требуется отображать не только количественные показатели и суммы, но и суммарные весовые характеристики товаров. Это необходимо для расчета стоимости логистики и подбора подходящего транспорта. Разберем по шагам, как реализовать учет веса номенклатуры в конфигурациях на обычных формах (на примере «1С:Управление торговлей 10.3»), вывести его в табличную часть документа СчетНаОплатуПокупателю и рассчитать суммарный вес в печатной форме.

Шаг 1. Анализ способов хранения веса в справочнике «Номенклатура»

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

  1. Использование штатного механизма единиц измерения. В типовой конфигурации «Управление торговлей 10.3» у каждой номенклатурной позиции есть подчиненный справочник ЕдиницыИзмерения. В нем для каждой единицы (базовой, единицы хранения остатков, единицы мест) уже предусмотрен реквизит Вес. Если заполнить вес в единице хранения остатков, добавлять новые реквизиты в конфигураторе не потребуется.
  2. Использование дополнительных свойств (ПВХ «Свойства объектов»). Позволяет задать вес через пользовательский режим без снятия конфигурации с поддержки. Значения будут храниться в регистре сведений ЗначенияСвойствОбъектов.
  3. Добавление отдельного реквизита в справочник «Номенклатура». Если требуется быстрый прямой доступ к реквизиту без пересчетов единиц, в конфигураторе в справочник Номенклатура добавляется реквизит (например, ВесТовара с типом Число, длина 10, точность 3) и выводится на форму элемента.

Шаг 2. Отображение веса в табличной части документа «Счет на оплату»

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

Вариант 1. Динамическое отображение без создания реквизита в базе данных.

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

Рассмотрим простейший способ заполнения ячейки через событие ПриВыводеСтроки:


Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Получаем вес на единицу и рассчитываем общий вес строки
    Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
        ВесЕдиницы = ДанныеСтроки.Номенклатура.ВесТовара;
        ВесСтроки = ВесЕдиницы * ДанныеСтроки.Количество;
        ОформлениеСтроки.Ячейки.Вес.УстановитьТекст(Строка(ВесСтроки));
    КонецЕсли;
    
КонецПроцедуры

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

Вариант 2. Добавление физического реквизита в табличную часть документа.

Если требуется зафиксировать вес на момент выставления счета (чтобы при изменении веса в карточке старые документы не менялись), добавляем реквизит ВесТовара в табличную часть Товары самого документа. В таком случае напишем код автозаполнения в модуле формы документа:


Процедура ТоварыНоменклатураПриИзменении(Элемент)
    
    СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
    Если СтрокаТабличнойЧасти <> Неопределено И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
        СтрокаТабличнойЧасти.ВесТовара = СтрокаТабличнойЧасти.Номенклатура.ВесТовара * СтрокаТабличнойЧасти.Количество;
    КонецЕсли;
    
КонецПроцедуры

Процедура ТоварыКоличествоПриИзменении(Элемент)
    
    СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
    Если СтрокаТабличнойЧасти <> Неопределено И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
        СтрокаТабличнойЧасти.ВесТовара = СтрокаТабличнойЧасти.Номенклатура.ВесТовара * СтрокаТабличнойЧасти.Количество;
    КонецЕсли;
    
КонецПроцедуры

Шаг 3. Доработка печатной формы и расчет общего веса

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

Посмотрим на пример модификации текста запроса, формирующего данные для вывода строк счета:


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

Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаДокумент);
Результат = Запрос.Выполнить();

После формирования запроса внесем изменения в макет печатной формы и алгоритм вывода:

  1. В макете печатной формы в области ШапкаТаблицы добавляем колонку «Вес (кг)».
  2. В области Строка в соответствующую ячейку прописываем параметр ВесСтроки.
  3. В цикле обхода строк результата запроса заполняем параметры области:
    
    ВыборкаСтрок = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСУпорядочиванием);
    Пока ВыборкаСтрок.Следующий() Цикл
        // Заполнение параметров строки
        ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрок);
        ОбластьСтрока.Параметры.ВесСтроки = ВыборкаСтрок.ВесСтроки;
        ТабличныйДокумент.Вывести(ОбластьСтрока);
    КонецЦикла;
    
  4. В области Итого (или ПодвалТаблицы) макета добавляем параметр для суммарного веса (например, ИтогоВес) и передаем туда значение из общих итогов запроса:
    
    ВыборкаОбщиеИтоги = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Если ВыборкаОбщиеИтоги.Следующий() Тогда
        ОбластьПодвал.Параметры.ИтогоВес = ВыборкаОбщиеИтоги.ВесСтроки;
    КонецЕсли;
    ТабличныйДокумент.Вывести(ОбластьПодвал);
    

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

← На главную