<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Везде 🙂
Вот уже подошел 8.2.10.73 — и по-прежнему в Firefox блокируется буфер обмена. Соответственно, фирменная фишка «Переход по ссылке» не работает…
1С довольно жёстко требует указания типов. Сколько при мне не пинали 1С они очень хорошо отсылают к стандарту где написано «так можно, а так нельзя». Вполне возможно что это ПХП вольно обращается со стандартами.
Читал я стандарт. Там достаточно лояльные правила… Хотя PHP один из последних получил поддержку SOAP и не в лучшем виде. А во вторых, что мне не нравится в Microsoft и 1С — это то, как они стандарты понимают.. Почему-то они это делают ОЧЕНЬ по своему. И если Microsoft я могу понять(у них только один человек в компании имеет право читать чужие исходные тексты), то 1С???
(3) А остался у вас где-нибудь «нерабочий 1С» веб-сервис на сервере? А то я хочу посмотреть лучше с ним справится .Net (http://infostart.ru/public/61457/) или нет…
(4) В каком смысле лучше? Быстрее или надежней? Какие критерии?
Связка 1с-.net-1c работает просто замечательно. никаких проблем не возникало и скорость приличная. на своем опыте опробовал… 😉
Возможно php не включает в сообщения поля которые могут быть не заполнены, а 1с их ожидает, вот и ошибка.
С Netи даже с 1с, в качестве сервиса, может быть та же петрушка.
(5) Сможет вызвать без ошибок, о которых в статье говорится, или нет
(8)http://it.selenia.ru/services.php?wsdl Сейчас функция возвращает строковое значение. Проверял на нормальных клиентах. Входные параметры: 1. строка 2. шаблон в стиле перл(ради него в php и полез). Хотите поиграйтесь. Подключить без ошибки получилось. Вызвать нормально нет. Причем, сервис отрабатывает нормально. Для .Net надо IIS поднимать, VS скачивать. Лень если честно, но видно придется.
(9) не всё у тебя хорошо. Вот ответ твоего сервиса приличному SOAP клиенту. Ненравится твоему сервису нормальный клиент.
Показать
(10) До обработки «не правильных» параметров, я даже не добрался… Попробуй:
Первый параметр aaa, второй /aaa/i.
(11) э-э-э-э. Ошибку даёт при открытии браузеромhttp://it.selenia.ru/services.php
Parse error: syntax error, unexpected T_ELSE in /usr/local/www/it/services.php on line 34
(11) Не помогает.
(10) Все… Теперь нет ошибки при неправильном шаблоне… Спасибо, за найденную ошибку..
(13) (12) Я просто исправлял код… Щас поставлю VS web IIS опробую на них..
Для тех кто верит в .Net:
Показать
Вылетело… (6)(7)(13)
SoapUI работает с сервисом. 1С не хочет. Подробно не колупал. Работа свалилась.
ну может еще таблицу значений из 1с попытаться в net передать… 😀
определяешь в 1с структуру данных, в net ее читаешь из 1с, заполняешь и обратно в 1с передаешь, вот тебе и будет твой массив.
(18)
1. Я прекрасно понимаю, что для реализации веб сервиса требуется гораздо меньше усилий, чем для реализации клиента. Не надо только ловить меня на этом. Для пользователя(конечного программиста) вроде меня все просто. А для того кто пишет уровнем ниже (1С или Microsoft) все сложнее. Генерация описания — гораздо проще реализовать, чем его адекватное чтение. Я просто не понимаю как можно объявлять о полной (сервера и клиента) поддержке веб сервисов, если она только реализована для серверной части. Ну не можете летать, так не декларируйте этого. Или опишите ограничения. Летаем в пятницу, в качестве эксперимента, если будет дождь. По моему так.
2. А почему нет? Что должно помешать? И зачем передавать массив если он изначально пустой и нужен мне как результат работы? XML предполагает множественные значения.
(19)
Да, мои разработки не летают, от них этого не требуеся. Я же не в NASA и даже не ЦУПе работаю… 😀
2. Почему я пишу Ответ = Истина и в то же время в той же 1с Запрос = Новый Запрос. Ну зачем его объявлять? Она жесама 1с, неужто такая тупая не поймет что мне запрос и нужен? Зачем в С# объявлять размерность массива, вдруг он изменится.
Любая система предполагает определенные правила работы с ней. Не желание работать по этим правилам не говорит о тупости и кривости системы.
И web-сервисы 1с поддерживает как свои так и внешние(начиная с версии 8.1).
(9) Импортировать WSDL в 1С получилось, вызвать, почему-то нет. Пишет «Сервис не найден {http://it.selenia.ru/services.php }:AWK».
Команды:
Прокси = WSСсылки.Перл.СоздатьWSПрокси(«http://it.selenia.ru/services.php», «AWK», «AWK»);
Результат = Прокси.pregMatch(«aaa», «/aaa/i»);
Предполагаю, что 1С не нравится составной тип возвращаемого значения ArrayOfString и если его переделать в простой string[] (языком C#), то все получится.
В .Net можно организовать перевод в string[] из List<string> через вызов .ToArray().
(22)
Так ты неправильно пишешь. Лучше так:
Так будет другая ошибка 🙂
Посмотри в отладчике на WSСсылки.Перл.
(23) Знаю. У меня 1С пытается вызвать что-то по адресу 0000:0000 и удачно вылетает.
СоздатьWSПрокси ?? Там пространство имен: «http://it.selenia.ru», а там где руками wsdl писал вообще имя порта «pregwsdlPort», пространство имен: «urn:pregwsdl».
(22) (24) В прикреплении обработка, которой я смотрю на сервис awk. Она прекрасно его вызывает и ругается только на возвращаемое значение.
По всей видимости 1С ждём массив и получив строку возмущается этим.
зн = Прокси.pregMatch(«123456», «654321»);
по причине:
Ошибка вызова операции сервиса: {
по причине:
Неверный формат.
(21)
Тогда микрософтовцы, тоже криворукие… Приподключении вашего сервиса к VWD он вообще ругается вот так вот.
Документ с URL-адресомhttp://it.selenia.ru/services.php?wsdl не распознан как документ известного типа.
http://it.selenia.ru/services
В устранении проблемы могут помочь сообщения об ошибках для каждого известного типа:
— Отчет от «Документ DISCO»: «Не удалось найти документ Discovery с URL-адресом
Может дело не в 1с и microsoft… 😀 ну это как предположение… 😀
А по поводу List иногда бывает неоюходимость сделать многомерный массив. Ссылкой на многомерный List не поделитесь?
(26) По идее без диско должен работать. Диско — это дополнительная фича, выглядит примерно так:http://code.elisy.net/services/forecastservice.asmx?disco
У меня подозрение, что 1С плохо работает со сложными типами. Нужно тип выходного параметра изменить на массив строк как-то.
А для многомерного списка тип List<List<string>> не подойдет?
(27) Так я и говорю, что не понимают системы сложные переменные друг друга, и что бы ими пользоваться нужно показать системе что это вообще такое, поэтому массив и список значений не передашь, а можно передать список структур, ну или List структур(заранее определенных). Найдете способ передавать сложные переменные, крикните, Я ссылочные объекты из 1с в net передать хочу.
А по поводу List<List<string>>, да такое проканает, но начал делать, что-то мозыг закипать начал… 😀
И кстати ваш сервис и без disco открывается нормально VWD. А 1с-ом его пробовали открывать?
(28) Visual Studio для сложных структур автоматически создает врапперы и позволяет использовать такие типы, но ей нужен Disco-сервис. А как только получится такие объекты в .Net принимать, к ним можно обращаться из 1С.
http://code.elisy.net/services/forecastservice.asmx писали для 1С в том числе, но примера его вызова из 1С не сохранилось. Только вызов через .Net-средства: http://infostart.ru/public/61457/
Сервис
(27) Что за доп фитча? Какую она несет функцию?
Странно смущает меня —
SOAPUI:
Запрос:
Показать
Ответ:
Показать
(30) Насколько я понимаю — динамически подключаться к веб-сервису, отличному от ссылки на прокси-классе (см. описание метода SoapHttpClientProtocol.Discover в .Net framework)
Хм… с одной стороны в веб-сервисах в нынешнем виде действительно много странного, но с другой стороны (как это ни странно) если все делать осознанно и по уму, четко себе представляя, что и как должно функционировать — сервисы вполне себе работают.
Хотя безусловно все движки имеют свои глюки и особенности, но у же щас есть некий уровень, на котором обеспечивается вполне приемлемое качество взаимодействие: вызов/обработка вызова со сложными типам. Этот уровень уже сейчас могут обеспечивать самый широкий круг движков: от CXF до внутреннего движка SAP’a, и от WCF до встроенного движка 1С (хотя последний — с баааальшой натяжкой, ибо кривой, глючный и явно нелюбимый товарищем Нуралиевым 😀 ).
Примеры:
http://infostart.ru/public/21506/
«Интеграция 1С с сервисной шиной OpenESB»
Хотя там по сути SOAP взаимодействия с 1С’ом нету.
>Предполагаю, что 1С не нравится составной тип возвращаемого значения ArrayOfString
очень плохо, что он ему не нравится… тот же CXF точно также определяет коллекции при генерации WSDL — САП’у вроде нравится
P.S. Ну а когда движок и клиент переходят некоторую черту в развитии, становятся доступными совсем интересные вещи:
Microsoft то же кажется не нравится типhttp://it.selenia.ru/services.wsdl он проглотил..
(33) Да что вы все 1с пинаете за кривость работы с сервисами. Главное что работает. Было web-расширение, тоже не нравилось. Сделали лучше, опять не то. Предлагаю бросить 1с и перейти на дугие платформы создания учетных програм, с более развитой поддержкой web-сервисов. Или Com-подключение используйте — тоже вариант.
(35) А я что предлагаю? Первую ссылку в (33) смотрите.
Ты COM видишь? А он еееесть….
>дугие платформы создания учетных програм
не-не-не, имею удовольствие видеть эти быдлоподелки, лучше уж 1С (реально лучше).
>Да что вы все 1с пинаете за кривость работы с сервисами.
Пинал, пинаю и буду пинать 😀
(36) Com — это последнее что я буду использовать… (из разряда «быдлоподелки»).
>Пинал, пинаю и буду пинать. — Тогда зачем так мучатся и юзать ее родимую?
(35) Никто ее не пинает. Наоборот, я ее сторонник и занимаюсь пропагандой на западе. Пытаемся разобраться. В данном случае описания ошибки 1С не хватает, чтобы понять в чем дело. Нужен вызов другими средствами. Лично я — сторонник простых решений, поэтому предлагаю упростить тип. Кстати, формат JSON также пошел по пути упрощения.
(37) Подпинывать тоже нужно слегка, чтобы была в тонусе и оставалась конкурентоспособной.
(38) По поводу описаний. Раз уж на то пошло. Был у меня случай, что процедура просто прерывалась как раз на стыке net и 1с и описаний никаких вообще не было. А потом обновилась платформа 1с и появилось описание ошибки. Так что ждите обновления… 😀
(37) Com — это последнее что я буду использовать… (из разряда «быдлоподелки»).
Увы, но это единственный открытый программный интерфейс к 1С (если не считать какой-то native api, для 8.2).
(37)
>Тогда зачем так мучатся и юзать ее родимую?
Потому, что для своего сегмента это идеальный инструмент
(42)
>Потому, что для своего сегмента это идеальный инструмент
Ну это вы загнули. Лучший, да. Иделального не бывает, поэтому постоянно новые релизы и выходят… 😀
(38) (40) awk поправил что-то. Теперь сервис работает с 1С.
(44)так чем проблема-то была? Теперь-то уж интересно???
Это у awk надо спрашивать. Наверное привёл к виду, описанному в теме.
(46)(45) Поправил? Да я этот пхп каждые пять минут правлю. От этого и ошибки вылазят. Последняя была вместо xsd:string написал wsd:string из-за этого он не нравился микросовту. 1С вылетает при вызове метода напрочь. А COM на linux??? Я не пробовал, но боюсь не получится…
(47)
Когда я писал 44 не вылетала. Сейчас опять вылетает.
(48) Последний релиз. Возвращаю строку — и 1С вылетает… Типы данных не причем…
(49) Нормально работает. Не вылетает.
Показать
(50) Версия 8.1? Я на 8.2 делал…
(51) Эх! между 49 и 50 больше пяти минут. Опять, наверное, сломал 🙂
Работает и в 8.1 и в 8.2.10.73.
Вот обработки какими смотрю
Сломал… Хочу-таки массив вернуть…
(54) ты возвращал массив и 1С его понимала. Я проверял когда (44) писал.
(55) Добился что бы Visual studio получала массив.. Теперь 1С формат не нравится…
(56) Кинь что ли мне демку, я тоже поковыряю 😉
(35) Путь к совершенству — бесконечен…
И вожакам надо периодически давать понять, что они ещё не прошли его до конца.
Чтобы не расслаблялись.
(57)http://it.selenia.ru/services.php?wsdl Я смотрю тема заразной оказалась… 😀
(59) А что дальше?
В 1С-ку добавил
Прокси = WSСсылки.WSСсылка1.СоздатьWSПрокси(«http://it.selenia.ru», «AWK», «AWKPort»);
Строка = «яяяяя»;
Шаблон = «»;
Результат = Прокси.pregMatch(Строка, Шаблон);
Соответственно, ругается, что параметры не совпадают. Там 1 же параметр, аля структура с 2 полями. Ну как бы его создать и передать. В чем проблема-то?
Ну и получается где-то так
Строка = «яяяяя»;
Шаблон = «sdsd»;
Прокси = WSСсылки.WSСсылка1.СоздатьWSПрокси(«http://it.selenia.ru», «AWK», «AWKPort»);
pregMatchRequestType = Прокси.ФабрикаXDTO.Пакеты.Получить(«http://it.selenia.ru»).Получить(«pregMatchRequestType»);
Парам = Прокси.ФабрикаXDTO.Создать(pregMatchRequestType);
Парам.str = Строка;
Парам.tmpl = Шаблон;
Результат = Прокси.pregMatch(Парам);
Сообщить(Результат);
(62) В том-то и дело, что так как должно быть в 1С коде все знают, а какой ей wsdl файл нужен? Что бы она это съела… В С# все ок..
«Съела» в каком смысле?
Могу еще 8.2 дать, если что…
(65) Ну она у меня то вылетает, то Свойство не находит…
(66) Какое свойство? На каком месте вылетает? Дай свою базу.
(66) Вот сейчас 8.2 вылетает, а 8.1 нормально отрабатывает.
на работе и 8.2 нормально отрабатывала.
Вот картинка где видно что сервис отработал нормально.
Вот 8.2
(70) Лучше обработкой выкладывай. С базой возни много. Да ещё при начале работы системы!
(69) У меня 8.2 тоже отработал нормально.
(71) В смысле возни много? Загрузил из базы и вперед.
(70) 71 относилось к базе 81. Но всё-равно лучше обработкой. Хоть для толстого клиента.
В прикреплении картинка падения 8.2
Похоже зависит от виндовса. На одном компе работает, на другом падает.
8.1 — 14 релиз,
8.2 — 10.73
(74) А какой релиз платформы и какие ОС?
Падения могут быть из-за файрвола или какого-нить брандмауера.
У меня, вообщем, Windows 7, 1С-ка запущена под админом.
Вин ХР
Фиревол отключил.
еМул работает
1С:Предприятие 8.1 (8.1.14.72) — работает
1С:Предприятие 8.2 (8.2.9.356) — падает
Правда сетка у меня хитрая. Два провайдера одновременно.
(78) Проверил. 8.2.9.356 — падает, 8.2.10.73 — не падает.
Вывод — косяк платформы, уже исправленный.
(79) (74) Спасибо. Если интересно, то окончательный код сервиса:
Показать
(80) Стоит еще статью подправить с полученными результатами 😉
Если кто не захочет все комменты читать….
(81) Обязательно подправлю, только отосплюсь… А то по три часа в сутки последнюю неделю сплю.
Чего-то я долблюсь-долблюсь и ничего не выходит.
При вызове pregMatch() возвращает
«Ошибка разбора SOAP сообщения: неверная версия сообщения.»
Куда копать?
PS платформа 8.1.13.41
(83) А какие параметры передаете? И на какой адрес подключаетесь..
Юзаю Ваш тестовый сервис.
Вот код:
WSОпред = Новый WSОпределения(«http://it.selenia.ru/services.php?wsdl»);
СервисТест = НОвый WSПрокси(WSОпред,»http://it.selenia.ru», «AWK», «AWKPort»);
ТипВход = CервисТест.ФабрикаXDTO.Пакеты.Получить(«http://it.selenia.ru»).Получить(«pregMatchRequestType»);
ВходПарам = СервисТест.ФабрикаXDTO.Создать(ТипВход);
ВходПарам.str = «blablabla»;
ВходПарам.tmpl = «йа параметрег!»;
Результ = СервисТест.pregMatch(ВходПарам); // На этом моменте вызывается ошибка
(85) А код посмотреть?
function pregMatch($str, $tmpl) {
if (preg_match(‘@#k8SjZc9Dxk(.).*1.?$@i’,$tmpl) == 0) {
return new soap_fault(‘SERVER’, », ‘bad template’,$tmpl);
}
Вызывается исключение плохого шаблона.
(86) (85) Спасибо, так оно и было. Просто исключение не описано в wsdl. Шаблон состоит из скобок например: .. ХХ «» @@ не важно после скобок может быть i или не быть и самого выражения внутри скобок.
(85) А зачем пользоваться тем чего не понимаешь? Статья не описывает мой сервис (я его уберу), а описывает технологию связки PHP и 1C.
Проблема в том что данное исключение вываливается при любых раскладах. Причём не только с Вашим сервисом, поднимали свой аналогичный, смысл был — получаем параметр (строку), возвращаем «Hello» + параметр. Всё равно поднимается это исключение.
(88) 8.1.14.72 Работает. 8.2.10.73 Работает. 8.2.9.356 Точно не работает при возврате массива. Если очень надо поднять, то наверно надо как-то обновляться или нанимать кого-то кто будет с вашем случаем разбираться индивидуально. Я свой случай обкатал, добился результата при львиной поддержке Трактора и Dushelovа, теперь жду прихода ИТС для обновления 1С.
Интересная статья, реализовывал по похожему принципу и на 8.1 и на 8.2 все завелось почти с первого раза, правда не без помощи web программиста. Автору спасибо
Спасибо большое за этот материал!
Статья в копилку средств веб-интеграции:
http://infostart.ru/public/104926/
Самое интересное, что модуль 1с-битрикс «веб сервис» не поддерживает веб сервисы 1с пришлось использовать NuSOAP!
Есть такой вопрос, может быть вы поможете: сделала веб-сервис в 1С, опубликовала, он работает в SoapUI, еще проверяли из других программ — работает… Но нужно его использовать в программе, которая работает на платформе SharePoint. Так вот у них мой веб-сервис не работает. Как они объясняют: не тот синтаксис веб-сервиса.
Вот такой синтаксис делает 1С:
xs:schema targetNamespace=
xs:element name=
А вот так надо SharePoint:
s:schema elementFormDefault=
s:element name=
Почему 1С делает «xs», а не «s»?
Т.е. вместо «<xs:…» должно быть «<s:…».
Как это сделать в 1С? Как изменить синтаксис опубликованного веб-сервиса?
Что-то в URI пространством?
(95) user_2010, Добрый день. 1С может и xs1 дать. Это называется префикс. Префикс однозначно определяет пространство имен тега. То есть есть описанbе данного пространства имен: xmlns:xs=»http://….». Так что у 1С все правильно. А SharePoint программистам надо теорию учить.
О пространствах имен можно почитать например в википедии:https://ru.wikipedia.org/wiki/Пространство_имён_(XML)
Спасибо! Передам вашу информацию нашему специалисту по шарепоит…
Я правильно поняла, что я не смогу настроить 1С так, чтобы получить префикс S?
Насколько я поняла: в 1С я в качестве пространства имен могу указать любую информацию, главное, чтобы было похоже на ссылку.
Как понять: почему 1С в одном случае дает префикс xs, а в другом случае уже дает префикс xs1?
Может быть при каком-то условии/настройке можно добиться получения префикса S? Какая тут логика?
(97) user_2010, Нет. Там все автоматизировано до безобразия…
(98) user_2010,
Пространство имен это произвольная строка. URL — это всего лишь способ сделать эту строку уникальной.
Может быть при каком-то условии/настройке можно добиться получения префикса S? Какая тут логика?
xs — это просто удобняшка, для легкости чтения. xs1 перфикс вряд ли 1С создаст, а вот ns1, ns2 … — вполне. Префикс s можно получить делая xml «руками». В 1С логики префиксации особой нет.