Формулы вывода данных в отчете Остатки по товарам/по сериям

Перечисленные ниже формулы выводятся в теле перебора по товарам.

Формула начала перебора <jx:forEach items="${rows}" var="row"> 

Формула окончания перебора </jx:forEach>

 

Стандартный шаблон отчета выводится с группировкой по категориям товара. В этом случае используется двойной перебор.

Первые три строки - открытие перебора:

<jx:forEach items="${rows}" groupBy="category"> 

${group.item.category}

<jx:forEach items="${group.items}" var="row">

Закрывается перебор двумя строкам:

</jx:forEach>

</jx:forEach>

 

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

Формулы перебора прописываются в строках:

шапка таблицы

 

столбец 1 - формула открытия перебора - <jx:forEach items="${batch.totalRow.stockTotal}" var="store">
столбец 2 - формула вывода названия склада - ${store.name}
столбец 3 - формула закрытия перебора - </jx:forEach>

в строке с формулой ${group.item.category}, если есть группировка по группам

столбец 1 - формула открытия перебора - <jx:forEach items="${batch.totalRow.stockTotal}" var="storeRow">
столбец 2 - пустой
столбец 3 - формула закрытия перебора - </jx:forEach>

в строке с формулами вывода данных о товаре

столбец 1 - формула открытия перебора - <jx:forEach items="${batch.totalRow.stockTotal}" var="storeRow">
столбец 2 - формула вывода остатка на складе - ${row.getStockByStore(storeRow.id)}
столбец 3 - формула закрытия перебора - </jx:forEach>

в строке с итоговыми по таблице 

столбец 1 - формула открытия перебора - <jx:forEach items="${batch.totalRow.stockTotal}" var="storeTotal">
столбец 2 - формула вывода суммы остатков на складе - ${batch.totalRow.getStockByStore(storeTotal.id)}
столбец 3 - формула закрытия перебора - </jx:forEach>

_______.png


Поля из отчета Остатки по товарам

Формула Значение
${row.modificationCode} Код
${row.productCode} Артикул
${row.name} Наименование
${row.uomName} Ед.изм.
${row.quantity} Доступно
${row.reserve} Резерв
${row.inTransit} Ожидание
${row.stock} Остаток
${row.price / 100} Себестоимость
${row.sumTotal / 100} Сумма
себестоимости
${row.salePrice / 100} Цена продажи
${row.saleAmount / 100} Сумма продажи
${row.AvgStockDays} Дней на складе

 

Поля из отчета Остатки по складам

Формула Значение
${row.modificationCode} Код
${row.productCode} Артикул
${row.positionName} Наименование
${row.uomName} Ед.изм.
${row.stock} Остаток

 

Поля из карточки товара

Основные поля 

Формула Значение
${formatter.loadGood(row.goodRef.id).name} Наименование
${formatter.loadGood(row.goodRef.id).code} Код
${formatter.loadGood(row.goodRef.id).productCode} Артикул
${formatter.loadGood(row.goodRef.id).parent.name} Группа
${formatter.loadGood(row.goodRef.id).country.name} Страна
${formatter.loadGood(row.goodRef.id).uom.name} Единица измерения наименование
${formatter.loadGood(row.goodRef.id).uom.code} Единица измерения код
${formatter.loadGood(row.goodRef.id).weight} Вес
${formatter.loadGood(row.goodRef.id).volume} Объем
${formatter.loadGood(row.goodRef.id).vat} НДС, %
${formatter.loadGood(row.goodRef.id).minimumBalance} Неснижаемый остаток
${formatter.loadGood(row.goodRef.id).supplier.name} Поставщик
${formatter.loadGood(row.goodRef.id).description}

Описание

${formatter.printIfElse(!empty(formatter.loadConsignment(row.getConsignmentID()).feature.description), formatter.loadConsignment(row.getConsignmentID()).feature.description, formatter.loadGood(row.goodRef.id).description)}

Описание с возможностью вывода описания модификации товара

 

Дополнительные поля 

Формула Значение
${formatter.loadGood(row.goodRef.id).externalCode} Внешний код
${formatter.loadGood(row.goodRef.id).id} Uuid
${formatter.loadGood(row.goodRef.id).updated} время последнего обновления
${formatter.loadGood(row.goodRef.id).updatedBy} инициатор последнего обновления

 

Владелец

Формула Значение
${formatter.loadGood(row.goodRef.id).getOwnerName()} Владелец- сотрудник
${formatter.loadGood(row.goodRef.id).getGroupName()} Владелец-отдел
${formatter.printIfElse(formatter.loadGood(row.goodRef.id).getShared(), "Да", "Нет")} Общий доступ

 

Изображение

первое по счету:

Формула Значение
${formatter.printIfElse(formatter.loadGood(row.goodRef.id).getImages().size()>0, formatter.image(formatter.loadGood(row.goodRef.id).getImages().get(0)), formatter.getNotFoundPicture())} Изображение основного товара по размеру ячейки
${formatter.printIfElse(formatter.loadGood(row.goodRef.id).getImages().size()>0, formatter.image(formatter.loadGood(row.goodRef.id).getImages().get(0), true), formatter.getNotFoundPicture())} Изображение основного товара в оригинальном размере
${formatter.printIfElse(formatter.loadConsignment(row.getConsignmentID()). feature.getImages().size()>0, formatter.image(formatter.loadConsignment(row.getConsignmentID()). feature.getImages().get(0)), formatter.getNotFoundPicture())} Изображение модификации товара по размеру ячейки
${formatter.printIfElse(formatter.loadConsignment(row.getConsignmentID()). feature.getImages().size()>0, formatter.image(formatter.loadConsignment(row.getConsignmentID()). feature.getImages().get(0), true), formatter.getNotFoundPicture())} Изображение модификации товара в оригинальном размере
${formatter.loadConsignment(row.getConsignmentID()) .feature.getImages().size()>0 ? formatter.image(formatter.loadConsignment(row.getConsignmentID()) .feature.getImages().get(0)) : formatter.printIfElse(formatter.loadGood(row.goodRef.id).getImages().size()>0, formatter.image(formatter.loadGood(row.goodRef.id).getImages().get(0)), formatter.getNotFoundPicture())} Изображение позиции по размеру ячейки
${formatter.loadConsignment(row.getConsignmentID()) .feature.getImages().size()>0 ? formatter.image(formatter.loadConsignment(row.getConsignmentID()) .feature.getImages().get(0), true) : formatter.printIfElse(formatter.loadGood(row.goodRef.id).getImages().size()>0, formatter.image(formatter.loadGood(row.goodRef.id).getImages().get(0), true), formatter.getNotFoundPicture())} Изображение позиции в оригинальном размере

Если необходим вывод второго по счету изображения из перечня, то в формуле изменяется значение get(0) на get(1).

 

Упаковка

Формула Значение
${formatter.loadGood(row.goodRef.id).getGoodPacks().get(0).uom.name} Наименование упаковки
${formatter.loadGood(row.goodRef.id).getGoodPacks().get(0).uom.code} Код упаковки
${formatter.loadGood(row.goodRef.id).getGoodPacks().get(0).quantity} Количество ед. в упаковке

 

Модификация товара

Формула Значение
${formatter.loadConsignment(row.getConsignmentID()).feature.name} Наименование
${formatter.loadConsignment(row.getConsignmentID()).feature.code} Код
${formatter.loadConsignment(row.getConsignmentID()) .feature.description} Описание
${formatter.findAttribute(formatter.loadConsignment(row.consignmentID) .getFeature(), "цвет").value} Характеристика:цвет
${formatter.printIf(!empty(formatter.loadConsignment(row.getConsignmentID()) .feature.name), formatter.loadConsignment(row.getConsignmentID()).feature.externalCode)} Внешний код
${formatter.printIf(!empty(formatter.loadConsignment(row.getConsignmentID()) .feature.name), formatter.loadConsignment(row.getConsignmentID()).feature.id)} Uuid

 

Другое

Формула Значение
${formatter.loadConsignment(row.consignmentID).externalCode} Внешний код по умолчанию
${formatter.loadConsignment(row.consignmentID).id} UUID по умолчанию
${formatter.printIf(!row.defaultConsignment, row.consignmentName)} Серия

 

Штрихкод

Цифровой:

Формула Значение
${formatter.printIf(formatter.loadGood(row.goodRef.id).getBarcodes().size() > 0, formatter.loadGood(row.goodRef.id).defaultBarcode.barcode)} Штрихкод товара
${formatter.printIf(!empty (formatter.loadConsignment(row.getConsignmentID()).feature.name) && formatter.loadConsignment(row.getConsignmentID()).getBarcodes().size() > 0, formatter.loadConsignment(row.consignmentID).feature.defaultBarcode.barcode)} Штрихкод модификации
${formatter.printIf(formatter.loadConsignment(row.getConsignmentID()) .getBarcodes().size() > 0, formatter.printIfElse(!empty (formatter.loadConsignment(row.getConsignmentID()).feature.name), formatter.loadConsignment(row.getConsignmentID()) .getBarcodes().get(0).barcode, formatter.printIf(formatter.loadGood(row.goodRef.id).getBarcodes().size() > 0, formatter.loadGood(row.goodRef.id).getBarcodes().get(0).barcode)))} Штрихкод с проверкой на наличие модификации
${formatter.printIf(!row.defaultConsignment && formatter.loadConsignment(row.consignmentID).getBarcodes().size() > 0, formatter.loadConsignment(row.consignmentID).defaultBarcode.barcode)} Штрихкод серии
${formatter.printBarcodeList(formatter.loadGood(row.goodRef.id).barcodes)} Все штрихкоды товара через запятую
${formatter.printBarcodeList(formatter.loadConsignment(row.consignmentID))} Все штрихкоды модификации через запятую

Графический:

Формула Значение
${barcode4j.generateCode(formatter.loadGood(row.goodRef.id) .defaultBarcode. barcodeType, formatter.loadGood(row.goodRef.id).defaultBarcode.barcode, null, null, "0.3", "9", null, null, null, null, null, null)} Штрихкод товара
${formatter.printIf(!empty( formatter.loadConsignment(row.getConsignmentID()).feature.name) && formatter.loadConsignment(row.getConsignmentID()).getBarcodes().size() > 0, barcode4j.generateCode(formatter.loadConsignment(row.consignmentID) .defaultBarcode. barcodeType, formatter.loadConsignment(row.consignmentID).feature.defaultBarcode.barcode, null, null, "0.3", "9", null, null, null, null, null, null))} Штрихкод модификации
${formatter.printIf(formatter.loadConsignment(row.getConsignmentID()) .getBarcodes().size() > 0, formatter.printIfElse(!empty( formatter.loadConsignment(row.getConsignmentID()).feature.name), barcode4j.generateCode(formatter.loadConsignment(row.consignmentID) .feature.defaultBarcode. barcodeType, formatter.loadConsignment(row.getConsignmentID()) .getBarcodes().get(0).barcode, null, null, "0.3", "9", null, null, null, null, null, null), formatter.printIf(formatter.loadGood(row.goodRef.id).getBarcodes().size() > 0, barcode4j.generateCode(formatter.loadGood(row.goodRef.id).defaultBarcode. barcodeType, formatter.loadGood(row.goodRef.id).getBarcodes().get(0).barcode, null, null, "0.3", "9", null, null, null, null, null, null))))} Штрихкод с проверкой на наличие модификации
${formatter.printIf(!row.defaultConsignment && formatter.loadConsignment(row.consignmentID).getBarcodes().size() > 0, barcode4j.generateCode(formatter.loadConsignment(row.consignmentID) .defaultBarcode. barcodeType, formatter.loadConsignment(row.consignmentID).defaultBarcode.barcode, null, null, "0.3", "9", null, null, null, null, null, null))} Штрихкод серии
${barcode4j.generateCode(formatter.loadConsignment (position.consignment.id). feature.defaultBarcode.barcodeType,  formatter.loadConsignment(position.consignment.id) .feature.defaultBarcode.barcode ,null, null, "0.3", "9", null, null, null, null, null, null)} Штрихкод позиции

 

 

Цены

Основного товара :

Формула Значение
${formatter.loadGood(row.goodRef.id).minPrice / 100} Минимальная цена 
${formatter.loadGood(row.goodRef.id).buyPrice/100} Закупочная цена
${formatter.loadGood(row.goodRef.id).buyCurrency.name} Валюта закупочной цены
${formatter.loadGood(row.goodRef.id).salePrice/100} Цена продажи
${formatter.loadGood(row.goodRef.id).saleCurrency.name} Валюта цены продажи
${formatter.loadGood(row.goodRef.id) .salePrices.findPrice("Опт").value / 100} Дополнительная цена продажи ("Опт")
${formatter.loadGood(row.goodRef.id) .salePrices.findPrice("Опт").currency.name} Валюта цены продажи ("Опт")

С учетом цен модификаций:

Формула Значение
${formatter.loadConsignment(row.consignmentID) .feature.effectiveMinPrice/100} Минимальная цена 
${formatter.loadConsignment(row.consignmentID) .feature.effectiveBuyPriceValue/100} Закупочная цена
${formatter.loadConsignment(row.consignmentID) .feature.effectiveBuyPriceCurrency.name} Валюта закупочной цены
${formatter.loadConsignment(row.consignmentID) .feature.effectiveSalePrice/100} Цена продажи
${formatter.loadConsignment(row.consignmentID) .feature.effectiveSalePrices.defaultPrice.currency.name} Валюта цены продажи
${formatter.loadConsignment(row.consignmentID) .feature.effectiveSalePrices.findPrice("Опт").priceValue/100} Дополнительная цена продажи ("Опт")
${formatter.loadConsignment(row.consignmentID) .feature.effectiveSalePrices.findPrice("Опт").currency.name} Валюта цены продажи ("Опт")

 

Дополнительные поля

Общим правилом оформления формулы вывода дополнительного поля из карточки товара является структура 

${formatter.findAttribute(position.good, "Наименование поля").value}

Основные параметры: 

  • formatter.loadGood(row.goodRef.id) - указатель на источник данных - карточка товара.
  • "Наименование поля" - точное наименование дополнительного поля в кавычках (с учетом регистра, дополнительных символов и т.д.).
  • value - тип, по которому создано пользовательское поле.

 

Формула Тип поля
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").valueText} Текст
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").valueString} Строка
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").value} Ссылка
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").longValue} Число целое
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").doubleValue} Число дробное
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").timeValue} Дата
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").entityValue.name} Дополнительный справочник - Наименование
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").entityValue.code} Дополнительный справочник - Код
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Наименование поля").entityValue.description} Дополнительный справочник -  Комментарий
Еще есть вопросы? Отправить запрос

Комментарии