1С:Шина
25.05.2022

Настройка обмена данными между базой на платформе "1С:Предприятие" и интернет-сайтом с использованием "1С:Шины"


"1С:Шина" поддерживает обмен данными между системами по средством HTTP-протокола, это даёт возможность использовать обмен при помощи HTTP-сервисов, например, в соответствии с имеющимся REST API.

В примере выполняется синхронизация изменений по товарным позициям между базой и сайтом, т.е. при создании или изменении товара в базе, эти изменения автоматически отражаются на сайте.

В ходе этого примера вы:

 

Создание проекта

На этом этапе вы создадите приложение, через которое информационные базы будут взаимодействовать друг с другом.


Добавление элемента проекта

На этом этапе вы откроете приложение в среде разработки и добавите в него элемент проекта — процесс интеграции.

Редактирование схемы процесса интеграции

На этом этапе вы создадите схему процесса интеграции, которая описывает взаимодействие двух информационных систем.

 

За ходом обновления проекта вы можете наблюдать в левом углу строки состояния среды разработки. Статус updating изменится на статус running. Это говорит о том, что приложение было обновлено и запущено заново;

 

Настройки на стороне сайта

В данном примере используется сайт на базе WordPress, созданный при помощи кроссплатформенной сборки локального веб-сервера XAMPP (https://www.apachefriends.org/ru/index.html). В качестве шаблона сайта был использован плагин WooCommerce (https://woocommerce.com/).

 Для взаимодействия с сайтом мы будем использовать имеющийся у плагина WooCommerce собственный REST API.

Отметим, что метод POST совпадает с тем методом, который ранее мы указывали в качестве параметра в узле ОбменССайтом на схеме интеграции в 1С:Шине.

 

Настройка приложения в панели управления 1С:Шины

Далее необходимо заполнить параметры у узла ОбменССайтом, которые позволят взаимодействовать 1С:Шине с сайтом.

 

Настройка информационной базы 1С:Предприятия

В информационной базе Офис вы создадите объект конфигурации Сервис интеграции, взаимодействующий с севером 1С:Шины. Под управлением этого сервиса интеграции будет работать один канал. По каналу ИзОфиса сообщения из офиса будут уходить на сайт.

В комплект поставки 1С:Шины включены шаблоны конфигураций Офис (office_template.cf) и Магазин (shop_template.cf).

 

 

 

Список заполнится каналом из схемы процесса интеграции.

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

 

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

 

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

Копировать в буфер обмена
Процедура ОтправкаСообщенийНаСайт() Экспорт
            
            ПланыОбменаВыборка = ПланыОбмена.ОбменСИнтернетМагазином.Выбрать();
            
            Пока ПланыОбменаВыборка.Следующий() Цикл
                        Если ПланыОбменаВыборка.ЭтотУзел Тогда
                                   Продолжить;
                                   
                        КонецЕсли;
 
                        ОтправленноеСообщение = ПланыОбменаВыборка.НомерОтправленного;
                        
                        Попытка
                                   Выборка = ПланыОбмена.ВыбратьИзменения(ПланыОбменаВыборка.Ссылка, ОтправленноеСообщение);
                                   
                                   МассивСообщений = Новый Массив;
                                   МассивСсылок = Новый Массив;
                                   
                                   Пока Выборка.Следующий() Цикл
                                               МассивСсылок.Добавить(Выборка.Получить().Ссылка);
                                               
                                   КонецЦикла;
 
                                   МассивСообщений = СформироватьСообщенияКВыгрузке(МассивСсылок);                        
                                   
                                   Для Каждого Сообщение Из МассивСообщений Цикл
                                               ОтправитьСообщениеВИнтернетМагазин(Сообщение);
                                                           
                                   КонецЦикла;
                                   
                                    ПланыОбмена.УдалитьРегистрациюИзменений(ПланыОбменаВыборка.Ссылка,ПланыОбменаВыборка.НомерОтправленного);
                                   
                        Исключение
                                   ЗаписьЖурналаРегистрации("СервисыИнтеграции.ОбменССайтом",
                                                           УровеньЖурналаРегистрации.Ошибка,
                                                           ПланыОбменаВыборка,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
                                   
                        КонецПопытки;
                        
            КонецЦикла;
                        
КонецПроцедуры  
 
Функция СформироватьСообщенияКВыгрузке(МассивСсылок) Экспорт
 
            МассивСообщений = Новый Массив;        
            
            Запрос = Новый Запрос;
            Запрос.Текст = 
            "ВЫБРАТЬ
            |           Товары.Наименование КАК name,
            |           ЕСТЬNULL(ЦеныТоваров.Цена, 0) КАК regular_price,
            |           Товары.Описание КАК description,
            |           Товары.Наименование КАК short_description,
            |           ""simple"" КАК type,
            |           Товары.Ссылка КАК Ссылка,
            |           Товары.URLКартинки КАК URLКартинки
            |ИЗ
            |           Справочник.Товары КАК Товары
            |                       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныТоваров.СрезПоследних(, Товар В (&МассивСсылок)) КАК ЦеныТоваров
            |                       ПО Товары.Ссылка = ЦеныТоваров.Товар
            |ГДЕ
            |           Товары.Ссылка В(&МассивСсылок)";
            
            Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
            
            Выборка = Запрос.Выполнить().Выбрать();
            
            Пока Выборка.Следующий() Цикл
                        СформироватьСообщениеКВыгрузке(Выборка, МассивСообщений);
                        
            КонецЦикла;
            
            Возврат МассивСообщений;
            
КонецФункции
 
Процедура ОтправитьСообщениеВИнтернетМагазин(Сообщение) Экспорт
 
            ИсходящееСообщение = СервисыИнтеграции.ОбменССайтом.СоздатьСообщение();
            ИсходящееСообщение.ИдентификаторСообщенияЗапроса = Новый УникальныйИдентификатор;  
            
            
            ИсходящееСообщение.Параметры["Content-Type"] = "application/json";
                                    
            ТелоСообщения = ИсходящееСообщение.ПолучитьТелоКакПоток(); 
            
            ИмяВременногоФайла = ПолучитьИмяВременногоФайла("tmp");
            ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.ANSI);
            ЗаписьТекста.ЗаписатьСтроку(Сообщение.Текст);
            ЗаписьТекста.Закрыть();
            
            ФайловыйПоток = ФайловыеПотоки.Открыть(ИмяВременногоФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
            
            ФайловыйПоток.КопироватьВ(ТелоСообщения);
            
            ТелоСообщения.СброситьБуферы();
            ТелоСообщения.Закрыть(); 
 
            СервисыИнтеграции.ОбменССайтом.Основной_ОбменССайтом_Канал1СИсточник.ОтправитьСообщение(ИсходящееСообщение);  
                        
            КонецПроцедуры
 
Процедура СформироватьСообщениеКВыгрузке(ПараметрыЗаполнения, МассивСообщений)
 
            УникальныйИдентификатор = Строка(ПараметрыЗаполнения.Ссылка.УникальныйИдентификатор());
            ИсключающиеСвойства = "";
            
            СтруктураЗаполнения = Новый Структура("name,short_description,type");
            
            СтруктураЗаполнения.Вставить("regular_price", ?(Не ЗначениеЗаполнено(ПараметрыЗаполнения.regular_price),
                        "",
                        СтрШаблон("%1", ПараметрыЗаполнения.regular_price)));                      
 
            ОписаниеТовара = ПараметрыЗаполнения.description;             
            
            СтруктураЗаполнения.Вставить("description", "");
            СтруктураЗаполнения.Вставить("sku", УникальныйИдентификатор);                  
            ТипСообщения = "products";
            
            ИсключающиеСвойства = "regular_price,description";
            
            Если ПараметрыЗаполнения.URLКартинки <> "" Тогда
                        МассивИзображений = Новый Массив;
                        МассивИзображений.Добавить(Новый Структура("src", ПараметрыЗаполнения.URLКартинки));
                        
                        СтруктураЗаполнения.Вставить("images", МассивИзображений);
            
            КонецЕсли; 
            
            ЗаполнитьЗначенияСвойств(СтруктураЗаполнения, ПараметрыЗаполнения,, ИсключающиеСвойства);   
            
            ЗаписьJson = Новый ЗаписьJSON;
            ЗаписьJson.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет,
                        , Истина, ЭкранированиеСимволовJSON.СимволыВнеASCII,,,,, Истина));
            
            ЗаписатьJSON(ЗаписьJson, СтруктураЗаполнения);
            
            ТекстТовара = ЗаписьJson.Закрыть();
            
            МассивСообщений.Добавить(
                        Новый ФиксированнаяСтруктура("Тип, Текст, Идентификатор", 
                                   ТипСообщения, ТекстТовара, УникальныйИдентификатор));
            
КонецПроцедуры

 

Во встроенном языке "1С:Предприятия", при выполнении метода ОтправитьСообщение(), всего лишь создается запись в служебной таблице информационной базы. Реальная отправка сообщений в "1С:Шину" выполняется позже, служебным фоновым заданием.

Для запуска или продолжения работы этих служебных фоновых заданий вам нужно вызвать метод СервисыИнтеграцииМенеджер.ВыполнитьОбработку(). Служебные фоновые задания запускаются в момент первого вызова этого метода и завершаются через 2 минуты с момента последнего его вызова. Поэтому, чтобы обеспечить непрерывную работу служебных фоновых заданий, этот метод нужно вызывать периодически. Рекомендуемая периодичность – 1 раз в минуту.

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

Копировать в буфер обмена
Процедура ВыполнениеОбработкиСервисовИнтеграции() Экспорт
 
   СервисыИнтеграции.ВыполнитьОбработку();
 
КонецПроцедуры

 

Подключение информационных баз 1С:Предприятия 8 к серверу 1С:Шины

Вы настроили конфигурации Офис так, что она готова к взаимодействию с использованием сервера "1С:Шины". Непосредственное подключение информационной базы 1С:Предприятия к конкретному серверу выполняется уже в режиме "1С:Предприятие".

В списке доступных сервисов интеграции вы увидите единственную запись Обмен с сайтом — этот тот самый сервис интеграции, который вы создали в Конфигураторе.

 

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

 

 

Создание примера закончено, можно приступать к тестированию обмена сообщениями.

Обратим внимание, что в панели управления 1С:Шиной зафиксировалось 4 входящих и 4 исходящих сообщения

Увидим изменения на сайте.