Практические примеры#
В этом разделе рассмотрены два практических сценария: автоматическое создание пунктов маршрута для складов и определение перехода состояния документа.
Создание пункта маршрута для каждого склада#
1. SQL-запрос для получения списка складов. Получим ID и коды складов, у которых тип объекта «Склад» (stock) или «Склад в пути» (StockInWay). Полученные записи преобразуем в список с помощью метода asList().
var sqlStock = sql(`
SELECT stk.id as id, stk.sCode as sCode FROM stk_stock stk
JOIN btk_objecttype ot ON ot.id = stk.idObjectType
where ot.sCode = 'stock' OR ot.sCode = 'StockInWay'
`).asList()
2. Поиск пункта маршрута по коду склада. С помощью цикла for сделаем преобразование над полученными записями. По коду нашего склада получим id пункта маршрута.
var sqlStock = sql(`
SELECT stk.id as id, stk.sCode as sCode FROM stk_stock stk
JOIN btk_objecttype ot ON ot.id = stk.idObjectType
where ot.sCode = 'stock' OR ot.sCode = 'StockInWay'
`).asList()
for(r: sqlStock) {
var idvPoint = Tms_PointApi.findByMnemoCode(r.scode);
}
3. Создание нового пункта маршрута (если не найден). Если вернувшееся значение пункта маршрута равно null, то нужно создать его, заполнив код, название и привязку текущего склада.
var sqlStock = sql(`
SELECT stk.id as id, stk.sCode as sCode FROM stk_stock stk
JOIN btk_objecttype ot ON ot.id = stk.idObjectType
where ot.sCode = 'stock' OR ot.sCode = 'StockInWay'
`).asList()
for(r: sqlStock) {
var idvPoint = Tms_PointApi.findByMnemoCode(r.scode);
if (isNull(idvPoint)) {
var ropPoint = Tms_PointApi.insert();
Tms_PointApi.setsCode(ropPoint, r.scode);
Tms_PointApi.setsCaption(ropPoint, r.scode);
Tms_PointApi.setidStock(ropPoint, r.id);
}
}
4. Обновление существующего пункта маршрута (если не привязан к складу). Если полученный пункт маршрута существует, то загружаем его по полученному ранее id. Далее проверяем у полученного пункта маршрута привязку к складу, если значение равно null, то устанавливаем значение текущего склада.
var sqlStock = sql(`
SELECT stk.id as id, stk.sCode as sCode FROM stk_stock stk
JOIN btk_objecttype ot ON ot.id = stk.idObjectType
where ot.sCode = 'stock' OR ot.sCode = 'StockInWay'
`).asList()
for(r: sqlStock) {
var idvPoint = Tms_PointApi.findByMnemoCode(r.scode);
if (isNull(idvPoint)) {
var ropPoint = Tms_PointApi.insert();
Tms_PointApi.setsCode(ropPoint, r.scode);
Tms_PointApi.setsCaption(ropPoint, r.scode);
Tms_PointApi.setidStock(ropPoint, r.id);
} else {
var ropPointW = Tms_PointApi.load(idvPoint);
if (isNull(ropPointW.idStock)) {
Tms_PointApi.setidStock(ropPointW, r.id);
}
}
}
Определение перехода состояния документа#
1. Проверка на пустое старое значение:
if(isNull(oldValue)) return 0;
Если текущее состояние документа oldValue не задано, обработка прекращается (возвращается 0).
2. Получение порядковых номеров состояний:
var idStateFromOrder = Btk_ClassStateApi.getOrder(oldValue);
var idStateToOrder = Btk_ClassStateApi.getOrder(value);
idStateFromOrder - порядковый номер старого состояния документа.
idStateToOrder - порядковый номер нового состояния.
Получим текущее состояние документа, воспользовавшись API-методом класса состояния.
3. Проверка перехода состояния:
if(idStateFromOrder <= 100 && idStateToOrder > 100 && rop.idObjectType == Btk_ObjectTypeApi.findByMnemoCode("Tms_DeliveryAct"))
idStateFromOrder <= 100- проверяет, что текущее состояние документа имеет порядковый номер <= 100. Обычно это соответствует статусам «Аннулировано» или «Формируется».idStateToOrder > 100- проверяет, что новое состояние документа имеет порядковый номер больше 100.rop.idObjectType == Btk_ObjectTypeApi.findByMnemoCode("Tms_DeliveryAct")- убеждается, что работаем именно с документом типа «Рейс» (Tms_DeliveryAct).
Общий код:
if(isNull(oldValue))return 0;
var idStateFromOrder = Btk_ClassStateApi.getOrder(oldValue)
var idStateToOrder = Btk_ClassStateApi.getOrder(value);
if(idStateFromOrder <= 100 && idStateToOrder > 100 && rop.idObjectType == Btk_ObjectTypeApi.findByMnemoCode("Tms_DeliveryAct")){
// Обработка перехода состояния
}