Обмен с сайтом посредством 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

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

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

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси.

59990 руб.

05.09.2023    6586    83    74    

63

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

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15658    9    17    

9

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

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

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

18000 руб.

19.12.2023    1039    4    0    

4

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

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

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

12000 руб.

18.03.2019    31182    108    100    

62

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

13

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

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

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

4200 руб.

07.06.2022    15241    42    56    

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

Если СоставПараметры.Количество() < 3 Тогда
3. John_d 5204 29.10.20 10:20 Сейчас в теме
(1) Привычка подстраховываться. Вдруг, кто-то удалит строчки из Справочники.ПредопределенныеЗначения.доп_ОбменСайт.Состав
2. malikov_pro 1288 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 3574 29.10.20 10:51 Сейчас в теме
а почему нет ни слово о веб-сервисе?
15. user1011815 7 30.10.20 09:47 Сейчас в теме
(4) Посвятите в тайну, как через веб-сервис вы предлагаете инициировать соединение _из_ 1С наружу?? Или я что-то пропустил в желто-красном мануале? Web-сервис публикуется на вебсервере и только принимает соединение извне при условии, что доступен с хостинга.
16. quazare 3574 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 3574 31.10.20 07:01 Сейчас в теме
(20) очень интересно! а может это сделать в другую сторону по вебсервису 1с - по факту обращения к информации остатков?
а тема "каждый час" - это тема 10-ти летней давности!
5. serg-lom89 72 29.10.20 10:59 Сейчас в теме
а планы обмена не рассматривали для регистрации или это в рамках определенной задачи делалось?
aleks.public; +1 Ответить
6. John_d 5204 29.10.20 11:03 Сейчас в теме
(5) В рамках задачи. В данной задаче с планом обмена просто неудобно возиться.
ybatiaev; serg-lom89; +2 Ответить
7. Yashazz 4707 29.10.20 12:34 Сейчас в теме
А почему бы не задействовать xsd-схемы для обмена с CMS-системами? Работать на уровне хдто проще, чем конкатенацией собирать текст рест-запроса, имхо. Или задача поставлена как предельно сжатые пакеты обмена, без лишнего барахла?
8. John_d 5204 29.10.20 12:46 Сейчас в теме
(7) это простой сайт. Там нет CMS-системы вроде bitrix
На стороне сайта потом придется разгребать xdto, а через json 3 строчки кода на php.
ybatiaev; +1 Ответить
9. malikov_pro 1288 29.10.20 12:50 Сейчас в теме
(7) "xsd-схемы" - их нужно формировать на сторне сайта + wsdl ссылку корректно формировать, обычно программистов хватает на написание простого контроллера.

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

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