Доступ к SOAP веб-сервисам 1С из JavaScript и Html

    Описанный метод позволяет обратиться к веб-сервисам 1С из html-страницы через JavaScript. В качестве примера выводится список справочников. При нажатии на любой справочник выводятся первые буквы наименований. При нажатии на букву выводятся данные с наименованиями, начинающимися на эту букву.

    Способ применим для случаев, когда веб-сервис и html-страница опубликованы на одном сервере. В этом случае не возникает кросс-доменных проблем. Например, если домены будут отличаться, то Chrome выдаст ошибку:

    Failed to load resource: Origin 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С.

    Удостоверимся, что веб-сервис отвечает, введя его адрес:

    Отклик веб-сервиса


    Проект Html-файла лучше начать с готового шаблона, где прописаны стили на все случаи браузеров. Весьма достойный шаблон находится по адресу 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 =
                    '<?xml version="1.0" encoding="utf-8"?>' +
                    '<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/">' +
                        '<soapenv:Body>' +
                            '<api:Execute soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' +
                                '<' + 'script xsi:type="xsd:string">' + script + '</' + 'script>' +
                            '</api:Execute>' +
                        '</soapenv:Body>' +
                    '</soapenv: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().

    Получение списка наименований каталогов.

        <script id="enumerate1CCatalogs" type="text/1c">
            result = Новый Массив();
            Для Каждого СправочникИзМетаданных Из Метаданные.Справочники Цикл
                структура = Новый Структура("name, synonym");
                структура.name = СправочникИзМетаданных.Имя;
                структура.synonym = СправочникИзМетаданных.Синоним;
                result.Добавить(структура);
            КонецЦикла;
        </script>
    


    Получение первых букв наименований справочника {catalog}

        <script id="getFirstLetters" type="text/1c">
            запрос = Новый Запрос();
            запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Подстрока(Наименование, 0, 1) КАК letter ИЗ Справочник.{catalog} УПОРЯДОЧИТЬ ПО Подстрока(Наименование, 0, 1)";
            result = запрос.Выполнить().Выгрузить();
        </script>
    


    Получение данных для каталога {catalog}, где первая буква входит в условие {condition}.

        <script id="getCatalogData" type="text/1c">
            запрос = Новый Запрос();
            запрос.Текст = "ВЫБРАТЬ Ссылка as ref, Наименование as name ИЗ Справочник.{catalog} ГДЕ Подстрока(Наименование, 0, 1) В ({condition})";
            result = запрос.Выполнить().Выгрузить();
        </script>
    
    


    При нажатии на кнопку Обновить происходит вызов функции

    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 = '<li catalog="' + item.name + '">' + item.synonym + '</li>';
                    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 аналогичным для остальных браузеров методом.

    Ошибка при доступе через Internet Explorer
    На IE Ajax не работает с использованием user/password — свойств $.ajax. На FF и Chrome все работает нормально. По какой-то причине на сервер в случае с IE не передается заголовок

    Authorization: Basic 0JHQsNGF0YjQuNC10LLQn9CYICjRgNGD0LrQvtCy0L7QtNC40YLQtdC70YwpOg==
    Если кто-нибудь знает причину и как обойти, пожалуйста, напишите в комментариях.

    Выводы



    Предложенный подход на основе SOAP имеет право на существование для несложных задач, так как сопровождается достаточно большим числом JavaScript кода. Возможно, в будущем удастся создать JavaScript фреймворк для упрощения процесса создания приложений.

    Разработчики в этом способе самостоятельно отвечают за безопасность. Необходимо проверять входные параметры при записи, не позволять запуск произвольных скриптов, переданных с клиента. В статье выполнение произвольного кода показано только для примера. Унифицировать можно выполнение произвольного запроса, но это связано с опасностью SQL-инъекций.

    Внешние компоненты Native API от 1С не будут работать в данной среде. Это значит, что нужно дополнительно решать проблему с написанием драйверов для оборудования.

    Пример веб-сайта: web-site.zip (81,76 kb)
    • +5
    • 34.6k
    • 4
    Share post

    Comments 4

      0
      Уныло в комментариях. Дай хотя бы я прокомментирую перед новым годом =)
        0
        а я как-то запилил генератор wsdl + soap-заляпухосервер на php для того, чтобы из 1с вызывать можно было… fragster.ru/tmp/test.php?wsdl

      Only users with full accounts can post comments. Log in, please.