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

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

Ознакомьтесь с полным списком формул в статье Основные формулы вывода данных из документа.

Перечисленные в данной статье формулы подходят только для вывода данных в отчете Остатки по товарам/по партиям. Формулы вписываются между началом и концом перебора.

<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}Остаток