И снова ГИС ЖКХ.

После победы с формированием XML, осталось только обернуть всё в SOAP запрос. Самым простым в моём случае оказалось воспользоваться классом nusoap, Всё свелось примерно к такому коду:

$client = new nusoap_client('http://127.0.0.1:8080/ext-bus-debtreq-service/services/DebtRequestsAsync', false); // Сервер
$client->soap_defencoding = 'UTF-8'; // Кодировка запроса
$client->decode_utf8 = false; // Кодировка ответа


$soapaction = 'urn:exportDebtSubrequests';
$request_xml = file_get_contents("out.xml");
$result = $client->send($request_xml, $soapaction); 

Ткнулся сначала разбираться со штатным SoapClient, но там как оказалось, необходимо переписать весь код заново, для формирования XML. Да и мудрёно слишком.

PHP: Перевести из HEX В DEC

Оказывается перевести большое число из HEX в DEC, посредством PHP весьма затруднительно. Есть команда base_convert, но документация честно предупреждает, что если число большое — перевод будет «не точным» (ну на самом деле лучше бы вообще ошибку выдавали перевода, чем «не точную»). Поэтому пришлось использовать костыль с вызовом утилиты Linux:

echo "ibase=16;02496884004462130E23F941"|bc

1С: Явное указание даты в запросе

Очень бы хотелось в запросе указывать явную дату как во многих SQL, что-то типа:

И ДатаЗапуска='2025.07.16 12:13:14'

Но,ой. К сожалению 1С так делать не позволяет. Поэтому чтобы указать дату явно, не параметром запроса, приходится городить такую конструкцию:

справа="ДатаВремя("+Формат(Год(справа),"ЧГ=0")+","+Месяц(справа)+","+День(справа)+")";	
....
sql=sql+"и ДатаЗапуска>"+справа

Javascript: удаление элемента массива

В JavaScript как мне кажется не очень удобная реализация работы с массива. Наверное слишком низкоуровневая по сравнению с другими интерпретируемыми языками программирования. Возможно это даёт большую гибкость, но лично мне не удобно, что для простое удаление элемента массива по виду:

mass=[1,2,3,4];
delete mass[2];

Приводит на самом деле не к удалению элемента массива, а пометке, что элемент пустой. Многие пользуются командой splice:

mass=[1,2,3,4];
mass.splice(2,1)

Или даже filter:

brisks_mass=[1,2,3,4];
brisks_mass=brisks_mass.filter((number)=>number!==3) 

Но как говорится «Мне не зашло» (c), ибо есть с чем сравнивать удобство (Python, PHP и т.д.)

JavaScript: декодирование строки в Base64

Вообще штатно есть функции для кодирования/декодирования: atob / btoa. Но один нюанс: если строчку вида «Hello world!» они кодирую-декодируют легко, то с бинарными файлами выйдет ой. Не, они конечно тоже что-то сделают, но с «тихой ошибкой» — т.е. результат будет, но не верен. Попался так, когда с сервера передавал файл в base64 на клиент javascript, декодировал его примерно так:

let a = document.createElement("a");
let file = new Blob([atob(data.result)], {type: 'application/xlsx'});
a.href = URL.createObjectURL(file);
a.download = "template_0.xlsx";
a.click();

А в результате, с виду вроде бы валидный файл, экселем открываться отказался. А всё потому, что atob не работает со строками в Uicode. Потому обычно используют следующие обертки для кодирования-декодирования:

function base64ToBytes(base64) {
  const binString = atob(base64);
  return Uint8Array.from(binString, (m) => m.codePointAt(0));
}
function bytesToBase64(bytes) {
  const binString = String.fromCodePoint(...bytes);
  return btoa(binString);
}