Самый примитивный HTTP-сервис в мире

Публикация № 1120823

Разработка - Системная интеграция - Интеграция с WEB

HTTP сервис интеграция Web Ajax JavaScript

Пошаговый пример создания простейшего HTTP-сервиса, который генерирует HTML-страницу для поиска товара, а также реализует асинхронное получение данных из базы.

О чем это здесь рассказывают

На этот раз мы поговорим о механизме платформы 1С:Предприятие - HTTP-сервисы. Подробнее Вы можете прочитать на официальном сайте или посмотреть примеры на Infostart. Там и вывод графиков, и передача данных, RSS-лента. Кто-то даже реализовал мини-CMS на HTTP-сервисах! =) Мы же рассмотрим создание самого примитивного HTTP-сервиса с минимально полезной функцией.

Механизм HTTP-сервисов открыл довольно обширные возможности по интеграции, расширению функционала, оптимизации существующих приложений и т.д. Чем то это похоже на WebAPI в .NET, но, конечно же, имеет куда больше ограничений и "заточено" под более узкий спектр задач. Список всего того, что можно сделать с помощью HTTP-сервисов настолько большой, что в публикации не хватит места, чтобы сохранить его!

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

Небольшой, но результат!

Конфигуратор - наше все!

Откроем конфигуратор и добавим новый HTTP-сервис. В нашем случае у сервиса будут три метода:

  1. "MainPage" - метод типа GET, который возвращает HTML-страницу с минимальным внесением изменений в разметку (о об этом чуть позже). Страницу Вы уже видели выше.
  2. "Products" - метод типа POST, который принимает в теле запроса параметр "query" с текстом, по которому будет выполняться поиск товаров в базе по наименованию. В качестве ответа формируется список найденных товаров в формате JSON.
  3. "Info" - метод типа POST, который в теле запроса принимает параметр "GUID" значение уникального идентификатора товара, а в ответ формирует список значений реквизитов товара (артикул, полное наименование, код и описание).

В конфигураторе это выглядит следующим образом:

В описании корня HTTP-сервиса самой важной настройкой является свойство "Корневой URL", которое отвечает за формирование URL-адреса, по которому мы будем обращаться ко всем методам этого сервиса.

Далее идут свойства шаблонов URL ("GetProducts", "Info" и "MainPage"). Шаблоны также отвечают за формирование URL, по которому мы будем обращаться к методам, но уже для каждого отдельного HTTP-метода сервиса. Если мы посмотрим на скриншоты выше, то понять принцип формирования адреса для каждого из методов не составит особого труда:

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

На скриншотах выше Вы могли видеть свойства методов "GetProducts", "GetInfo" и "get". Первые два имеют тип POST и просто так к ним обратиться по их URL в браузере нельзя. По адресам этих методов нужно отправить соответствующие параметры методом POST, об этих параметрах мы говорили в самом начале. Метод "get" шаблона "MainPage" имеет тип "GET" и при обращении возвращает сформированную HTML-страницу. К этому методу мы можем обратиться непосредственно в адресной строке браузера.

Шаблон HTML-страницы хранится в общем макете с типом HTML-документ. При обращении к методу мы программно получаем текст страницы и возвращаем его в качестве ответа:

Функция MainPageget(Запрос)
	
	МакетСтраницыПоиска = ПолучитьОбщийМакет("ГлавнаяСтраница");
	
	Ответ = Новый HTTPСервисОтвет(200);
	// Для корректного отображения веб-страницы установим тип содержимого как HTML
	Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
	

	// Получаем исходный код страницы и делаем подмену имени сервера
	// в ссылках на методы HTTP-сервиса, чтобы AJAX-запросы отработали
	// корректно
	ТекстСтраницы = МакетСтраницыПоиска.ПолучитьТекст();
	ТекстСтраницы = СтрЗаменить(ТекстСтраницы, "{ServerName}", Константы.ИмяСервера.Получить());
	ТекстСтраницы = СтрЗаменить(ТекстСтраницы, "{DatabaseName}", Константы.ИмяБазы.Получить());
	
	Ответ.УстановитьТелоИзСтроки(ТекстСтраницы);
	
	Возврат Ответ;
	
КонецФункции

В ответе обязательно нужно указать тип возвращаемого содержимого, иначе браузер отобразит HTML-разметку страницы. Обработчики для методов "GetProducts" и "GetInfo" показаны на следующем листинге:

Функция ProductsGetProducts(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	
	// Обрабатываем присланный текст запроса для поиска номенклатуры
	ТекстПоискаНоменклатуры = "";
	Попытка
		ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
		ИмяСвойства = Неопределено;
		ЗначениеСвойства = Неопределено;
		Пока ЧтениеJSON.Прочитать()
			И (ИмяСвойства = Неопределено ИЛИ ЗначениеСвойства = Неопределено) Цикл
			Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда
				// Начинаем обрабатывать объект со строкой запроса	
			ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
				ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
			ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
				ЗначениеСвойства = ЧтениеJSON.ТекущееЗначение;
			КонецЕсли;
		КонецЦикла;
	Исключение
		// Если при обработке возникает ошибка, то считем, что отбор не был установлен	
	КонецПопытки;
	Если ИмяСвойства = "query"
		И ЗначениеЗаполнено(ЗначениеСвойства) Тогда
		ТекстПоискаНоменклатуры = Строка(ЗначениеСвойства);	
	КонецЕсли;
	
	// Получаем список номенклатуры для отправки на страницу в формате JSON
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 10
		|	Номенклатура.Ссылка КАК Ссылка,
		|	Номенклатура.Код КАК Код,
		|	Номенклатура.Наименование КАК Наименование,
		|	Номенклатура.Артикул КАК Артикул,
		|	Номенклатура.ПолноеНаименование КАК ПолноеНаименование,
		|	Номенклатура.Описание КАК Описание
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.Наименование ПОДОБНО &Наименование
		|
		|УПОРЯДОЧИТЬ ПО
		|	Наименование"; 	
	Запрос.УстановитьПараметр("Наименование", "%"+ТекстПоискаНоменклатуры+"%");	
	РезультатЗапроса = Запрос.Выполнить();	
	Выборка = РезультатЗапроса.Выбрать();
		
	Попытка
		ВремФайл = ПолучитьИмяВременногоФайла("json");
		ЗаписьJSON = Новый ЗаписьJSON;
		ЗаписьJSON.ОткрытьФайл(ВремФайл, "UTF-8");
		ЗаписьJSON.ЗаписатьНачалоМассива();
		Пока Выборка.Следующий() Цикл
			ЗаписьJSON.ЗаписатьНачалоОбъекта();
			
			ЗаписьJSON.ЗаписатьИмяСвойства("GUID");
			ЗаписьJSON.ЗаписатьЗначение(Строка(Выборка.Ссылка.УникальныйИдентификатор()));
					
			ЗаписьJSON.ЗаписатьИмяСвойства("Name");
			ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Выборка.Наименование));
			
			ЗаписьJSON.ЗаписатьКонецОбъекта();
		КонецЦикла;
		ЗаписьJSON.ЗаписатьКонецМассива();
		ЗаписьJSON.УстановитьСтроку();
		ЗаписьJSON.Закрыть();
		
		Текст = Новый ТекстовыйДокумент;
		Текст.Прочитать(ВремФайл, "UTF-8");
		СтрокаJSON = Текст.ПолучитьТекст();
	Исключение
		СтрокаJSON = "Ошибка: " + ОписаниеОшибки();
	КонецПопытки;
	
	Ответ.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные(ВремФайл));
	
	Попытка
		УдалитьФайлы(ВремФайл);
	Исключение
	КонецПопытки;
	
	Возврат Ответ;
	
КонецФункции

Функция Infoget(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	
	// Обрабатываем присланный в теле запроса GUID товара
	ТекстGUID = "";
	Попытка
		ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку("UTF-8");
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
		ИмяСвойства = Неопределено;
		ЗначениеСвойства = Неопределено;
		Пока ЧтениеJSON.Прочитать()
			И (ИмяСвойства = Неопределено ИЛИ ЗначениеСвойства = Неопределено) Цикл
			Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда
				// Начинаем обрабатывать объект со строкой запроса	
			ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
				ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
			ИначеЕсли ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
				ЗначениеСвойства = ЧтениеJSON.ТекущееЗначение;
			КонецЕсли;
		КонецЦикла;
	Исключение
		// Если при обработке возникает ошибка, то считем, что отбор не был установлен	
	КонецПопытки;
	Если ИмяСвойства = "GUID"
		И ЗначениеЗаполнено(ЗначениеСвойства) Тогда
		ТекстGUID = Строка(ЗначениеСвойства);	
	КонецЕсли;
	
	СтрокаJSON = "{ }";
	НоменклатураGUID = Неопределено;
	Попытка
		НоменклатураGUID = Новый УникальныйИдентификатор(ТекстGUID);		
	Исключение 
	КонецПопытки;
	
	// Если GUID корректный, то формируем ответ в формате JSON со значениями 
	// реквизитов номенклатуры
	Если ЗначениеЗаполнено(НоменклатураGUID) Тогда
		Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(НоменклатураGUID);	
		Попытка
			ВремФайл = ПолучитьИмяВременногоФайла("json");
			ЗаписьJSON = Новый ЗаписьJSON;
			ЗаписьJSON.ОткрытьФайл(ВремФайл, "UTF-8");
			ЗаписьJSON.ЗаписатьНачалоМассива();
			
			ЗаписьJSON.ЗаписатьНачалоОбъекта();
			
			ЗаписьJSON.ЗаписатьИмяСвойства("Art");
			ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.Артикул));
			
			ЗаписьJSON.ЗаписатьИмяСвойства("FullName");
			ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.ПолноеНаименование));
			
			ЗаписьJSON.ЗаписатьИмяСвойства("Code");
			ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.Код));
			
			ЗаписьJSON.ЗаписатьИмяСвойства("Descr");
			ЗаписьJSON.ЗаписатьЗначение(СокрЛП(Номенклатура.Описание));
			
			ЗаписьJSON.ЗаписатьКонецОбъекта();
			
			ЗаписьJSON.ЗаписатьКонецМассива();
			ЗаписьJSON.УстановитьСтроку();
			ЗаписьJSON.Закрыть();
			
			Текст = Новый ТекстовыйДокумент;
			Текст.Прочитать(ВремФайл, "UTF-8");
			СтрокаJSON = Текст.ПолучитьТекст();
			Ответ.УстановитьТелоИзДвоичныхДанных(Новый ДвоичныеДанные(ВремФайл));
		Исключение
			Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
		КонецПопытки;
	Иначе
		Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

Код далеко не идеален и такой же примитивный, как и весь сервис :) 1C:Совместимо с таким подходом мы вряд ли получим.

Расписывать выполняемые обработчиками действия особого смысла нет, т.к. по оставленным комментариям в коде логика работы должна быть ясна.

Это и есть вся реализация HTTP-сервиса. Давайте посмотрим какой функционал скрывается на HTML-странице и как он реализован.

DEFAULT.HTML

Главная страница нашего HTTP-сервиса содержим элемент SELECT для выбора товара и поиска по вводу. О том как удалось элемент SELECT сделать редактируемым рассказывать здесь не буду, об этом Вы можете прочитать в статье "Редактируемый SELECT" в соседнем блоге. Здесь же предлагаю рассмотреть выполнение асинхронных вызовов методов HTTP-сервиса со страницы с помощью AJAX. Если Вам интересен полный текст разметки страницы и используемый JavaScript-код, то в верху страницы есть ссылка на файл тестовой конфигурации с описываемым примером.

И так, первый асинхронный вызов обращается к методу "GetProducts" для получения списка товаров по введенной строке запроса. Запрос выполняется каждый раз при изменении текста в поле ввода. С использованием JQuery асинхронный запрос выполняется проще простого:

$.ajax({
    type: "POST",
    contentType: "application/json;charset=utf-8",
    url: "http://{ServerName}/{DatabaseName}/hs/PrimitiveService/products",
    data: "{ \"query\": \"" + query + "\" }",
    dataType: "json",
    success: function (queryResult) {
        try {
            for (var i = 0; i < queryResult.length; i++) {
                var item = queryResult[i];
                originalSelect.editableSelect('add', function () {

                    $(this).attr('data-value', item.GUID);
                    $(this).text(item.Name);

                })
            }
        } catch (e) {
            alert('Wow! Error!!!');
        }
    }
});

В качестве ответа мы ожидаем текст в формате JSON, поэтому параметр "dataType" установлен в "json". В параметре "data" описываем произвольный объект со свойством "query" и текстовым значением, введенным для поиска на странице. В параметре "url" указан адрес метода HTTP-сервиса. Если запрос выполнен успешно, то вызывается событие "success", а в вызываемой функции первым параметром передается объект, полученный от сервера. Далее в функции выполняется обработка полученных данных и заполнение списка выбора.

Второй асинхронный запрос используется при изменении товара. Запрос обращается по адресу метода "GetInfo" и при успешном выполнении помещает полученные значения на страницу. Листинг кода запроса следующий:

$.ajax({
    type: "POST",
    contentType: "application/json;charset=utf-8",
    url: "http://{ServerName}/{DatabaseName}/hs/PrimitiveService/info",
    data: "{ \"GUID\": \"" + GUID + "\" }",
    dataType: "json",
    success: function (queryResult) {
        try {
            var Code = queryResult[0].Code;
            var FullName = queryResult[0].FullName;
            var Art = queryResult[0].Art;
            var Descr = queryResult[0].Descr;

            $('#ArtValue').text(Art);
            $('#CodeValue').text(Code);
            $('#DescrValue').text(Descr);
            $('#CodeFullNameValue').text(FullName);
        } catch (e) {
            // Обработка ошибки
        }
    }
});

При необходимости Вы можете подробнее изучить тему работы с JavaScript, JQuery и AJAX на сайте metanit.com, рекомендую.

Вместо заключения

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

Исходный код примера Вы можете найти в репозитории на GitHub.

В качестве более интересного примера, приближенного к реальной разработке, можно рассмотреть создание асинхронных виджетов для 1С:Предприятия с использованием HTTP-сервисов. Но это уже совсем другая история.

Спасибо за внимание и до скорых встреч!

Другие ссылки

Отдельно выделю серию статей от Дмитрия Сидоренко:

Это отличный путь в мир HTTP-сервисов!

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 1581 12.09.19 07:27 Сейчас в теме
Юрий, спасибо.
Я тебя кстати в статье HTTP Сервисы: Путь к своему сервису. Часть 4 упоминал тоже ;))

Вот эту статью твою приводил в пример
Передача больших пакетов через веб-сервисы
YPermitin; +1 Ответить
2. YPermitin 10525 12.09.19 07:32 Сейчас в теме
(1) спасибо огромное :)

А я про 4 часть забыл совсем. Надо бы ее тоже добавить в список ссылок.
3. FreeArcher 110 12.09.19 08:14 Сейчас в теме
А как у вас выполняется авторизация в 1С?
YPermitin; +1 Ответить
5. YPermitin 10525 12.09.19 08:48 Сейчас в теме
(3) по-разному.

Можно и обычную BASIC-аутентификации использовать дальше.
6. FreeArcher 110 12.09.19 10:34 Сейчас в теме
(5) А разве при BASIC-аутентификации проблемы с CORS запросами не будут возникать?
Вобщем меня интересует, как решить проблему CORS без использования проксирующего сервера. Вроде как можно настроить apache но у меня не получилось.

Может есть работающая инструкция или может это тема будущей статьи будет?
4. 3vs 12.09.19 08:30 Сейчас в теме
Да это, фактически, микро Яндекс! :-)
jif; YPermitin; +2 Ответить
7. Sedaiko 405 12.09.19 11:49 Сейчас в теме
А зачем генерировать полный URL в запросе?
url: "http://{ServerName}/{DatabaseName}/hs/PrimitiveService/products",

Относительный путь отлично работает, проверено
8. Steelvan 95 12.09.19 12:40 Сейчас в теме
От жуквери народ отучать надо, на чистом js примеры давай :)
YPermitin; +1 Ответить
11. YPermitin 10525 12.09.19 13:12 Сейчас в теме
(8) так и до Asm'а можно спуститься)))
16. logos 193 13.09.19 15:03 Сейчас в теме
(8) На правах рекламы, в моей публикации во внешней обработке есть пример асинхронных xhr запросов на чистом js.
9. trntv 25 12.09.19 13:00 Сейчас в теме
Извините за критику, но после такой публикации хочется просить администрацию инфостарта о модерации кода,

1. Зачем временные файлы?
ЗаписьJSON.Закрыть();
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ВремФайл, "UTF-8");
СтрокаJSON = Текст.ПолучитьТекст();

Так же проще:
СтрокаJSON = ЗаписьJSON.Закрыть();

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

3. Попытки при любом сомнении в результате?
Попытка
	НоменклатураGUID = Новый УникальныйИдентификатор(ТекстGUID);		
Исключение 
КонецПопытки;

Уберите все попытки, они у вас или не имеют смысла или можно написать код без использования попытки.

4. С JSON же работать очень просто:
ЗаписьJSON= Новый ЗаписьJSON;
ЗначенияРеквизитовЭлемента = Новый Структура("Art, FullName, Code, Descr");
ЗаполнитьЗначенияСвойств(ЗначенияРеквизитовЭлемента, Выборка);
ЗаписатьJSON(ЗаписьJSON, ЗначенияРеквизитовЭлемента);
СтрокаJSON = ЗаписьJSON.Закрыть();

Зачем горы кода. Надо "ЗаписатьНачалоМассива", создайте Новый Массив и запихните туда структуру. Функция ЗаписатьJSON все отлично преобразует сама. Я по умолчанию пропускаю ее через процедуру преобразующую таблицу значений в массив структур. Тогда очень удобно отправлять результат запроса сразу в JSON.

Попытки, временные файлы, множество неявных запросов и вы превратили элементарный молниеносный http-сервис в медленного монстра. Грустно, особенно когда понимаешь, что цель публикации научить чему-то программистов. Еще раз извините, не сдержался.
Fox-trot; Leon75; vladimirmatancev; purgin; mivari; yufan; WizaXxX; pfilyk; logos; A_Max; acanta; Yashazz; triviumfan; tori131313; Сто27001; YPermitin; +16 Ответить
10. YPermitin 10525 12.09.19 13:05 Сейчас в теме
(9) примитивному сервису - примитивный код :)

P.S. сервис на коленке, которому уже почти 5 лет. Думаю даже и обсуждение можно оставить, сейчас бы я все сделал по другому, особенно если для прода :) Собеседование я у Вас не прохожу)))
adhocprog; acanta; Климов Сергей; +3 Ответить
12. Yashazz 3752 12.09.19 21:51 Сейчас в теме
(10) Ну это ж не повод выкладывать устаревшее наколеночное как пример к подражанию. А его так и воспримут, судя по раскрутке статьи. Соглашусь с критикой. Тем более что и статей на эту тему полно, не особо ясно, зачем была ещё одна.
yufan; YPermitin; +2 Ответить
13. YPermitin 10525 12.09.19 21:52 Сейчас в теме
14. 3vs 13.09.19 06:19 Сейчас в теме
(13)"Обидеть художника может каждый..."! :-)

Злобный народ пошёл какой-то!
Человек показывает интересное решение, нет,
надо задавить своей учёностью...

Критикуешь, как говорится, предлагай, выкатывайте
свои статьи!
AnryMc; adhocprog; FirePyres; u_n_k_n_o_w_n; +4 Ответить
17. AMS_Guskov_VL 16.09.19 11:13 Сейчас в теме
(14) уже давно на ИС аналог гита (или сам гит), для открытых разработок, чтобы "злобные комменты" о том что кто-то не умеет кодить решались коммитами, а не двумя разворотами экрана =)
19. 3vs 16.09.19 12:06 Сейчас в теме
(17)Это кирпич в чей огород, Юрия? :-)
YPermitin; +1 Ответить
20. YPermitin 10525 16.09.19 17:36 Сейчас в теме
(19) стоило показать код пятилетней (точно ее помню) давности, теперь все считают что я так и пишу :D

Пусть он такой тут и останется. Мои ошибки - мое богатство:)
adhocprog; 3vs; acanta; +3 Ответить
21. AMS_Guskov_VL 17.09.19 03:28 Сейчас в теме
(19)Это идея для Инфостарта. Было приколько иметь на сайте аналог pasteBin (в меньшей степени) или CodePen, что бы можно было размещать не стены кода, но и "играться" с ним. Зачем мне кидаться камнями тут, удобнее это на стаковерфлоу =)
22. 3vs 17.09.19 06:59 Сейчас в теме
(21)
но и "играться" с ним.

Играться надо дома! :-)
А вот иметь на ИС аналог гита для разработчиков 1С на серверах внутри России, это правильная идея,
только ведь у нас, как правило, бесплатного ничего нет...
15. FirePyres 61 13.09.19 07:41 Сейчас в теме
18. Rustig 1716 16.09.19 11:53 Сейчас в теме
(0) реально ли организовать интернет-продажи через заказы в розничном магазине? то есть в магазине есть продажи в розницу, магазин имеет интернет-сайт, запилили в 1С обмен заказами с сайтом. Уперлись в онлайн-оплату и определение актуальных остатков.
В момент оформления заказа на сайте и онлайн-оплате на кассе может стоять человек с тем же товаром.Поэтому после оплаты заказа на сайте, может выясниться,что остаток в магазине отличается...
Получение остатков на сайте, думаю, делать через http-сервис.
Но организационно вижу пробел.
Есть мнение?
27. buganov 169 18.02.21 11:36 Сейчас в теме
(18)
В момент оформления заказа на сайте и онлайн-оплате на кассе может стоять человек с тем же товаром.Поэтому после оплаты заказа на сайте, может выясниться,что остаток в магазине отличается...

Мы для такого оставляем примерно 10% для оффлайна, на случай, если актуальный остаток не успеет подъехать. А самые ходовые позиции как правило в нормальном пополнении есть всегда на остатке
23. DrZombi 196 17.09.19 08:14 Сейчас в теме
24. Rustig 1716 17.09.19 18:31 Сейчас в теме
(0) я лишь хотел учочнить своим предыдущим постом, был ли у вас опыт развертывания http-сервиса для обмена с 1с заказами с сайта или получения остатков товаров для интернет-сайтов?
YPermitin; +1 Ответить
25. YPermitin 10525 21.09.19 08:09 Сейчас в теме
(24) да, такой опыт есть. Вариант рабочий, но есть различные тех. и организационные ограничения.

Я знаю коробочное решение, которое так и работает :)
26. adhocprog 1197 24.10.19 14:48 Сейчас в теме
Автору огромное спасибо!
Побольше бы таких статей )
Оставьте свое сообщение

См. также

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция Промо

Практика программирования WEB v7.7 v8 Бесплатно (free)

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    57038    Serginio    33    

API ОФД-Я разбор документации с примерами

WEB v8 1cv8.cf Россия Бесплатно (free)

Примеры запросов 1С для получения данных с ОФД-Ярус через API.

20.04.2021    289    www76    0    

Работа через сервис 1С-Отчетность нескольких пользователей

Регламентированная отчетность Зарплата WEB v8 v8::СПР ЗУП3.x Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Организации, в которых количество сотрудников превышает установленное значение, обязаны отправлять отчетность по телекоммуникационным каналам связи. Это может быть Контур-Экстерн, Такском или любой другой провайдер. Все чаще пользователи 1С используют сервис 1С-отчетность. И все чаще сертификат оформляется на сотрудника отдела кадров или бухгалтерии. В случае, если нужно оформить несколько сертификатов, возникают трудности в версии ЗУП 3.1.14 и более поздних. О том, как с ними справиться, пойдет речь в данной публикации.

05.04.2021    561    keat24    1    

Правила обмена больше не нужны

Внешние источники данных Обмен через XML Перенос данных из 1C8 в 1C8 Распределенная БД (УРИБ, УРБД) WEB v8 Бесплатно (free)

Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.

17.03.2021    6791    Nikola23    35    

Online телефонный справочник из 1С: Зарплата и управление персоналом Промо

WEB Управление персоналом (HRM) Управление персоналом (HRM) v8 ЗУП3.x Россия Бесплатно (free)

В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.

10.03.2017    26613    ruha    21    

Как отправить сообщение Telegram в группу?

WEB v8 Россия Бесплатно (free)

Отправка сообщения в группу Telegram.

01.03.2021    880    kite2    2    

Альфа-Авто 5.0 и современные HTTP сервисы

WEB v8 1cv8.cf Автомобили, автосервисы УУ Бесплатно (free)

Решение, позволяющее программным продуктам, работающим на устаревших версиях платформы 1С (8.2), интегрироваться с современными HTTP сервисами. Решение, интегрированное с HTTP-сервисом программы по расчету компонентов для изготовления ЛКМ, описанное в настоящей статье, успешно работает в одном из автосервисов, работающем на устаревшей платформе и конфигурации Альфа-Авто 5.0.

01.03.2021    600    osivv    1    

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

WEB v8 Россия Бесплатно (free)

Есть база, с пользователем/паролем, нужно подключиться к Odata из другой базы 1С, получить элементы справочника.

24.02.2021    691    user823999    6    

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    42355    YPermitin    41    

Интеграция с API WB (Wildberries). Создание карточки товара (спецификации)

WEB v8 1cv8.cf ИТ-компания Россия Бесплатно (free)

Опыт интеграции с API WB (Wildberries), опыт создания карточки товара, получение токенов API WB.

18.01.2021    10373    jenyavp    43    

HTML редактор/editor (Wysiwyg) для WebKit 1С (CMS, B2B), альтернатива TinyMCE и стандартному ФорматированныйДокумент

WEB Интеграция v8 v8::УФ 1cv8.cf Бесплатно (free)

Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.

28.12.2020    2237    SizovE    23    

Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент

Практика программирования WEB Универсальные функции v8 v8::УФ 1cv8.cf Бесплатно (free)

Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.

24.11.2020    829    SizovE    4    

Заготовка для загрузки файлов по ftp Промо

WEB Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

3 процедуры и 1 макет

03.06.2013    30915    anig99    6    

Как сделать интеграцию (обмен) с интернет-магазином? Пошаговый план действий (Часть 1)

WEB v8 1cv8.cf УУ Бесплатно (free)

C 2011 года я занимаюсь интеграцией с интернет-магазинами и за это время, наверное, повидал все. Делал интеграцию как «культурными», так и «экзотическими» способами. Количество магазинов исчисляется сотнями. В этой серии статей я буду делиться своим опытом, а также выкладывать какие-то полезные наработки.

19.11.2020    4647    markbraer    11    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

Практика программирования WEB Интеграция Универсальные функции v8 Бесплатно (free)

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    1804    SizovE    2    

Web Dashboard (мобильная и десктопная версия): оптимальная схема организации взаимодействия с зоопарком систем

WEB v8 Бесплатно (free)

Задача: из множества систем (1С:ERP, 1C:CRM, Кронос:WMS, 1С:Розница, 1С:УПП...) оперативно и онлайн осуществлять мониторинг на телефоне/десктопе/планшете/телевизоре бизнес-аналитику в дашборде для директора. Рассмотрим в статье, как правильно интегрировать между собой все базы, какие для этого инструменты использовать.

10.11.2020    7174    SizovE    2    

Отладка модуля ДиадокПро

WEB v8 1cv8.cf Бесплатно (free)

В обработке ДиадокПро все дополнительные модули встроены во внешние обработки, которые хранятся в макетах. Это усложняет процесс самостоятельной интеграции, так как теряется возможность попасть в них в режиме отладки. Но не всё так страшно, поэтому ниже инструкция)

30.10.2020    2278    Максим-777    14    

JSON примеры меню B2B web-приложения "Личный кабинет" на движке EDIbot для телефона/десктопа

WEB v8 Бесплатно (free)

Рассмотрим на примерах работу движка EDIbot при организации меню B2B "Личного кабинета" (мобильная версия, версия десктоп) грузовладельца WMS-системы.

29.10.2020    1012    SizovE    0    

Обмен с сайтом посредством Post-запроса, json

WEB v8 1cv8.cf Бесплатно (free)

Задача - передавать на сайт объекты с наименованием и уникальным идентификатором (УИ), которые изменяются в 1С. Также нужно сохранять историю отправленных пакетов.

29.10.2020    4463    John_d    26    

Организация HTTP публикации каталога товаров используя PostgREST

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу порядок установки настройки и использования PostgREST на примере организации каталога товаров.

05.10.2020    1168    malikov_pro    2    

Интеграционная прослойка(middleware) на Golang. Часть 5 - Обмен с 1С через HTTP-сервисы платформы

WEB v8 Бесплатно (free)

В этой статье научим прослойку отправлять данные в 1С, для этого используем HTTP-сервисы платформы. Обменяемся данными с новым справочником Клиенты. Но главное создадим HTTP-сервис для получения сообщений из очереди RabbitMQ.

28.09.2020    1859    dmitry-irk38    4    

Отладка http сервиса

WEB v8 Бесплатно (free)

При разработке http сервиса возникает ситуация, а как протестировать http сервис? Создали мы сервис, настроили шаблоны, передали, если нужно параметры, открываем браузер заполняем строку подключения и БАХ, ошибка. Что делать?

23.09.2020    3073    hpi    10    

Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис

WEB v8 1cv8.cf Бесплатно (free)

Пошаговое руководство по созданию http-сервиса (часть вторая). Передача параметра в http сервис.

22.09.2020    6207    hpi    7    

Организация данных и вариант обработки для организации обмена с сайтом

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант организации данных и обработки для обмена с сайтом.

22.09.2020    1568    malikov_pro    4    

Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием HTTP-сервиса, плюс особенности авторизации

Практика программирования Обмен данными 1С WEB v8 1cv8.cf Бесплатно (free)

В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке

18.09.2020    1187    R_o_n_n_y    3    

Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант формирования запроса

11.09.2020    3601    malikov_pro    11    

Ферма приложений на Kubernetes

WEB v8 Бесплатно (free)

При эксплуатации большого количества информационных систем 1С, предоставляющих интернет-сервисы, возникают проблемы, связанные с зависимостью от производительности и стабильности веб-сервера. Как объединить отдельно стоящие веб-сервера с помощью платформы Kubernetes для централизованного мониторинга всех опубликованных интернет-сервисов на конференции Infostart Event 2019 Inception рассказал программист компании BIA Technologies Владимир Кирбаба.

24.08.2020    1820    ComboBoy    1    

Использование шаблонного процессора для формирования HTML страниц

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу использование шаблонного процессора Handlebars запущенного на Node.js

24.08.2020    1756    malikov_pro    26    

Загрузка или обновление файла на яндекс диске через rest-api

Практика программирования Файловые протоколы обмена, FTP WEB v8 Бесплатно (free)

Коллеги, в данной публикации я хочу поделиться кодом, с помощью которого можно загрузить файл на яндекс диск или обновить существующий.

12.08.2020    3012    pavelpribytkin96    10    

Самый простой парсинг и обработка веб-страниц в 1С

WEB Универсальные функции v8 1cv8.cf Бесплатно (free)

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    7880    YPermitin    22    

Загрузка или обновление файла на гугл диске

Практика программирования Файловые протоколы обмена, FTP WEB v8 1cv8.cf Бесплатно (free)

Коллеги, в данной публикации я хочу поделиться кодом, с помощью которого можно загрузить файл на гугл диск или обновить существующий.

06.08.2020    2104    pavelpribytkin96    6    

Использование Yandex Translate (Яндекс.Переводчик)

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант подключения и использования Yandex Translate.

08.07.2020    5114    malikov_pro    8    

Когда хотим знать IP клиента...

WEB v8 Бесплатно (free)

В процессе разработки web приложения на 1С, и это не шутка))), а пожелание заказчика, возникла ситуации когда понадобилось знать, с какого IP подключался клиент.

03.07.2020    7227    IMihalev    10    

Ограничение доступа к HTTP публикациям 1С сервера используя NGINX

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант ограничения доступа к HTTP публикациям 1С сервера используя NGINX.

02.07.2020    7838    malikov_pro    7    

Структура обработки загрузки цен и остатков поставщика с примерами и комментариями

Внешние источники данных WEB v8 1cv8.cf Россия Бесплатно (free)

В статье опишу структуру обработки по загрузке цен и остатков от поставщика с примерами.

27.06.2020    1962    malikov_pro    0    

Вариант использования документа "Операция по Яндекс.Кассе" для других сервисов по оплате через интернет

WEB v8 1cv8.cf Россия Бесплатно (free)

В статье рассмотрю организацию эквайринга в УТ 11.4 и доработки для создания заказов на оплату к стороннему сервису, как пример Сбербанк.

24.06.2020    1624    malikov_pro    3    

Работа с AliExpress через API

WEB v8 Бесплатно (free)

В публикации опишу подход работы с API AliExpress и примеры кода.

23.06.2020    6837    malikov_pro    24    

История создания успешной системы чат-ботов на 1С

WEB v8 Бесплатно (free)

Использование чат-ботов в мессенджерах позволяет автоматизировать многие сложные бизнес-процессы путем диалога с системой через виртуального собеседника. О том, как создать универсальную систему ботов с бэкендом на 1С, работающую в Telegram, Viber и Facebook Messenger одновременно, на конференции Infostart Event 2019 Inception рассказал программист-фрилансер Константин Гейнрих.

21.05.2020    8698    CyberCerber    15    

Парсинг html страниц с выводом информации через JavaScript с использованием Selenium

WEB v8 1cv8.cf Бесплатно (free)

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

20.05.2020    6684    platonov.e    25    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Шаг третий, WooCommerce, публикация категорий товаров

WEB v8 1cv8.cf Бесплатно (free)

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции публикации категорий товаров в магазин WooCommerce, с комментариями внутри.

13.05.2020    3930    osivv    3    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Шаг второй, публикация картинок

WEB v8 Бесплатно (free)

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции передачи фото из 1С, с комментариями внутри.

13.05.2020    2580    osivv    0    

Интеграция Camunda BPM и 1С

WEB Интеграция v8 Бесплатно (free)

Быстрый старт. Только практические примеры. Установка, запуск и публикация бизнес-процесса на сервере Camunda BPM. Управление бизнес-процессами из 1С при помощи Camunda REST API.

12.05.2020    5045    zhichkin    30    

Интеграция 1С и CMS WordPress посредством Rest API сайта. Первый шаг

WEB v8 Россия Бесплатно (free)

Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции 1С с комментариями внутри.

28.04.2020    5987    osivv    23    

Выразительный Web API

WEB v8 Бесплатно (free)

Теория разработки Web API с ожидаемым поведением, за который не будет стыдно за пределами мира 1С.

27.04.2020    8284    nbeliaev    22