HTTP Сервисы: Путь к своему сервису. Часть 1

13.03.20

Интеграция - WEB-интеграция

Уже много было написано про http-сервисы, но то и дело всплывают «Новые» статьи по обмену между базами V8 по COM, что «Немножко» удивляет. Решил внести свои 5 копеек, поработаем с http-сервисом.

Скачать файлы

Наименование Файл Версия Размер
HTTP Сервисы: Путь к своему сервису. Часть 1:
.cfe 7,13Kb
67
.cfe 0.0.1 7,13Kb 67 Скачать

Я уже писал статью с использованием HTTP-сервисов (Мобильный клиент + HTTP Сервис + Расширение конфигурации), но там было все сумбурно без объяснений, почему именно так. В данном цикле статей расскажу и покажу в примерах накопленный опыт в данном вопросе, и мы сделаем простой легко разворачиваемый каркас HTTP-сервиса.

Примеры будут сделаны в расширении конфигурации, на платформе 8.3.10.2650. Для опытов установил ERP 2.4.3.145(Но вообще непринципиально, ставим любую свежую конфигурацию под 8.3.10). Так как параллельно в свободное время веду разработку универсального решения под названием Pretty API или «PAPI», расширение будет содержать данную аббревиатуру.

Начнем.

Почему http-сервис?

А) HTTP сервисы на платформе 1С 8.3.5.1068 появились летом 2014 года, то есть 4 года назад, а Web-сервисы и того больше. Это кощунство не использовать их до сих пор.

Б) На Хабре в официальном блоге Фирмы 1С есть статья Способы интеграции с 1С от 25 августа 2016, почитайте ее, особенно в части устаревших технологий.

В) Геморрои с разными версиями и «comcntr.dll» забываем как страшный сон! Опубликовали и пользуемся, плюсом мы получаем Веб клиент, мобильный клиент, легкое использование нашего сервиса другими программистами (собственно, API) и другие пряники.

Г) Скорость! Использую Com последние 3 года только для того чтобы показать сравнение со стандартным интерфейсом oData или http-сервисом. Когда люди видят вживую, они даже иной раз не верят, что обмен прошел!

Это все равно, что ездить каждый год на поезде по 3 суток в сторону Сочи и вдруг слетать на самолете за 2,5 часа.

!!! Использование технологии COM (доступно только на платформе Windows) !!!

Д) С версии 8.3.7.1759 могут быть встроены через расширение, а с версии 8.3.9 плюсом к ним можно встроить модули для более простой работы с ними.

E) Простота и гибкость разработки.

Ж) Стагнация - это плохо! В работе можешь не использовать, но быть всегда готов. Нельзя стоять на месте, если пошел в IT сферу.

Еще много чего можно перечислить. Минусы, тоже есть, но плюсов в разы больше.

Самый главный минус. Нужно установить и настроить веб сервер (IISApache, 1С: Публикатор или 1С: Линк – Apache с интерфейсом для простого пользователя). Тут вот в чем проблема: чаще всего администраторы почему-то не в состоянии это сделать, и приходится настраивать самому, либо они тупо устанавливают по дефолту и там начинаются пляски с бубном. Благо сейчас статей по настройки пруд пруди, ниже приведу парочку загугленных:

Пошаговая инструкция настройки web-сервисов для 1Сv8.3 и IIS 8.5, в данной инструкции особенно выделю пункт 8.

Настройка веб сервера Apache + 1С (Пошаговое руководство)

Лично я использую IIS, но на вкус и цвет как говорится.

Ближе к делу.

Создадим демо конфигурацию для опытов и добавим в него расширение. Можно создавать все объекты и не в расширении, я просто показываю вариант без изменения конфигурации. (В расширении добавление HTTP-сервисов появилось с версии 8.3.7.1759.)

Давайте перед созданием нашего HTTP-сервиса разберемся из чего складывается URL (подробнее описано на ИТС в главе 17.2.2. HTTP-сервисы):

http://host/base/hs/корневойURL/относительныйURL?ПараметрыЗапроса

host IP адрес или доменное имя веб сервера.

base – Имя базы. Указывается при публикации.

hs - признак того, что выполняется обращение к HTTP-сервису.

корневойURL - имя ресурса, которое определяет группу ресурсов, связанных общим смыслом.

относительныйURL - определяет ресурс, к которому будет выполняться обращение. Относительный URL, указанный в запросе, будет использован для определения конкретного ресурса, к которому выполнялось обращение. Правило сопоставления задается в объекте Шаблон URL.

ПраметрыЗапроса Не всегда обязательные параметры передаются после знака «?», чаще всего дополнительные параметры или параметры выборки, например формат ответа(format=json или format=atom).

Теперь по порядку:

Создаем сервис и задаем ему корневойURL:

Создаем Шаблон URL:

При создании шаблона можно использовать следующие символы:

Любые символы, допустимые в идентификаторах языка «1С:Предприятие».

Символ «/»;

Символы «{}» с непустым текстом между ними;

Символ *.

Наш шаблон выглядит следующим образом: /V1/{ИмяМетода}

Где {ИмяМетода} является параметром. Параметр может состоять из букв, цифр и символа подчеркивания «_».

Почему такой шаблон?

Когда смотришь различные примеры, коих очень много в шаблоны запихивают параметры. Создают по несколько методов с разными параметрами. А зачем так делать?

Вот пример с ИТС (17.2.2.3.2. Работа с документами):

Видно, что создано два Шаблона с методом Get, но по большому счету отличаются они только тем, что один ищет по номеру документ, а второй выводит все.

Все это можно реализовать одним методом, список или документ подавать в параметр ИмяМетода, а дополнительными параметрами передавать номер. А давайте сделаем!

Добавляем метод GET.

Берем код из примера ИТС.

 
 17.2.2.3.2. Работа с документами (Тестовый пример)
Функция СписокGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    Результат = "Расходная накладная, 1, 01.01.2014
    |Расходная накладная, 2, 01.01.2014";
    Ответ.УстановитьТелоИзСтроки(Результат);
    Возврат Ответ;
КонецФункции
Функция ДокументGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    Номер = Число(Запрос.ПараметрыURL.Получить("number"));
    Если Номер > 2 Тогда
        Ответ.КодСостояния = 404;
        Ответ.УстановитьТелоИзСтроки("Отсутствует документ с номером: " + Номер);
    Иначе
        Если Номер=1 Тогда
            Ответ.УстановитьТелоИзСтроки("Расходная накладная, 1, 01.01.2014");
        Иначе
            Ответ.УстановитьТелоИзСтроки("Расходная накладная, 2, 01.01.2014");
        КонецЕсли;
    КонецЕсли;
    Возврат Ответ;
КонецФункции

 

Видоизменяем его и добавляем код обработки метода:

 
 Функция PrettyAPIGET
Функция PrettyAPIGET(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	
	ИмяМетода = Запрос.ПараметрыURL.Получить("ИмяМетода");
	
	Если ИмяМетода = "Список" Тогда 
		Результат = "Расходная накладная, 1, 01.01.2014
    	|Расходная накладная, 2, 01.01.2014";

	ИначеЕсли ИмяМетода = "Документ" Тогда
		//ПраметрыЗапроса - number
		ПарНомер = Запрос.ПараметрыЗапроса.Получить("number");
		Номер = Число(?(ПарНомер=Неопределено,0,ПарНомер));
		Если Номер > 2 Тогда
	        Ответ.КодСостояния = 404;
	        Результат = "Отсутствует документ с номером: " + Номер;
	    Иначе
	        Если Номер = 1 Тогда
	            Результат = "Расходная накладная, 1, 01.01.2014";
	        Иначе
	            Результат = "Расходная накладная, 2, 01.01.2014";
	        КонецЕсли;
	    КонецЕсли;
	Иначе
		 Ответ.КодСостояния = 405;
		 Результат = "Отсутствует Метод " + ИмяМетода;
	КонецЕсли;	
	
	Ответ.УстановитьТелоИзСтроки(Результат,КодировкаТекста.UTF8);	
	//Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
	Возврат Ответ;
КонецФункции

 

Выполняем публикацию нашего сервиса:

Проверяем результат:

1 Получим список. Запрос: http://127.0.0.1/DemoEnterprise2_4_3_145/hs/PrettyAPI/V1/Список

Результат:

Получаем какие-то «кракозябры»! Первый раз я нарвался на этот момент с кодировкой около 4-х лет назад, ну и так как на ИТС пример как раз приводит к этому, решил показать и рассказать, как исправить.

Вы обратили внимание, что в коде функции PrettyAPIGET я оставил в самом конце закомментированную строку

//Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");

Разкомментируем ее и проверим, как теперь отработает наш сервис.

2 Получим документ с номером 1. Запрос: http://127.0.0.1/DemoEnterprise2_4_3_145/hs/PrettyAPI/V1/Документ?number=1

Результат:

Важно: хотелось бы обратить внимание на коды состояния из примера выше. Мне раза три в моей практике попадались API, которые всегда возвращали ответ с кодом 200 (200 OK («хорошо»)) и только в теле ответа, можно было понять, была ли ошибка. Это грубейшая ошибка разработчиков! Ну или это неуважение к конечному потребителю...

Передавая ответ, не забывайте про коды состояния (Список кодов состояния)!

Вот тут хороший пример по работе с ответом в зависимости от кода состояния, обратите внимание на ошибку с кодами 3XX.

Как Вы видите, мы обошлись одним Шаблоном для той же задачи. По сути можно сделать некий универсальный каркас для HTTP-метода и решать любую задачу Интеграции.

Давайте разобьем все возможные сервисы на блоки, чтобы понять, как сделать некое универсальное решение.

Сервис выполняет следующие действия:

  1. Получение входящих параметров и проверка их корректности
  2. Выполнение основных действий
  3. Формирование ответа

Если посмотреть пример выше, то понимаем, что все идет в вперемешку, не структурированно. Отлаживать такой сервис не очень приятно!

Я предпочитаю для HTTP-методов создавать отдельные модули и «Выполнение основных действий» осуществлять в созданном модуле. Создание отдельного модуля позволяет отлаживать HTTP-сервис через внешнюю обработку, это бывает необходимо при получении ошибки, которая говорит, что в коде есть ошибка, но отладка по HTTP не останавливается на точке остановы. Давайте «причешем» пример выше.

Создадим модуль и переделаем «получение параметров» и «формирование ответа».

 
Функция PrettyAPIGET 
Функция PrettyAPIGET(Запрос)
	СтруктураВхПараметров = Новый Структура;
	//Получаем имя метода
	перИмяМетода  = Запрос.ПараметрыURL["ИмяМетода"];    
	//Помещаем имя метода в структуру
	СтруктураВхПараметров.Вставить("ИмяМетода",перИмяМетода);  
	
	//Забираем параметры из запроса
	ВхПараметрыЗапроса = Новый Соответствие;
	Для каждого Параметр Из Запрос.ПараметрыЗапроса Цикл
        ВхПараметрыЗапроса.Вставить(Параметр.Ключ,Параметр.Значение);
    КонецЦикла;
	СтруктураВхПараметров.Вставить("ПараметрыЗапроса",ВхПараметрыЗапроса);
	
	//Передаем входящие параметры (Модуль для метода GET)
	СтруктураОтвет = PAPI_ОбработкаМетодовGET.PAPI_ОбработкаМетодовGET(СтруктураВхПараметров);
	
	//Создаем ответ с кодом состояния
	Ответ = Новый HTTPСервисОтвет(СтруктураОтвет.КодОтвета);
	Если СтруктураОтвет.Отработало Тогда 
	    Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ДанныеОтвета,КодировкаТекста.UTF8);
	Иначе
		Ответ.УстановитьТелоИзСтроки(СтруктураОтвет.ТекстОшибки,КодировкаТекста.UTF8);
	КонецЕсли;	
	
	Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
	Возврат Ответ;
КонецФункции

 

 
 Модуль PAPI_ОбработкаМетодовGET
//Функция экспортная, специально чтобы можно было отлаживать как по HTTP(https://its.1c.ru/db/metod8dev#content:5756:hdoc)
//Так и через внешнюю обработку
Функция PAPI_ОбработкаМетодовGET(СтруктураВхПараметров) Экспорт
	//структура ответа. Собственна нужна для формирования ответа
	СтруктураОтвет = Новый Структура("ДанныеОтвета,Отработало,ТекстОшибки,КодОтвета","",Истина,"",200);
	
	//Переправляем на нужный метод
	Если ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Список") Тогда
		
		ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров);	
		
	ИначеЕсли ВРег(СтруктураВхПараметров.ИмяМетода) = ВРег("Документ") Тогда

		ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров);
		
	Иначе
		ЗаполнитьСтруктуруОтвета(СтруктураОтвет,405,"Отсутствует Метод " + ?(СтруктураВхПараметров.ИмяМетода=Неопределено,"",СтруктураВхПараметров.ИмяМетода),ложь,"");
	КонецЕсли;
	Возврат СтруктураОтвет;	
КонецФункции
//Заполняем структуру ответа
Процедура ЗаполнитьСтруктуруОтвета(СтруктураОтвет,КодОтвета,ТекстОшибки,Отработало,ДанныеОтвета)
	СтруктураОтвет.КодОтвета 	= КодОтвета;
	СтруктураОтвет.ТекстОшибки	= ТекстОшибки;
	СтруктураОтвет.Отработало	= Отработало;
	СтруктураОтвет.ДанныеОтвета = ДанныеОтвета;	
КонецПроцедуры

//МЕТОДЫ
Процедура ПолучитьСписок(СтруктураОтвет,СтруктураВхПараметров)
	Результат = "Расходная накладная, 1, 01.01.2014
	|Расходная накладная, 2, 01.01.2014";
	СтруктураОтвет.ДанныеОтвета = Результат;
КонецПроцедуры	

Процедура ПолучитьДокумент(СтруктураОтвет,СтруктураВхПараметров)
	//ПраметрыЗапроса - number
	ПарНомер = СтруктураВхПараметров.ПараметрыЗапроса.Получить("number");

	Номер = Число(?(ПарНомер=Неопределено,0,ПарНомер));
	Если Номер > 2 Тогда
		ЗаполнитьСтруктуруОтвета(СтруктураОтвет,404,"Отсутствует документ с номером: " + Номер,ложь,"");
	Иначе	
		Если Номер = 1 Тогда
			Результат = "Расходная накладная, 1, 01.01.2014";
		Иначе
			Результат = "Расходная накладная, 2, 01.01.2014";
		КонецЕсли;
		СтруктураОтвет.ДанныеОтвета = Результат;	
	КонецЕсли;
КонецПроцедуры	

 

Как вы видите, размер кода увеличился, но стало гораздо проще добавлять новые методы.

Нужно просто добавить в проверку (PAPI_ОбработкаМетодовGET.PAPI_ОбработкаМетодовGET) новое имя метода и процедуру для этого метода.

По отладке HTTP-сервисов рекомендую статью с ИТС (https://its.1c.ru/db/metod8dev#content:5756:hdoc)

Первую часть заканчиваю. Мы рассмотрели с Вами как создать каркас для Get метода. В следующих частях поговорим про другие методы, про oData и JSON. Как и в этой статье будут примеры, но более интересные.

Статьи из данного цикла:

HTTP Сервисы: Путь к своему сервису. Часть 2

HTTP Сервисы: Путь к своему сервису. Часть 3

HTTP Сервисы: Путь к своему сервису. Часть 4

Также рекомендую:

"Выполнятор" – как я породил монстра и лишился сна!

HTTP-сервис API JSON IIS http web apache сервис Публикатор Линк PAPI Pretty XML oData Код состояния HTTP-сервисы

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15748    10    17    

11

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17551    6    15    

13

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16360    42    49    

23

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25741    9    0    

7

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88583    160    215    

318
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. blackhole321 1303 16.07.18 08:03 Сейчас в теме
Видно, что создано два Шаблона с методом Get, но по большому счету отличаются они только тем, что один ищет по номеру документ, а второй выводит все.

Все это можно реализовать одним методом


Возможно авторы хотели изолировать эти методы, чтобы было проще вносить правки в дальнейшем. Иначе, есть риск, что Ваш один метод со временем примет монстрообразный вид.
IVKuzmin; CyberCerber; SagittariusA; zoikins; portwein; Snegurochka; zuxelzz; +7 Ответить
2. capitan 2466 16.07.18 09:38 Сейчас в теме
«comcntr.dll» забываем как страшный сон!

Напоминает Хрущева и его попытки засеять страну кукурузой.
HTTP сервисы и COM совершенно разные технологии, нет смысла их противопоставлять.
Начиная с того, что разные стороны выступают в логи ведущего.
Делать все на HTTP так же бессмысленно, как и делать все на COM
В вашей же терминологии- это как вдруг слетать на самолете на работу вместо того чтобы на маршрутке доехать
Ну и маленькая ложечка дегтя - попробуйте тысяч десять строк передать по HTTP ,а потом порадуете сообщество быстродействием.
если конечно индеец раньше не ляжет )
wowik; Igirma; kild; simuljakr; SagittariusA; user1276813; Риник; alex-l19041; lepth; LordKim; sbcode; A7_Sash; cdrw3; Tavalik; +14 Ответить
7. Silenser 592 18.07.18 14:18 Сейчас в теме
(2)
Ну и маленькая ложечка дегтя - попробуйте тысяч десять строк передать по HTTP ,а потом порадуете сообщество быстродействием.
если конечно индеец раньше не ляжет )
Как мне кажется, вопрос не в количестве строк, а в объеме пакета. В IIS ограничение, вроде бы, 30 Мб, хотя как утверждают некоторые разработчики на форумах, вопрос производительности начинает быть актуальным уже после 10 Мб. С вашей идеей в целом согласен, разные инструменты для разных задач.
11. dsdred 3251 06.08.18 14:49 Сейчас в теме
(2)
Напоминает Хрущева и его попытки засеять страну кукурузой.


Забавное сравнение. Спасибо, посмеялся.

Делать все на HTTP так же бессмысленно

Я про все не говорю, но мне лично непонятны вот такие статьи (https://infostart.ru/public/827371/) от мая 2018,
при чем радует, что статья ссылается на свежую статью 2012 года

Ну и маленькая ложечка дегтя - попробуйте тысяч десять строк передать по HTTP ,а потом порадуете сообщество быстродействием.
если конечно индеец раньше не ляжет )


Дегтя не уловил. Специально глянул сейчас один из сервисов который делал для крупной сети. Смыл в том, что из УТ10 забираю данные раз в час по оптовому складу продажи за день и свободные остатки на текущий момент и там порядка 20К строк, забираю за 30-120 секунд.

Вообще http-сервисы, как ниже было замечено ограничены не количеством строк а размером передаваемого сообщения, ограничение настроено на стороне веб сервера и в случае с IIS можно вот тут например посмотреть как его сделать больше или меньше (https://infostart.ru/public/427026/)

Ну и так же никто не запрещает использовать порции. Ну и формат сообщения тоже влияет на объем, оптимально использовать JSON.

П.С. Хотел в следующих частях про эти вещи говорить...
user635629_exter; Емельянов Алексей; user1276813; +3 Ответить
10. dsdred 3251 06.08.18 14:22 Сейчас в теме
(1)
Возможно авторы хотели изолировать эти методы, чтобы было проще вносить правки в дальнейшем. Иначе, есть риск, что Ваш один метод со временем примет монстрообразный вид.


Как раз таки монстрообразный вид это если сделать так как на ИТС пример написан.
Приложу прин скрин 4-х летней давности, когда я только изучал веб-сервисы.

В моем примере у каждого метода своя процедура, править легко.
Прикрепленные файлы:
14. blackhole321 1303 07.08.18 08:37 Сейчас в теме
(10)и..?
Вы считаете более разумным запихнуть все из Вашего принтскрина в один метод?
15. dsdred 3251 08.08.18 15:07 Сейчас в теме
(14) Если кратко ответить, то да. Что-то в GET, что-то в POST.

А вообще то, что я считаю разумным у меня в процессе разработки.
3. ArchLord42 83 16.07.18 12:43 Сейчас в теме
Важно: Хотелось бы обратить внимание на коды состояния из примера выше. Мне раза три в моей практике попадались API, которые всегда возвращали ответ с кодом 200 (200 OK («хорошо»)) и только в теле ответа, можно было понять, была ли ошибка. Это грубейшая ошибка разработчиков! Ну или это неуважение к конечному потребителю...


Вообще-то это не фига не грубейшая ошибка и не неуважение к потребителю API, сразу видно что с построением архитектуры HTTP сервисов вы знакомы плохо, много где (в книгах, в блогах, на стэковерфлоу) уже давно разжеваны причины такого подхода.

Простой пример: мы хотим получить данные учетной записи, отправляя запрос на account/{guid}

Я запрашиваю /account/123, мне сервис возвращает { status: 400, msg: "incorrect guid" }, я точно понимаю, что я ввел не верный гуид
Я запрашиваю /account/t140762c2-0742-4046-9a0e-c4f81931c549 мне возвращает { status: 404, msg: "account not found" }, я точно понимаю, что акка с таким гуидом нету

Все что было выше - это ошибки БИЗНЕС логики

А теперь я запрашиваю /accounttttt/t140762c2-0742-4046-9a0e-c4f81931c549
и мне тупо возращается HTTP код 404 и тут я понимаю, что я накосячил с УРЛом
Это ошибка транспорта HTTP

Как итог: в первом и втором случае, запрос прошел корректно, сервер его корректно обработал и вернул ответ с ошибкой в бизнес логики.
В третьем запросе, запрос не дошел даже до сервера, он его не обработал в принципе и я получил ошибку 404, а то, что коды ошибок совпадают с HTTP кодами, так это как раз из уважения к потребителям, т.к. примерно понятен смысл без всяких доп.сообщений, а постоянно возвращающийся ответ с 200 кодом, означает, что траспорт информации по HTTP от клиента до сервера прошел корректно и сервер его корректно обработал.

ЗЫ. Конечно постоянно возвращать 200, даже когда на сервере произошла ошибка это предмет многих холиваров, вот например когда использование кодов является хорошим тоном.
200 - тут все ясно
400 - Bad Request, ошибка клиента - выдавать например при ошибке парсинга JSON (в случае когда он не валидиный) или это вообще не JSON
401 - Unauthorized - тут думаю тоже все ясно,
500 - Internal Server Error - Все необработанные ошибки сервера
user635629_exter; Merkalov; IVKuzmin; Емельянов Алексей; oleg-m; SagittariusA; Dima_d; proninvs; user1276813; Anton64; pbabincev; efin; Smaylukk; sbcode; addict2blood; JohnyDeath; AlexGroovy; Danil.Potapov; dmpas; nbeliaev; kuntashov; capitan; +22 Ответить
4. capitan 2466 16.07.18 14:23 Сейчас в теме
5. CSiER 35 18.07.18 05:57 Сейчас в теме
(3)
Вообще-то это не фига не грубейшая ошибка и не неуважение к потребителю API, сразу видно что с построением архитектуры HTTP сервисов вы знакомы плохо, много где (в книгах, в блогах, на стэковерфлоу) уже давно разжеваны причины такого подхода.

Интерпретировать это как ошибку или нет зависит от того, как именно используется HTTP (только как транспорт или в качестве RESTful api), имхо. Ваш пример ближе к транспорту, у автора публикации - к REST.

(3)
ЗЫ. Конечно постоянно возвращать 200, даже когда на сервере произошла ошибка это предмет многих холиваров, вот например когда использование кодов является хорошим тоном.

- аналогично, все зависит от того, как именно предполагается использовать API. На мой взгляд, здесь автор API решает как делать правильно (можно и 200 всегда возвращать и только get, а описание ошибки в ответе) - главное чтобы это все было хорошо описано, например, с помощью apiary.io.
13. dsdred 3251 06.08.18 22:30 Сейчас в теме
(3)
В примере который я описал в статье труда не составит отрабатывать по Вашему.
ЗаполнитьСтруктуруОтвета(СтруктураОтвет,200,"{""status"":404,""msg"":""account not found""}",ложь,"");

Ну а вообще, отличить ошибку Бизнес логики от ошибки возвращаемой веб сервером, думаю труда не составит, но спорить с Вами не буду, так как
это предмет многих холиваров
user1276813; Xephone; +2 Ответить
6. addict2blood 1 18.07.18 10:19 Сейчас в теме
Самый главный минус. Нужно установить и настроить веб сервер


Самый главный минус это выдача лицензий сервером 1С
8. capitan 2466 18.07.18 17:08 Сейчас в теме
(6)все смешалось в доме облонских...
на HTTP лицензия не расходуется
9. addict2blood 1 26.07.18 11:20 Сейчас в теме
(8) А я не писал, что HTTP лицензия расходуется.

Только вот выдача лицензий сервером 1С тратит лицензию на каждое подключение. Запустил базу два раза - сожрал две лицензии. Запустил четыре базы - сожрал четыре лицензии.
12. dsdred 3251 06.08.18 14:55 Сейчас в теме
(9) Не понимаю к чему Вы это написали...
16. WKBAPKA 214 15.08.18 11:18 Сейчас в теме
(8) я тоже читал, что при использовании HTTP лицензия расходуется, не расходуется при использовании WEB-Сервиса.
Передавал каталог товаров в формате JSON, сервер Apache, пока с ограничением не столкнулся.
17. WKBAPKA 214 15.08.18 11:21 Сейчас в теме
Есть еще одно но при использовании HTTP, не все админы любят когда сервак где установлена 1С ка смотрит в мир и часто это дело закрывают. Поэтому достучаться можно только через внутреннюю сеть. Выходит, что надо тогда ставить отдельный сервак который будет смотреть в мир, иначе никак )
18. dsdred 3251 15.08.18 16:12 Сейчас в теме
(17)
Есть еще одно но при использовании HTTP, не все админы любят когда сервак где установлена 1С ка смотрит в мир и часто это дело закрывают. Поэтому достучаться можно только через внутреннюю сеть. Выходит, что надо тогда ставить отдельный сервак который будет смотреть в мир, иначе никак )


Да еще есть мелочи и нюансы с которыми должны по идее справляться админы, к примеру организовать https. В моем текущем месте работы админы такие которые у нас административную часть спрашивают как сделать... Хуже этих слава богу еще не встречал.
19. WKBAPKA 214 15.08.18 20:15 Сейчас в теме
(18)https не поможет, если будут бомбить сервер
20. dsdred 3251 15.08.18 21:14 Сейчас в теме
(19)Ну DDoS-атака это уже отдельный вопрос администрирования.
21. WKBAPKA 214 16.08.18 10:12 Сейчас в теме
(20)согласитесь, поставить отдельный сервачек будет дешевле, чем пытаться потом решать проблемы взлома сервера ?
22. dsdred 3251 17.08.18 21:53 Сейчас в теме
(21)
согласитесь, поставить отдельный сервачек будет дешевле, чем пытаться потом решать проблемы взлома сервера ?


А кто спорит то? Согласен на все 100%.

Вопрос обычно к жадности владельца бизнеса. Бывают случае когда скупой решает "Сэкономить" на персонале и железе в итоге затраты в разы выше если, что то случается.
23. M_Volkov 5 30.12.19 08:27 Сейчас в теме
Можно создавать все объекты и не в расширении, я просто показываю вариант без изменения конфигурации. (В расширении добавление HTTP-сервисов появилось с версии 8.3.7.1759.)

Самая низкая платформа, которая используется, 8.3.10.2466. Можно обойтись без расширения?
24. dsdred 3251 30.12.19 21:50 Сейчас в теме
(23)Добрый вечер. Конечно можно обойтись без расширения, но платформа не менее 8.3.5.1068 (в ней появились HTTP сервисы)
Я продемонстрировал все в расширении, чтобы показать как добавить http сервис без доработки конфигурации.
25. aspirator23 339 19.10.20 09:32 Сейчас в теме
Задал вопрос в конкурирующей ветке, но не получил ответ. :)
Есть ограничения на длину передаваемой строки в этом запросе HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаНоменклатураJSON);
если передаем запрос как Post ?
26. dsdred 3251 19.10.20 09:37 Сейчас в теме
(25)Есть ограничение на размер.
На длину ограничение только если запрос GET и вы передаете параметры в URL.

В 4 части https://infostart.ru/1c/articles/893304/
Про размер писал.
27. aspirator23 339 19.10.20 09:41 Сейчас в теме
(26) Спасибо, в четвертой части читал, там указано 30мб. У меня, если более 1млн. символов, виснет отправка. Меньше - работает нормально. Что это может быть?
28. dsdred 3251 19.10.20 09:45 Сейчас в теме
(27)Как вариант бить на порции.
Что в заголовке запроса Content-Length?

Content-Length - указывает размер тела объекта в десятичном числе октетов (байтов)
29. aspirator23 339 19.10.20 10:38 Сейчас в теме
(28) Заголовки пустые, тип соответствие. На порции дроблю, но интересно понять что это за ограничение.
31. dsdred 3251 19.10.20 12:09 Сейчас в теме
(29)ЕЩЕ

https://docs.microsoft.com/ru-ru/dotnet/framework/wcf/feature-details/large-data-and-streaming

При отправке больших объемов данных необходимо задать maxAllowedContentLength параметр IIS (Дополнительные сведения см. в разделе Настройка ограничений запросов IIS) и maxReceivedMessageSize параметр привязки (например, System. ServiceModel. BasicHttpBinding. MaxReceivedMessageSize или MaxReceivedMessageSize ). maxAllowedContentLengthСвойство по умолчанию имеет значение 28,6 МБ, а maxReceivedMessageSize свойство по умолчанию — 64 КБ.

Все ссылки ведут потом в комментарий (30)
32. aspirator23 339 19.10.20 14:38 Сейчас в теме
(31) Спасибо, похоже то.
33. novatrade 09.03.21 17:55 Сейчас в теме
Хочу вставить 5 копеек про СОМ.
Сам обмен по скорости не такой уж и медленный. Я думаю, вся проблема, что подход к нему примитивный.
Если подойти глубже и в базе источник сделать модуль для обмена, который подготавливает данные для передачи (по аналогии с http), и не пытаться передавать всякие ссылочные объекты (а разве http пересылает?), то скорость обмена вполне приличная.
Из опыта. Обмен между двумя базами Бухгалтерия и самописная порядка 850 тыс. записей с привязкой номенклатуры, формированием накладных и записью по 22 складам заняло 24 минуты. Не думаю, что http быстрее будет, т.к. тут затраты основные - на формирование документов и запись в базу.
34. dsdred 3251 09.03.21 19:18 Сейчас в теме
(33)Не убедили.
Писать подсистему специально под COM...
-2021 год на дворе. Не проще ли тогда просто использовать oData?

Как я уже рассказывал в комментариях к 4 части, проводил эксперимент для демонстрации программистам работающим только с COM:
Обходил справочник используя Com проверяя реквизит на определенное значение. Тоже самое делал по OData.
В итоге Com молотил 30 с чем то минут, OData около 3 минут. Удивленные лица многого стоят.

Я ничего не записывал и не создавал.

А вообще Linux вам в помощь. Избавит от COM раз и навсегда. ;)
35. novatrade 10.03.21 11:46 Сейчас в теме
1. У вас много Linux клиентов? На моем пути один из двух десятков. Обменов - вообще не было.
2. Насчет 21 века насмешили. Если надо забить гвоздь, то используйте молоток, хотя он такой не современный...
3. По поводу Вашего примера. Я в основном использовал для выборки информации, искать варианты, чтобы показать недостатки обмена не было задачи. Недостатки есть у каждого варианта обмена.
36. dsdred 3251 10.03.21 11:53 Сейчас в теме
(35)1 Сейчас все больше клиентов хотят переходить на бесплатное ПО. Спрос стал расти.
Linux - это не единственное ограничение COM. Есть еще обмены с сайтами, мобильные приложения и т.д.
2 ...
3 У каждого обмена есть недостатки, но нужно использовать те у которых их меньше и возможностей больше.
П.С. сейчас при обмене все чаще использую прямые запросы в базу и собираюсь кафку прикручивать.
37. novatrade 10.03.21 12:11 Сейчас в теме
Мы говорим об обмене между базами или базой и сайтом?
Я не утверждаю, что СОМ обмены - "это все". Каждый может выбирать что ему нравится. Но СОМ обмен может выручить, когда, например, базы на одном сервере, а веб-сервер не дают поднять. И подсистему не надо разрабатывать, мне для организации выборок на базе источнике хватило одной процедуры.
38. dsdred 3251 10.03.21 16:21 Сейчас в теме
(37)Согласен что есть такие моменты когда без COM или без файлового обмена никуда.
Как Вы и написали "ограничения выставленные в самой организации".
К счастью я с такими клиентами не работаю давно.

Мне коллега как то рассказывал, что в очень крупной сети по-моему Магнит(но это не точно) Com уважают.
Да и на заводах думаю это топ технология обмена.
Да и вакансии бывают типа "Мы очень продвинутые и т.д. знание Com"

В общем каждому свое, а наше дело выбирать с кем работать.
39. serpolit 8 08.09.22 12:05 Сейчас в теме
Здравствуйте. Хочу попросить Вас подсказать мне где моя ошибка при публикации http сервиса от Яндекс-Маркета. Что имеем: 1. Роутер микротик c пробросом порта 8443 на 443 порт виртуальной машины с apache и сервер 1с c базой данных на Postgres на виртуальной машине (на debian10); 2. На этой же виртуальной машине установил apache 2.4; 3. Установил самоподписанный сертификат для https запросов; 4. В программе УТ 11 установил расширение для Яндекс-Маркета и настроил в нем обмен товарами (это работает); 5. С помощью команды webinst создал публикацию и в vrd файл добавил строчки, которые как я думаю должны отвечать за публикацию http сервиса расширения от Яндекса; 6. В личном кабинете на яндекс-маркете в настройках api прописал по инструкции от Яндекса - Токен, URL для запросов API (https://mysite.ru:8443/UT_Yandex/hs/Беру_ПолучениеЗаказовПоAPI), SHA1-отпечаток SSL-сертификата и Способ авторизации (Header). 7. В 1с УТ в настройках обмена заказов с Яндекс-Маркет тоже прописал токен и Способ авторизации (Header). Вот содержимое моего vrd файла:
<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/UT_Yandex"
ib="Srvr=192.168.88.232;Ref=MyBaza;Usr=User;Pwd=123"
enable="true">
<httpServices publishExtensionsByDefault="true">
<service name="Беру_ПолучениеЗаказовПоAPI"
rootUrl="Беру_ПолучениеЗаказовПоAPI"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>

</httpServices>
<standardOdata enable="false"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<analytics enable="false"/>
</point>

Если я хочу подключиться к базе MYBaza через данную публикацию, то https://mysite.ru:8443/UT_Yandex приводит меня к ней и открывается окно с УТ. А вот если в личном кабинете Яндекс-Маркета проверить - то не работает (скрин прикладываю). Также прикладываю скрин http сервисов в конфигурации из расширения.
Как из адресной строки обратиться к http сервису, чтобы проверить его работоспособность?
Прикрепленные файлы:
Прикрепленные файлы:
40. serpolit 8 08.09.22 12:37 Сейчас в теме
Также попробовал изменить vrd файл так:

<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/UT_Yandex"
ib="Srvr=192.168.88.232;Ref=MyBaza;Usr=User;Pwd=123"
enable="true">
<httpServices publishExtensionsByDefault="true">
<service name="Marketplace_API"
rootUrl="Marketplace_API"
enable="true"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>

</httpServices>
<standardOdata enable="false"
reuseSessions="autouse"
sessionMaxAge="20"
poolSize="10"
poolTimeout="5"/>
<analytics enable="false"/>
</point>

И пробую обратиться к сервису через https://standart-akb.ru:8443/UT_Yandex/hs/Marketplace_API/stocks/ - пишет что страница не найдена. Что еще можно сделать?
41. simuljakr 203 14.09.22 18:26 Сейчас в теме
Спасибо за статью!

Хотелось бы еще пару слов о безопасности...

Если создаваемый мною http-сервис будет доступен из интернета (а не только из локальной сети) - нужны ли какие-либо дополнительные настройки для безопасности в Апаче? или в самом 1С ?

Как сделать чтобы 1С (и сервер) не повисли, если вдруг придет 100500 запросов в секунду ?
42. dsdred 3251 14.09.22 19:07 Сейчас в теме
(41) добрый вечер.
Посмотрите мой доклад по этой теме https://infostart.ru/1c/articles/1657078/

Я сейчас в дороге и отвечаю на ходу...
simuljakr; +1 Ответить
43. user635629_exter 37 23.09.22 06:05 Сейчас в теме
Самый главный минус. Нужно установить и настроить веб сервер

В 1с уже давно есть "Автономный сервер" - очень интересная способность, ничего устанавливать не надо, админа звать только для открытия портов в бранде и пробросе наружу.
Я использую для передачи с телефона сканов QR кода в домашнюю бухгалтерию через web-сервис, но этот сервер вроде декларируется, что может всё, что и "старшие" - апач и иис.
44. dsdred 3251 23.09.22 09:07 Сейчас в теме
(43) на сколько я понимаю, он имеет ряд ограничений которые большенству не подойдут, он скорее для малышей чем для средняго и крупного бизнеса.

Про него можно почитать например тут:
https://infostart.ru/1c/articles/1165658/
45. user635629_exter 37 23.09.22 10:14 Сейчас в теме
(44) Каждый выберет для себя сам. И наоборот - большинству надо именно просто и быстро, и чтобы админа не звать :)
Просто Вы пишите, что это главный минус. На работе апач ставится за минуты.
А у себя дома просто не хотел ничего ставить и наткнулся на статью, что Вы привели - я давно ее читал и ссылки не сохранилось, но чтиво очень полезное - больше понимания пришло чем вот отсюда https://its.1c.ru/db/v8314doc/bookmark/adm/TI000000894
Оставьте свое сообщение