Обмен с сайтом посредством 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С:Розница 2.3 (для работы с сервисом dolyame.ru)

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

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1798    14    6    

11

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

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

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

36000 руб.

03.08.2020    16043    13    18    

13

Обмен данными с сайтом. БП 3.0

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

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 руб.

18.03.2019    31813    117    101    

65

Интеграция 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    18084    10    15    

16

Универсальный парсер интернет-магазинов

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

С того времени, как я начал парсить сайты, прошло много лет. За это время я спарсил более 100 сайтов и записал эти товары в 1С. В итоге на свет появился универсальный парсер, который поможет Вам спарсить интернет-магазин и при этом не написать ни строчки кода.

9600 руб.

19.10.2018    52487    220    101    

112

SALE! 33%

«Мониторинг цен» – сервис для отслеживания цен конкурентов на ведущих маркетплейсах России

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

Сервис помогает отслеживать цены на ведущих маркетплейсах России только для одного региона – Москва и Московская область. Выполняйте анализ и контролируйте цены Ваших конкурентов сразу в системе 1С.

2400 1608 руб.

29.05.2023    6934    26    41    

15

Выгрузка для АВИТО

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

Выгрузка товаров услуг из 1С для сайта "Авито" раздел "Автозагрузка" выполнена в виде обработки. Обработка подходит для конфигураций УТ, УНФ и Розница. Данная обработка позволяет создавать шаблон с объявлениями для "Авито" - "Автозагрузка".

4200 руб.

07.06.2022    15837    43    56    

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

Если СоставПараметры.Количество() < 3 Тогда
3. John_d 5429 29.10.20 10:20 Сейчас в теме
(1) Привычка подстраховываться. Вдруг, кто-то удалит строчки из Справочники.ПредопределенныеЗначения.доп_ОбменСайт.Состав
2. malikov_pro 1296 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 3614 29.10.20 10:51 Сейчас в теме
а почему нет ни слово о веб-сервисе?
15. user1011815 7 30.10.20 09:47 Сейчас в теме
(4) Посвятите в тайну, как через веб-сервис вы предлагаете инициировать соединение _из_ 1С наружу?? Или я что-то пропустил в желто-красном мануале? Web-сервис публикуется на вебсервере и только принимает соединение извне при условии, что доступен с хостинга.
16. quazare 3614 30.10.20 09:51 Сейчас в теме
(15) я первый раз вижу, чтобы 1с долбилась на сайт. обычно, ведь наоборот?)

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

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

(0) В заголовках "Content-Type", "application/json", в теле запроса формат &{key}={value} - это формат "application/x-www-form-urlencoded", какова причина такого перекоса?
11. John_d 5429 29.10.20 13:01 Сейчас в теме
10. Vovan58 65 29.10.20 12:59 Сейчас в теме
JSON не кашерный : делать правильнее массив структур
Aleskey_K; aleks.public; +2 Ответить
12. malikov_pro 1296 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 65 02.11.20 00:24 Сейчас в теме
(12) ну я сделал процедуры преобразования таблицы значения (выборка) в массив структур (можно соответствий) - простенько и почти на все случаи жизни. Запросом данные вытащил, в табличку (или сразу из выборки), от туда в массив структур, далее в JSON одной строчкой...
andreosh; user1464234; +2 Ответить
13. etmarket 892 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 1296 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 962 02.11.20 07:17 Сейчас в теме
А что будет, если в наименовании контрагента есть символ "&"?
26. malikov_pro 1296 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 для взаимодействия с его зоной ответственноси.
Оставьте свое сообщение