Формулы вывода данных в отчете Остатки по товарам/по партиям
Ознакомьтесь с полным списком формул в статье Основные формулы вывода данных из документа.
Перечисленные в данной статье формулы подходят только для вывода данных в отчете Остатки по товарам/по партиям. Формулы вписываются между началом и концом перебора.
<jx:forEach items="${o.positions}" var="row">
// формула по товару
</jx:forEach>Стандартный шаблон отчета выводится с группировкой по категориям товара. В этом случае используется двойной перебор.
<jx:forEach items="${rows}" var="row">
// формула по товару
</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.loadConsignment(row.consignmentID).getTnvedCode()} | ТН ВЭД |
| ${formatter.getTargetGender(formatter.loadGood(row.goodRef.id))} | Целевой пол |
Упаковка
| Формула | Значение |
| ${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} | Остаток |