Потребовалось в клиентском скрипте из поля типа Document ID получение tableId и recordId. Но функции, необходимые для их получения, есть только в серверном API. Чтобы не вызывать эти функции из клиентских скриптов через ajax, написал их аналоги.
function getDocIdByIds(tableId,recordId) {
const decimalToHexWithPadding = (str) =>
BigInt(str.trim()).toString(16).padStart(16, '0');
return decimalToHexWithPadding(tableId)+decimalToHexWithPadding(recordId);
}
function getTableIdByDocId(docId) {
if (docId.length !== 32) return;
const hexToDec = hex => BigInt('0x' + hex).toString();
const first16 = s => s.slice(0,16);
return hexToDec(first16(docId));
}
function getRecordIdByDocId(docId) {
if (docId.length !== 32) return;
const hexToDec = hex => BigInt('0x' + hex).toString();
const last16 = s => s.slice(-16);
return hexToDec(last16(docId));
}
Провел еще одно небольшое исследование. Ниже вариант, полностью эмулирующий поведение коробочных функций с небольшим улучшением функции getDocIdByIds() в виде
отсутсвия падения скрипта при некорректных входных данных.
А поделитесь кейсом, когда необходимо применять этот подход.
Зачастую в интеграции пользуюсь getDocIdByIds() и каких-то проблем не наблюдаю. Интересно в каких случаях появляются сложности.
Первый вариант вполне коректен, но в процессе тестирования нашел, что внутри системы обработка входных данных происходит немного по другому от моего решения. Второй вариант скрипта работает совсем как коробка (надеюсь).
Для тестирования можно в серверном скрипте вызывать что-то типа такого и сравнить ответ от двух вариантов реализации: