Перечисленные ниже формулы выводятся в теле перебора по товарам.
Формула начала перебора <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>
Поля из отчета Остатки по товарам
Формула | Значение |
${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} | Дополнительный справочник - Комментарий |