При интеграции 1С с веб-сайтами часто возникает задача создания механизма, который по внешнему запросу (например, передающему артикул или код производителя) возвращает данные об остатках и ценах в формате JSON. Рассмотрим, как правильно реализовать такой сервис, почему для этой задачи лучше выбрать HTTP-сервис вместо классического Web-сервиса, и как грамотно сформировать ответ.
Прежде всего, разберем разницу. Web-сервисы в 1С работают по протоколу SOAP. Это строгий стандарт, требующий описания типов данных через XDTO-пакеты и обертывания сообщений в XML-конверты. Хотя SOAP позволяет передавать JSON внутри XML-строки, это избыточно и неудобно для современных веб-разработчиков.
Проанализируем преимущества HTTP-сервисов (REST): они позволяют обмениваться данными напрямую через тело HTTP-запроса в любом формате, включая JSON. Это «легковесный» способ, который проще в отладке и поддерживается любыми веб-технологиями на стороне сайта. Поэтому для нашей задачи мы будем использовать именно HTTP-сервис.
Рассмотрим процесс создания объекта в конфигураторе. Перейдем в ветку Общие -> HTTP-сервисы и добавим новый объект.
ИнтеграцияССайтом.api или v1. Это часть пути, по которой сервис будет доступен извне.http://www.yourcompany.ru/rest.Далее создадим Шаблон URL. В свойствах шаблона укажем путь, например, /get_stock. Внутри шаблона добавим Метод. Для получения данных обычно используется метод GET.
Выясним, как получить параметры запроса (Код производителя, Артикул и т.д.). В обработчике метода нам доступен объект Запрос типа HTTPСервисЗапрос. Если параметры передаются в строке запроса (например, .../get_stock?article=123), мы извлекаем их следующим образом:
Функция get_stockGet(Запрос)
Артикул = Запрос.ПараметрыURL.Получить("article");
Производитель = Запрос.ПараметрыURL.Получить("brand");
// Выполняем поиск в базе данных (Запрос к остаткам)
// ...
КонецФункции
Разберем, как подготовить ответ. Для этого лучше всего использовать объект Структура или Соответствие. Если важно соблюдать регистр ключей (например, сайт требует name с маленькой буквы), используйте Соответствие, так как в Структуре ключи всегда начинаются с заглавной буквы.
Посмотрим на пример формирования данных на основе результатов запроса к базе:
ДанныеОтвета = Новый Структура;
ДанныеОтвета.Вставить("Артикул", Выборка.Артикул);
ДанныеОтвета.Вставить("Наименование", Выборка.Наименование);
ДанныеОтвета.Вставить("Остаток", Выборка.КоличествоОстаток);
ДанныеОтвета.Вставить("ЦенаРозничная", Выборка.Цена);
// Сериализация в JSON строку
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,, Новый СериализаторXDTO(ФабрикаXDTO));
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
ЗаписатьJSON(ЗаписьJSON, ДанныеОтвета);
РезультатСтрокой = ЗаписьJSON.Закрыть();
Теперь проанализируем, как правильно вернуть эти данные сайту. Нам нужно создать объект HTTPСервисОтвет, установить код состояния 200 (ОК), указать тип контента и поместить нашу JSON-строку в тело ответа.
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(РезультатСтрокой, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
Чтобы сервис стал доступен в интернете, его необходимо опубликовать на веб-сервере (IIS или Apache). Рассмотрим этот процесс:
Важный нюанс: для высокой скорости работы настройте пул соединений в файле default.vrd. Это позволит 1С не создавать новый сеанс для каждого запроса, а использовать уже открытые, что сократит время ответа с секунд до миллисекунд.
Посмотрим, как проверить работу сервиса без написания кода на стороне сайта. Рекомендуем использовать бесплатный инструмент Postman или аналогичные расширения для браузера.
http://server/base/hs/api/v1/get_stock?article=ABC.При разработке профессионального сервиса обязательно используйте конструкцию Попытка...Исключение. Если данные не найдены, хорошим тоном считается возврат кода 404, а в случае системной ошибки — кода 500.
Для обеспечения безопасности создайте в 1С отдельного пользователя с ограниченными правами. У этого пользователя не должно быть доступа к интерфейсу, только права на чтение конкретных справочников и регистров, необходимых для работы сервиса.