Объемно-сортовой учет (ОСУ) является упрощением поэкземплярного учета, при котором в УПД перечисляются все коды маркировки. В ОСУ не указываются коды маркировки, а указываются только GTIN продукции и ее количество. Это позволяет оптовикам и предприятиям общественного питания работать с маркированными товарами как с немаркированными, указывая в УПД только наименование, штрихкод и количество (без сканирования и перечисления кодов маркировки).
Как работать по объемно-сортовому учету для каждой маркированной товарной группы, можно ознакомиться на сайте «Честного знака» (пример для воды).
Какие дополнительные поля в позиции требуется заполнять и для чего, можно уточнить в методических рекомендациях по заполнению тегов для разработчиков кассового ПО.
Для продажи товаров по ОСУ требуется выполнить регистрацию или перерегистрацию кассы с указанием новых признаков торговли по ОСУ. Для этого на этапе выбора вида деятельности потребуется указать один из (или оба) признаков:

Ваше приложение может проверить, выбрал ли пользователь эти признаки при регистрации, для этого потребуется вызвать метод:
FsApi.getLastFsFiscalizationDocument()
В полученном объекте FsFiscalizationDocument есть поле workModeFlags, которое можно сравнить с таблицей 103 ФФД и выяснить, какие признаки условий применения ККТ выбраны в последнем отчёте о регистрации.
Чтобы ваше приложение заполнило признаки ОСУ в позиции, нужно будет обновить версию интеграционной библиотеки до 0.6.33 или выше. Дополнительно потребуется указать в манифесте приложения новое разрешение:
<uses-permission android:name="ru.evotor.permission.receipt.volumeSortAccounting.SET " />
В объект Position добавляется новое поле volumeSortAccountingRealization. Поле заполняется новым объектом VolumeSortAccountingRealization:
data class VolumeSortAccounting(
/**
* Идентификатор продукта GTIN
*/
val gtin: String,
/**
* Количество товара по ОСУ
*/
val quantity: BigDecimal? = null,
/**
* Тип выбытия по ОСУ
*/
val type: RealizationType = RealizationType.HORECA
)
На данный момент существует два типа выбытия по ОСУ:
Объемно-сортовой учет поддерживается не для всех видов товара, на данный момент выбытие по ОСУ доступно для товаров:
Пример формирования позиции:
Position.Builder.newInstance(
UUID.randomUUID().toString(),
null,
"Маркированная вода",
Measure("шт", 1, 0),
BigDecimal(1000),
BigDecimal(5000)
).toWaterMarked(
Mark.RawMark("04650057074361")
).setVolumeSortAccounting(
"04650057074361",
BigDecimal(5000),
RealizationType.HORECA
).build()
Обязательно требуется заполнить mark в позиции, так как добавить маркированную позицию без кода маркировки нельзя, поле mark нужно заполнить значением GTIN из кода маркировки.
В возврате «На основании чека» EvotorPOS восстанавливает из чека продажи и данные по ОСУ. При этом считывание марки для таких позиций не запрашивается. Через интерфейс есть возможность изменить только количество товара в позиции, количества товара по ОСУ (в интерфейсе EvotorPOS) изменить нельзя, поэтому приложение может подписаться на событие изменения позиции в чеках возврата и предлагать кассиру изменить количество товара по ОСУ в отредактированной позиции.
Проверьте, что код версии EvotorPOS не ниже 8210100, если код версии EvotorPOS ниже 8210100, то данные по ОСУ не применятся. Пример проверки кода версии приложения с помощью PackageManager:
val evotorPosVersionCode = packageManager.getPackageInfo("ru.atol.tabletpos", 0)
.versionCode
Обязательно используйте deprecated поле versionCode, а не новое поле longVersionCode (которое появилось в Android API 34) для совместимости со всеми версиями ОС Эвотор.