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

21.01.21

Интеграция - Сайты и интернет-магазины

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

Добавляем регистр доп_ОбменСайт. В нем будем хранить пакеты для отправки на сайт

 

 

В примере рассмотрю отправку номенклатуры контрагентов, которая хранится в табличной части справочника "Контрагенты". При записи справочника сравниваем таблицу в объекте и в ссылке, если они различаются записываю пакет.

Данные отправляю в формате JSON два массива с наименованием и УИ, которые оборачиваю в третий массив.

 

 

 

 

//В подписке на событие ПередЗаписью
ТЗ = Источник.НоменклатураНаСайт.Выгрузить();
Если ЗначениеВСтрокуВнутр(ТЗ) <> ЗначениеВСтрокуВнутр(Источник.Ссылка.НоменклатураНаСайт.Выгрузить()) Тогда
	ЗаписатьСообщение(ТекущаяДата,Источник,"nomenklatura",ТЗ.ВыгрузитьКолонку("Номенклатура"));	;	
КонецЕсли;


Процедура ЗаписатьСообщение(ТекущаяДата,Источник,Таблица,МассивДанных)

	Набор = РегистрыСведений.доп_ОбменСайт.СоздатьНаборЗаписей();
	Набор.Отбор.Дата.Установить(ТекущаяДата);
	Набор.Отбор.Контрагент.Установить(Источник.Ссылка);
	Набор.Отбор.Таблица.Установить(Таблица);

	Запись = Набор.Добавить();
	Запись.Дата = ТекущаяДата;
	Запись.Контрагент = Источник.Ссылка;
	Запись.Таблица = Таблица;
	
	Массив3 = Новый Массив;
	Массив1 = Новый Массив;
	Массив2 = Новый Массив;
	Для Каждого Стр Из МассивДанных Цикл
		Массив1.Добавить(Стр.Наименование);	
		Массив2.Добавить(СокрЛП(Стр.УникальныйИдентификатор()));
	КонецЦикла;	
	Массив3.Добавить(Массив1);
	Массив3.Добавить(Массив2);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Массив3);
	СтрокаJSON = ЗаписьJSON.Закрыть();

	Запись.Сообщение = СтрокаJSON;
	Набор.Записать();

КонецПроцедуры

Получаем пакеты к отправке. 

 

 

Регламентным заданием отправляем пакеты на сайт.

Параметр "psw" нужен, чтобы больше никто, кроме нас не мог обратиться к ресурсу с post-запросом.

 

 

Процедура ОбменССайтом() Экспорт

	СоставПараметры = Справочники.ПредопределенныеЗначения.доп_ОбменСайт.Состав;
	Если СоставПараметры.Количество() < 3 Тогда
		Возврат;	
	КонецЕсли;	
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	доп_ОбменСайт.Дата КАК Дата,
		|	доп_ОбменСайт.Контрагент КАК Контрагент,
		|	доп_ОбменСайт.Таблица КАК Таблица,
		|	доп_ОбменСайт.Сообщение КАК Сообщение,
		|	доп_ОбменСайт.Контрагент.НаименованиеПолное КАК КонтрагентНаименованиеПолное,
		|	доп_ОбменСайт.Контрагент.ИНН КАК КонтрагентИНН,
		|	доп_ОбменСайт.Контрагент.Партнер.ОсновнойМенеджер КАК КонтрагентПартнерОсновнойМенеджер
		|ИЗ
		|	РегистрСведений.доп_ОбменСайт КАК доп_ОбменСайт
		|ГДЕ
		|	НЕ доп_ОбменСайт.Отправлено
		|
		|УПОРЯДОЧИТЬ ПО
		|	Дата,
		|	Контрагент";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Ответ = "";
		Если Не ОтправитьПостЗапрос(Ответ,"json="+ВыборкаДетальныеЗаписи.Сообщение+
			"&psw="+СоставПараметры[2].Значение+
			"&clientid="+СокрЛП(ВыборкаДетальныеЗаписи.Контрагент.УникальныйИдентификатор())+
			"&clientname="+СокрЛП(ВыборкаДетальныеЗаписи.КонтрагентНаименованиеПолное)+
			"&clientinn="+СокрЛП(ВыборкаДетальныеЗаписи.КонтрагентИНН)+
			"&manager="+СокрЛП(ВыборкаДетальныеЗаписи.КонтрагентПартнерОсновнойМенеджер)+
			"&managerguid="+СокрЛП(ВыборкаДетальныеЗаписи.КонтрагентПартнерОсновнойМенеджер.УникальныйИдентификатор())+
			"&table="+ВыборкаДетальныеЗаписи.Таблица
			,СоставПараметры[0].Значение,СоставПараметры[1].Значение) Тогда
			Сообщить("POST запрос к не прошел.");	
		Иначе
			Набор = РегистрыСведений.доп_ОбменСайт.СоздатьНаборЗаписей();
			Набор.Отбор.Дата.Установить(ВыборкаДетальныеЗаписи.Дата);
			Набор.Отбор.Контрагент.Установить(ВыборкаДетальныеЗаписи.Контрагент);
			Набор.Отбор.Таблица.Установить(ВыборкаДетальныеЗаписи.Таблица);
			Запись = Набор.Добавить();
			ЗаполнитьЗначенияСвойств(Запись,ВыборкаДетальныеЗаписи);
			Запись.Ответ = Ответ;
			Запись.Отправлено = Истина;
			Набор.Записать();
		КонецЕсли;
	КонецЦикла;
 
КонецПроцедуры

Функция ОтправитьПостЗапрос(Ответ,СтрокаПараметров,АдресСайта,АдресРесурса)											
	
	Если Не ЗначениеЗаполнено(АдресСайта) Тогда
		Сообщить("Заполните адреса для post-запроса");
		Возврат Ложь;
	КонецЕсли;	
	
    Попытка  		
    	HTTPЗапрос2 = Новый HTTPЗапрос;
    	HTTPЗапрос2.Заголовки.Вставить("Connection", "keep-alive");
    	HTTPЗапрос2.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    	HTTPЗапрос2.Заголовки.Вставить("POST /enter HTTP/1.1");
    	HTTPЗапрос2.УстановитьТелоИзСтроки(СтрокаПараметров, "utf-8");
    	HTTPЗапрос2.АдресРесурса = АдресРесурса;
    	//Соединение1 = Новый HTTPСоединение(АдресСайта);
    	Соединение1 = Новый HTTPСоединение(
        АдресСайта, // сервер (хост)
        443, // порт, по умолчанию для http используется 80, для https 443
        , // пользователь для доступа к серверу (если он есть)
        , // пароль для доступа к серверу (если он есть)
        , // здесь указывается прокси, если он есть
        , // таймаут в секундах, 0 или пусто - не устанавливать
       Новый ЗащищенноеСоединениеOpenSSL()
    );
 
    	ОтветHTTP = Соединение1.ОтправитьДляОбработки(HTTPЗапрос2);
    	Ответ = ОтветHTTP.ПолучитьТелоКакСтроку();
    	Возврат Истина;
    Исключение
    	Возврат Ложь;	
    КонецПопытки;
	
КонецФункции

СоставПараметры = Справочники.ПредопределенныеЗначения.доп_ОбменСайт.Состав;

 

 

На сайте ловим Post-запрос

 

 

<?php
if(isset($_POST['psw'])) { $psw = $_POST['psw']; }

if (isset($psw) && $psw=="1234512345qw"){
	
	if(isset($_POST['json'])) { $json = $_POST['json']; }

	$arrJson = json_decode($json, true);

	for ($ii=0; $ii<count($arrJson [0]); $ii++) {
		$name = $arrJson [0][$ii];
		$ui1c =  $arrJson [1][$ii];	
	}
}
?>

 

Тестировал: 

1С:Комплексная автоматизация 2 (2.4.9.98)

Платформа 1С:Предприятие 8.3 (8.3.16.1148)

Post-запрос json

См. также

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер).

22440 руб.

19.12.2023    5473    40    11    

37

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

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

36000 руб.

03.08.2020    17986    18    22    

17

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

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

7200 руб.

04.05.2021    20136    13    19    

18

Сайты и интернет-магазины Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Управленческий учет Платные (руб)

Программа позволяет одним кликом настроить сбор цен ваших конкурентов или дилеров в интернете. Автоматически собирает данные результата поиска Яндекса (вам не придется вручную добавлять каждый сайт, за которым нужно следить). Обновление цен происходит по заданному вами расписанию автоматически. Можете легко отслеживать позиции вашего сайта в Яндексе по ключевым словам и фразам. Этот инструмент даст вам лучшее понимание того, как ваша SEO-стратегия влияет на видимость вашего сайта в поисковой выдаче, и поможет вам улучшить контент и структуру сайта для повышения его позиций. Функция доступна во всех тарифах.

19950 руб.

23.09.2019    31094    7    12    

30

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

В настоящее время система СБП очень часто стала использоваться в повседневной жизни. Одна из систем интеграции СБП через СБЕР. Данная конфигурация является инструментом интеграции СБП в Альфа Авто. Данная система не просто формирует статический QR, а динамический, а значит, в системе будет привязка и на покупателя, и на документ.

7200 руб.

25.10.2022    6416    32    4    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. MikhailDr 29.10.20 10:16 Сейчас в теме
Интересно. Скажите, а зачем это конструкция?

Если СоставПараметры.Количество() < 3 Тогда
3. John_d 5896 29.10.20 10:20 Сейчас в теме
(1) Привычка подстраховываться. Вдруг, кто-то удалит строчки из Справочники.ПредопределенныеЗначения.доп_ОбменСайт.Состав
2. malikov_pro 1325 29.10.20 10:20 Сейчас в теме
Для истории отправки можноиспользовать хеш, более подробно описал в статье https://infostart.ru/1c/articles/1256935/.
Для оправки запросов можно использовать Коннектор https://infostart.ru/public/709325/, если нет sm, то можно взять с github https://github.com/malikov-pro/Connector
trest30; NoRazum; aleks.public; Batman; Yashazz; +5 Ответить
4. quazare 3840 29.10.20 10:51 Сейчас в теме
а почему нет ни слово о веб-сервисе?
15. user1011815 7 30.10.20 09:47 Сейчас в теме
(4) Посвятите в тайну, как через веб-сервис вы предлагаете инициировать соединение _из_ 1С наружу?? Или я что-то пропустил в желто-красном мануале? Web-сервис публикуется на вебсервере и только принимает соединение извне при условии, что доступен с хостинга.
16. quazare 3840 30.10.20 09:51 Сейчас в теме
(15) я первый раз вижу, чтобы 1с долбилась на сайт. обычно, ведь наоборот?)

прошу автора рассказать практический пример работы данной методики.
19. user1011815 7 30.10.20 13:21 Сейчас в теме
(16) не автор, но как ни странно у меня в практике это очень частый кейс для интеграционных задач. Удивляюсь, что для многих это оказалось откровением)
platro; serg-lom89; +2 Ответить
20. torch 129 31.10.20 06:52 Сейчас в теме
(16) задачи "1С стучится на сайт и передает данные":
- надо, чтобы на сайте в режиме онлайн отражались актуальные остатки товаров. Правильное решение: при изменении регистра "ТоварыНаСкладах" 1С шлет актуальные остатки на сайт.
- надо, чтобы после начисления бонусов, в личном кабинете пользователя на сайте отображались данные в режиме онлайн
- и т.д.
это очень распространенная задача, когда надо, чтобы на сайте данные обновлялись в режиме онлайн, а не "каждый час"
andreosh; +1 Ответить
21. quazare 3840 31.10.20 07:01 Сейчас в теме
(20) очень интересно! а может это сделать в другую сторону по вебсервису 1с - по факту обращения к информации остатков?
а тема "каждый час" - это тема 10-ти летней давности!
5. serg-lom89 76 29.10.20 10:59 Сейчас в теме
а планы обмена не рассматривали для регистрации или это в рамках определенной задачи делалось?
aleks.public; +1 Ответить
6. John_d 5896 29.10.20 11:03 Сейчас в теме
(5) В рамках задачи. В данной задаче с планом обмена просто неудобно возиться.
ybatiaev; serg-lom89; +2 Ответить
7. Yashazz 4796 29.10.20 12:34 Сейчас в теме
А почему бы не задействовать xsd-схемы для обмена с CMS-системами? Работать на уровне хдто проще, чем конкатенацией собирать текст рест-запроса, имхо. Или задача поставлена как предельно сжатые пакеты обмена, без лишнего барахла?
8. John_d 5896 29.10.20 12:46 Сейчас в теме
(7) это простой сайт. Там нет CMS-системы вроде bitrix
На стороне сайта потом придется разгребать xdto, а через json 3 строчки кода на php.
ybatiaev; +1 Ответить
9. malikov_pro 1325 29.10.20 12:50 Сейчас в теме
(7) "xsd-схемы" - их нужно формировать на сторне сайта + wsdl ссылку корректно формировать, обычно программистов хватает на написание простого контроллера.

"чем конкатенацией собирать текст рест-запроса" - нужно использовать высокоуровневые обертки в (2) ссыку на Коннектор дал, в него передается структура или массив и тип форматирования, ссылка на пример использования.

(0) В заголовках "Content-Type", "application/json", в теле запроса формат &{key}={value} - это формат "application/x-www-form-urlencoded", какова причина такого перекоса?
11. John_d 5896 29.10.20 13:01 Сейчас в теме
10. Vovan58 64 29.10.20 12:59 Сейчас в теме
JSON не кашерный : делать правильнее массив структур
Aleskey_K; aleks.public; +2 Ответить
12. malikov_pro 1325 29.10.20 13:27 Сейчас в теме
(10) поддерживаю
МассивДанные = Новый Массив;

Для Каждого Стр Из МассивДанных Цикл
	СоответствиеДанные = Новый Соответствие;
	СоответствиеДанные.Вставить("name",Стр.Наименование);	
	СоответствиеДанные.Вставить("guid", (Строка(Стр.УникальныйИдентификатор()));
	МассивДанные.Добавить(СоответствиеДанные);
КонецЦикла;

Возврат МассивДанные;
Показать


(0)
Вариант обогатить JSON данными и положить целиком в тело, а не писать строку JSON в x-www-form-urlencoded.
Аутентификацию можно сделать на уровне заголовков "X-Auth-Token" например.
if (!self::Authentificate($request)) {
            return HumanResponse::create(null, HumanResponse::HTTP_UNAUTHORIZED);
        }


    private static function Authentificate($request)
    {
        $configAPI = new ConfigAPI;

        if ($request->headers->has($configAPI->getTokenName())) {
            $token = $request->headers->get($configAPI->getTokenName());

            return $token === $configAPI->getToken();
        }

        return false;

    }
Показать
andreosh; Aleskey_K; Yashazz; +3 Ответить
22. Vovan58 64 02.11.20 00:24 Сейчас в теме
(12) ну я сделал процедуры преобразования таблицы значения (выборка) в массив структур (можно соответствий) - простенько и почти на все случаи жизни. Запросом данные вытащил, в табличку (или сразу из выборки), от туда в массив структур, далее в JSON одной строчкой...
andreosh; user1464234; +2 Ответить
13. etmarket 914 29.10.20 16:09 Сейчас в теме
Полезно. Автору благодарность.
14. andreosh 103 30.10.20 09:26 Сейчас в теме
Хорошая статья. Еще бы разработать оптимальный механизм создания копий некоторых таблиц в MySQL на сайте, чтоб копии записей синхронно или отложено изменялись на сайте после смены в 1С. Например, сделать внешнюю обработку, которая будет изменять записи нужных полей в нужных таблицах (добавлять, удалять) между аналогами таблиц 1С и MySQL.
18. 9-pm 43 30.10.20 11:11 Сейчас в теме
(14) Ну, если прямо с базой, то можно через внешние источники данных. К MySQL, вроде, без особых проблем через ODBC цепляется.
24. andreosh 103 02.11.20 07:25 Сейчас в теме
(18) речь идет о MySQL, который на удаленном хостинге, на сайте.
17. malikov_pro 1325 30.10.20 10:35 Сейчас в теме
(14) "Еще бы разработать оптимальный механизм создания копий некоторых таблиц в MySQL на сайте" - если на хостинге можете поставить node.js то можно использовать https://infostart.ru/1c/articles/1300693/
andreosh; +1 Ответить
25. andreosh 103 02.11.20 07:26 Сейчас в теме
(17) но большинство дешевых хостингов на php
23. ltfriend 02.11.20 07:17 Сейчас в теме
А что будет, если в наименовании контрагента есть символ "&"?
26. malikov_pro 1325 02.11.20 07:36 Сейчас в теме
(25)
На мой взгляд нормальная интеграция и дешевый хостинг малосовместимы, 5$ за VDS не большие деньги, хотя нужно еще его настроить.
Если на PHP, то имеет смысл посмотреть https://github.com/mevdschee/php-crud-api.
Сам под PHP на Symfony пишу API, пример https://infostart.ru/1c/articles/1185983/, удобный роутинг, далее либо переиспользование контроллеров CMS либо работа с БД.
При всем этом считаю что перенос зоны ответственности программиста 1С на сторону БД сайта некорректно. За сайт отвечает web программист и пишет API для взаимодействия с его зоной ответственноси.
Оставьте свое сообщение