Ознакомьтесь с полным списком формул в статье Основные формулы вывода данных из документа.
Перечисленные в данной статье формулы подходят только для вывода данных в отчете Остатки по товарам/по сериям. Формулы вписываются между началом и концом перебора.
<jx:forEach items="${rows}" var="row"> //формула по товару |
Стандартный шаблон отчета выводится с группировкой по категориям товара. В этом случае используется двойной перебор.
<jx:forEach items="${rows}" groupBy="category"> ${group.item.category} <jx:forEach items="${group.items}" var="row"> //формула по товару </jx:forEach> </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} | Дней на складе |
Основные поля из карточки товара
Формула | Значение |
${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} | НДС, % |
${row.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), а >0 на >1. Для последующих изображений в формуле указывается значение get(n-1) и >n-1, где n — порядковый номер изображения.
Упаковка
Формула | Значение |
${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.loadGood(row.goodRef.id).getGoodPacks().get(0).defaultBarcode.barcode} | Штрихкод |
Если необходим вывод второй по счету упаковки, то в формуле изменяется значение get(0) на get(1).
Модификация товара
Формула | Значение |
${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))} | Штрихкод серии |
Цены
Основного товара :
Формула | Значение |
${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.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.getExcelDate(formatter.findAttribute(formatter.loadGood (row.goodRef.id), "Название поля").timeValue)} | Дата |
${formatter.imageAttribute(formatter.loadGood(row.goodRef.id), "Название поля", false)} | Файл-изображение (по размеру ячейки) |
${formatter.printIfElse(formatter.findAttribute(formatter.loadGood (row.goodRef.id), "Название поля").booleanValue=="true", "Да", "Нет")} | Флажок |
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Название поля").entityValue.name} | Наименование из дополнительного справочника |
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Название поля").employeeValue.name} | Наименование из справочника сотрудников |
${formatter.findAttribute(formatter.loadGood(row.goodRef.id), "Название поля").agentValue.name} | Наименование из справочника контрагентов |
Остатки по складам
В шаблоне отчета Остатки по складам также используется дополнительный перебор по складам. Он расположен горизонтально в шаблоне и занимает три столбца, которые корректнее располагать в последних столбцах шаблона.
Формулы перебора прописываются в строках:
Шапка таблицы:
- столбец 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.positionName} | Наименование |
${row.uomName} | Ед.изм. |
${row.stock} | Остаток |