Описанный метод позволяет обратиться к веб-сервисам 1С из html-страницы через JavaScript. В качестве примера выводится список справочников. При нажатии на любой справочник выводятся первые буквы наименований. При нажатии на букву выводятся данные с наименованиями, начинающимися на эту букву.
Способ применим для случаев, когда веб-сервис и html-страница опубликованы на одном сервере. В этом случае не возникает кросс-доменных проблем. Например, если домены будут отличаться, то Chrome выдаст ошибку:
Failed to load resource: Origin http://localhost:3299 is not allowed by Access-Control-Allow-Origin
Не вдаваясь в подробности публикации веб-сервисов, предположим, что на стороне 1С создан и опубликован веб-сервис catalogs с операцией Execute. На входе — параметр script типа string, на выходе тип string. Операция запускает на стороне произвольный код script из параметра и возвращает JSON-сериализацию от переменной result.
Функция ExecuteCommands(script)
result = null;
Execute(script);
return JSON(result);
КонецФункции
С JSON-сериализацией удобно работать средствами JavaScript и преобразовать строку в объект/массив одной командой eval(resultText). В Интернете можно найти несколько JSON-сериализаторов для 1С.
Удостоверимся, что веб-сервис отвечает, введя его адрес:
[more]
Проект Html-файла лучше начать с готового шаблона, где прописаны стили на все случаи браузеров. Весьма достойный шаблон находится по адресу http://html5boilerplate.com/ В шаблон включен jQuery 1.9.1.
На форме сверху разместим элементы настройки веб-сервера: wsUrl — адрес веб-сервиса, wsUser — логин, wsPassword — пароль. На стороне веб-сервиса 1С включена basic autherization. Логин и пароль соответствуют пользователю, прописанному в 1С.
Левая панель отвечает за отображение доступных справочников catalogsList, правая — за отображение букв (letters) и данных (catalogRecords).
JavaScript
Функция обращения к SOAP веб-сервису определена следующим образом:
function executeSoap(script, successHandler) {
var wsUrl = $("#wsUrl").val();
var soapRequest =
'' +
'<soapenv:Envelope ' +
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
'xmlns:api="http://www.1cbit.ru/dominicana/soap-html-js" ' +
'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
'' +
'' +
' '' +
'' +
'';
$.ajax({
type: "POST",
url: wsUrl,
contentType: "text/xml",
dataType: "xml",
username: $("#wsUser").val(),
password: $("#wsPassword").val(),
data: soapRequest,
success: successHandler,
error: processError
});
}
На входе в executeSoap подается скрипт 1С, который выполняется на стороне 1С, и обработчик для удачного исполнения. В случае ошибки вызовется обработчик processError, который выведет сообщение об ошибке.
Код 1С записан в html-коде через script-тэг. Получить текст каждого куска кода для выполнения можно через jQuery $(«#enumerate1CCatalogs»).text().
Получение списка наименований каталогов.
// result = Новый Массив();
Для Каждого СправочникИзМетаданных Из Метаданные.Справочники Цикл
структура = Новый Структура("name, synonym");
структура.name = СправочникИзМетаданных.Имя;
структура.synonym = СправочникИзМетаданных.Синоним;
result.Добавить(структура);
КонецЦикла;
// ]]>
Получение первых букв наименований справочника {catalog}
// запрос = Новый Запрос();
запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Подстрока(Наименование, 0, 1) КАК letter ИЗ Справочник.{catalog}
УПОРЯДОЧИТЬ ПО Подстрока(Наименование, 0, 1)";
result = запрос.Выполнить().Выгрузить();
// ]]>
Получение данных для каталога {catalog}, где первая буква входит в условие {condition}.
// запрос = Новый Запрос();
запрос.Текст = "ВЫБРАТЬ Ссылка as ref, Наименование as name ИЗ Справочник.{catalog}
ГДЕ Подстрока(Наименование, 0, 1) В ({condition})";
result = запрос.Выполнить().Выгрузить();
// ]]>
При нажатии на кнопку Обновить происходит вызов функции
executeSoap($("#enumerate1CCatalogs").text(), processSuccess);
и при успешном выполнении вызывается обработчик processSuccess
function processSuccess(data, status, req) {
var resultText = $(req.responseText).find("m\:return").html();
result = eval(resultText);
$("#catalogRecords").empty();
catalogsList = $("#catalogsList");
catalogsList.empty();
$(result).each(function (index, item) {
var li = '
' + item.synonym + '
';
catalogsList.append(
$(li).addClass("catalogTitle")
);
});
}
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Веб-сервис возвращает xml, где значимым является содержимое m:return-тэга — JSON-сериализация. Перевести его в объекты JavaScript можно через eval-вызов. Обработчик очищает перечень справочников и заново его формирует через li-тэги с атрибутом catalog. Каждому элементу устанавливается класс catalogTitle.
Аналогично обрабатываются нажатия на все управляющие элементы. Нажатие на справочник очищает буквы и данные, перезаполняет буквы. Нажатие на букву перезаполняет данные из справочника. За обработку кода на 1С отвечают куски кода в script-блоках с типом «text/1c».
Приложение выглядит так:
Нерешенная проблема авторизации на браузере IE
Существует проблема авторизации на IE. На IE 8/9 не удалось решить проблему basic authorization аналогичным для остальных браузеров методом.
На IE Ajax не работает с использованием user/password — свойств $.ajax. На FF и Chrome все работает нормально. По какой-то причине на сервер в случае с IE не передается заголовок
Authorization: Basic 0JHQsNGF0YjQuNC10LLQn9CYICjRgNGD0LrQvtCy0L7QtNC40YLQtdC70YwpOg==
Если кто-нибудь знает причину и как обойти, пожалуйста, напишите в комментариях.
Выводы
Предложенный подход на основе SOAP имеет право на существование для несложных задач, так как сопровождается достаточно большим числом JavaScript кода. Возможно, в будущем удастся создать JavaScript фреймворк для упрощения процесса создания приложений.
Разработчики в этом способе самостоятельно отвечают за безопасность. Необходимо проверять входные параметры при записи, не позволять запуск произвольных скриптов, переданных с клиента. В статье выполнение произвольного кода показано только для примера. Унифицировать можно выполнение произвольного запроса, но это связано с опасностью SQL-инъекций.
Внешние компоненты Native API от 1С не будут работать в данной среде. Это значит, что нужно дополнительно решать проблему с написанием драйверов для оборудования.
//
//
часть кода после
парсер пожрал?
Есть ли оценки производительности 1С при выдаче результатов по SOAP, какая возможная интенсивность работы ?
(1) Asmody,
Да, парсер. В каждой статье что-нибудь съедает. Как побороть не придумал еще.
Показать
username: ,
password: , в IE не работают на русском(Пришлось делать пользователей на английском). Причина и решение самому интересна.
По моему опыту все гораздо веселее работает на PHP5… не люблю я JS ( за статью плюс!
(3)
В статью вставляйте картинкой, а для тех, кому нужен исходник — давайте ссылку на сниппет, который можно разместить либо наhttp://gist.github.com либо на http://pastebin.com
Сделай простенький модуль на PHP, который будет обращаться к веб-сервису 1С и возвращать XML или JSON.
AJAX-ом будешь обращаться к этому модулю. Тогда не должно быть проблем с авторизацией.
Был где-то пример. Могу поискать, если надо.
(4) sikuda,
password: , в IE не работают на русском(Пришлось делать пользователей на английском). Причина и решение самому интересна.
Спасибо. Интересная версия. Хотя бы намек появился на причину. На другом ресурсе
http://www.richmedia.us/post/2013/06/25/soap-1c-jscript-html.aspx
в комментарии предложили переписать Authorization-заголовок
Soap это такой же http запрос, переданный в виде xml и полученный ответ тоже в xml.
По мне удобнее работать с soap запросами через xmlhttp = Новый COMОбъект(«Msxml2.XMLHTTP»);
Кстати и с авторизацией можно попробовать через xmlhttp.setRequestHeader(«Authorization»,»Basic dXNlcm5hbWU6cGFzc3dvcmQ=»);
Параметры авторизации можно прописать в файле default.vrd, в строке с путём к информационнойй базе ib. Работает не на всех релизах 1С, но на последних должно работать. Так мы получим анонимный сервис.
(7) Johny_v,
AJAX-ом будешь обращаться к этому модулю. Тогда не должно быть проблем с авторизацией.
Был где-то пример. Могу поискать, если надо.
Хотелось бы обойтись без посредников. Модуль PHP тянет за собой PHP и настройку сервера. В сложных задачах, вероятно, не удастся обойтись без Asp.Net/PHP, а на простых, думаю, можно обойтись средствами клиента.
У меня одного возникают сомнения в практической ценности данного материала?
Elisy, просьба, ну то же самое только с прицелом на PHP, было бы гораздо полезнее… почему имено JS ?
(10) Трактор,
Новость вызывает двоякое чувство. С одной стороны — это гибкость. Но с другой стороны 1С и сетевая безопасность — вещи несовместимые. Применение оправдано без выхода в публичную сеть.
В случае использования связки PHP + JS вы получите более безопасный метод обращения к веб-сервису.
Пользователь вообще не сможет узнать что используется веб-сервис 1С, тем более адреса сервера и данные авторизации.
когда я работал с веб-сервисами 1С из РНР, возникла проблема преобразования сложных вложенных структур XDTO в объекты РНР. Может в эту сторону подумать?
(15) Johny_v, (16) badboychik, помоему автор игнорирует все вопросы о Web-сервисы + PHP ((
(16) (17) В качестве примера можно 1С+php рассматривать эту разработкуhttp://infostart.ru/public/59207/ Если сподоблюсь сделаю пример попроще.
(12) sashocq,
Мы на определенном этапе столкнулись с ограничениями управляемых форм. Ведут они себя непредсказуемо, занимают много лишнего места. Адекватная замена — это html. Именно поэтому html было уделено много внимания. Подходы использования html могут быть различными: встраивание html в УФ на стороне 1С, встраивание веб-клиента 1С в свой Frame и создание своих страниц с доступом по soap. Все эти варианты были рассмотрены в предыдущих и этой публикациях. Насколько применимы, судить нужно в каждом конкретном случае.
(17) AllexSoft,
Нет, он вроде объяснил что хочется обойтись без PHP. Может в его случае это как-то оправданно.
(20) Johny_v, ну если это считать объяснением…
Хм, а проект расчитан для ларьков? Насколько я понял подобная модульная система (с веб мордой) будет охватывать всю деятельность предприятия, тогда зачем говорить о простых задачах и наивно полагать что хватит JS ?)
(13) AllexSoft,
Я работал в рамках поставленной задачи. Здесь делюсь результатами исследований. PHP не входил в поставленную задачу. Да и статьи на тему PHP + 1C были: в (18) пример одной из них.
Лично я не сторонник веб-сервисов вообще, а сторонник альтернативного подхода, где работа ведется по веб-протоколу 1С. Связано это с тем, что веб-сервисы пока не доступны в облаках, а их реализация не является универсальной.
хм, мне казалось этои была попытка 1С сделать что нибудь облачное (в истинном смысле, когда данные хранятся у клиента, а обработка происходит на облачном сервисе), а не веб-морду к базе данных с разделителями учета (как сейчас есть на 1с фрэш)
ПС: а в чем их не универсальность в данной реализации ?
(19)
Такое впечатление, что у вас там веб-программисты собрались, неосилившие управляемые формы. Пока что недоказанное утверждение, попробуйте статью на эту тему написать с примерами и посмотрите на реакцию сообщества.
Управляемые формы «из коробки» очень много функционала реализуют при минимальных усилиях разработчика.
(24) Странные у вас выводы 🙂
Наоборот, собравшиеся люди много работали с управляемыми формами, поэтому прекрасно знакомы с их ограничениями — статью здесь писать не о чем, любой профессиональный разработчик, проработавший с упр. формами более 2х месяцев прекрасно знает все эти ограничения. И то что «управляемые» формы во многих аспектах фактически не управляемы также неоспоримый факт (размеры формы и элементов, цвет фона, расстояние между элементами, шрифты заголовков, управление стандартными панелями навигации, отсутствие многих элементов управления и прочее, и прочее…)
Во многом (но далеко не всегда) эти ограничения обоснованы тем, что
Но позиция нашей команды — это бережное отношение к пользователю и уделение большого внимания к интерфейсу и юзабилити, и здесь решений «из коробки» часто не хватает.
(16) badboychik,
Я перспективней вижу технологию 1С Business Connector. После Проекта Доминикана вернусь к той теме.
(17) AllexSoft,
Стараюсь отвечать на вопросы по мере возможности. Но про PHP мне нечего сказать. Во-первых к данной теме не относится, а во вторых — я разбираюсь в Asp.Net, а не в PHP. По PHP вам лучше найти кого-то другого.
(21) AllexSoft,
Вы что-то совсем ниже плинтуса опустили JS. JS + HTML5 + jQuery(UI) даст фору управляемым формам, потому что формат открытый, стандартизованный и поддерживаемый во всем мире. Там уж точно нет багов, которых уже насчитали штук 10 в новом Такси. Контролов раз в 100 больше от разных производителей и они гибкие и настраиваемые под любые задачи. Не то, что набор из Поле-Таблица-Декорация. 1С пошла по пути Microsoft, которая выпустила лет 10 назад XAML и ее реализацию для web XBAP (до нее WebForms). Потом одумались XAML оставили для десктопа, а для веба создали Asp.Net MVC + jQuery.
(23) AllexSoft,
Не совсем понял, в какой реализации?
(29)
Вот я про это, в чем не универсальность веб сервисов платформы?
(24) zqzq,
Управляемые формы «из коробки» очень много функционала реализуют при минимальных усилиях разработчика.
Наконец-то появился человек, который разъяснит нам во многих местах странное поведение УФ и откровенные баги Такси, а то на форуме 1С не торопятся комментировать.
Много функционала УФ — это заявление маркетологов, потому что набор из Группа-Поле-Таблица-Декорация в нормальных фрейморках за функционал не считается. Попробуйте на досуге поиграться с шириной бордюра, поуправлять отображением, растянуть кнопку на всю ширину формы, убрать сплиттер между таблицами. Может, вы подскажете, как подсказку генерить динамически и отображать разную для каждой строки таблицы? А вы в курсе были, что в динамических списках бестолку использовать ПЕРВЫЕ N — конструкцию, потому что динамический список настолько высокоинтеллектуальный, что в расчет ее не берет.
(29) на (30) ответ дашь?
(30)(32)
http://www.forum.mista.ru/topic.php?id=645570
http://habrahabr.ru/qa/31297/
Извиняюсь за задержку. Неуниверсальность относится к вопросу №4 публикации 1С в SaaS:
Судя по ответам, на тот момент не было возможности пользоваться веб-сервисами на популярных 1С SaaS-площадках.
Можно еще почитать комментарии (начиная с 9го) к
http://forum.infostart.ru/forum24/topic75705/
«Веб-сервисы более прогрессивны, но и у них есть свои особенности работы и сложности (настройка, преобразование типов, сложность стандарта, несовместимость). «
(33) по поводу 1cfresh это проблема конкретной реализации конфигураций, а не платформы… я всетаки говорил про сам обмен через SOAP web-сервисы
за вторую ссылку спасибо, почитал… согласен про преобразование типов, но никуда не денешься от этого, тут проблемы платформеных типов значений которая она использует
(34) AllexSoft,
Меня очень интересует вопрос — есть ли системные проблемы у веб-сервисов на SaaS-серверах 1С, работающих на базах с разделением данных. Не встречались ли статьи на тему особенностей использования веб-сервисов в режиме разделения данных? Какие особенности и узкие места, практика использования?
Наша система планируется именно такой и хотелось бы знать, можно ли закладывать в нее клиентские веб-сервисы, как инструмент, например, для обмена с веб-сайтами клиентов. Есть опасения, что веб-сервисы могут привести к уязвимостям в системе безопасности.
(35) к сожалению примеров таких систем не знаю, да и статьи искал и не нашел ( самому интересно… если напишите статью о использовании web-сервисов в нестандатных задачах (условиях модульности, условиях разделения данных) то было бы очень интересно.
А по поводу стоит ли закладывать возможности обмена с сайтами через SOAP то конечно нужно, вот только придумать как ) схемы подключения xsd пользовательских схем, сам обмен данными на подобие обработки универсального обмена и файлов правил…
Я обычный XMLHttpRequest использовал, то у меня авторизируется обоими способами.
Только в IE заметил разницу что при авторизации не через хедеры при неправильных данных не появляется стандартное окно авторизации в браузере.
И при использовании русских символов либо в пароле либо в пользователе авторизация неработает даже в стандартных окошках авторизации в браузере (пробовал хром,мозилу,експлорер)
(37) 6есик,
А в какой кодировке отправляете реквизиты авторизации? Подозреваю 1С UTF-8 ожидает…
(38) i.kovtun,
На странице выставлен meta для utf-8. Хорошо бы было, если бы браузер ее и использовал 🙂
(38) i.kovtun,
Да по разному пробовал уже. И через encodeURIComponent() пробовал авторизационные данные пропускать, но ничего не помогло. Даже надоело пробовать — но если у кого-то получиться то было бы очень интересно увидеть.
По поводу авторизации попробуйте использовать Preemptive Authentication,
http://hc.apache.org/httpclient-3.x/authentication.html
здесь описано как
(40) 6есик,
http://infostart.ru/public/201461/ , в ней есть информация по поводу авторизации киррилистических логинов. Сам пока до проблемы не добрался.
Вот появилась публикация
А как всё-таки составлять SOAP-запросы из веб-клиента к веб-серверу 1С?
(43) prodines, точнее проблему озвучьте, в чем сложность то? примеров использования SoapClient на PHP полно, там 3 строки кода.. ну а собственно вызов из вашего клиентского приложения веб сервиса на 1С или на чем то другом одинаков, там все равно ответы в формате XML вам будут приходить. Ну а как парсить ответы это уже другая тема =)
(43) Веб-клиент имеется ввиду 1С?
(44) AllexSoft, (45) Суть проблемы в следующем: есть веб-клиент в виде броузера с загруженным HTML/JavaScript-файлом. Есть Веб-сервер в виде связки 1С:Предприятие и Апач. Задача: обращаться из клиента к серверу и получать некий ответ. Вопрос: какого вида XML-файлы слать из клиента на 1С? Откуда я узнаю их формат, синтаксис?
При этом, разумеется, такие вещи, как JSON, WSDL, SOAP, jQuery — для меня, программиста 1С, тёмный лес. Кое-как со скрипом я ещё могу осилить JavaScript — хотя это тоже довольно непростой язык программирования, просто я случайно прочитал недавно 5 издание библии флэнагана. Да, ну и XML — вещь понятная, разумеется, т.к. 1С-программист с XML регулярно сталкивается в работе.
Таким образом, данная статья мне вообще абсолютно непонятна — ни единого слова.
(46) Извините, что отвечаю с запозданием. На Инфостарт с определенного момента перестала нотификация об ответах приходить по почте. Очень неудобно стало.
Думаю, вам нужно решить сначала вопрос с авторизацией.
http://infostart.ru/public/104926/ может не предполагать авторизации совсем (Требует платный компонент .Net Bridge — встречал аналог через COM-объект).
Для вашего случая есть несколько подходов: 1) из этой статьи и 2) http-сервисы из мира 1С 8.3. В обоих случаях встанет проблема ввода пользователем логина и пароля. В случае статьи — хранение логина и пароля будет на стороне веб-браузера, в случае с http-сервисов логин и пароль распознает 1С и факт распознавания будет передаваться через куки. 3) подход —
Я встречал несколько вариантов передачи данных от сервера к клиенту: JSON и XML. Самый распространненный в веб-мире все-таки JSON, но он очень медленный при формировании средствами 1С.
По методам:
1) Поддерживает XML, внутрь ответов можно встраивать JSON. Формат XML фиксированный — определяется 1С стандартом SOAP — сложный для понимания.
2) Поддерживает XML, JSON — гибче, чем 1й подход. Формат XML и JSON вы определяете на стороне 1С
3) Поддерживает XML, JSON. Формат XML и JSON вы определяете на стороне 1С
(47) то ли Вы ничего не ответили на мой вопрос, то ли я не сумел ничего понять. Да поймите же — JSON для меня просто не существует. Примите это как условное допущение. И изучать его я не стану — нет смысла.
Возможно, это является ответом. Тогда это и есть суть моего вопроса — как конкретно это делается — «Формат XML вы определяете на стороне 1С»?
(48) prodines, думаю у вас еще недостаточно теоретической основы для реализации вашей задачи.
ну тогда вы ничего и не сделаете к сожалению ( Нельзя что-то сделать и не понимать что ты делаешь. Копипаст тут не прокатит
(48) prodines,
http://infostart.ru/public/61194/
Про JSON нужно знать, что это альтернатива XML. Это текстовая строка, полученная на выходе какой-то функции 1С. Ее понимает JavaScript. 1С запакует структуру в JSON без вашего участия, JavaScript его поймет и восстановит объект опять без вашего участия.
Код для получения JSON при беглом поиске можно взять здесь
XML создается стандартными 1С-средствами, например, так — для таблицы значений:
Показать
Здесь под «Формат XML вы определяете на стороне 1С» я понимаю то, что вы можете дать другие имена root, columns или добавить другую информацию
(50) думаю он хочет пример оформления soapRequest с одним или двумя параметром (скажем простыми в виде string) в вызове функции executeSoap(script, successHandler) из вашего примера
(24) zqzq, (24) zqzq, Поставил бы минус на Ваше высказывание. А автор молодец.