1С:Шина
25.05.2022
Настройка обмена данными между базой на платформе "1С:Предприятие" и интернет-сайтом с использованием "1С:Шины"
"1С:Шина" поддерживает обмен данными между системами по средством HTTP-протокола, это даёт возможность использовать обмен при помощи HTTP-сервисов, например, в соответствии с имеющимся REST API.
В примере выполняется синхронизация изменений по товарным позициям между базой и сайтом, т.е. при создании или изменении товара в базе, эти изменения автоматически отражаются на сайте.
В ходе этого примера вы:
- В среде разработки "1С:Шины":
- Создадите проект и настроите в нем процесс интеграции.
- Опубликуете проект на сервере и создадите приложение.
- Проверите работоспособность приложения.
- В панели управления сайтом:
- Сгенерируете ключи API.
- Определите метод для создания элемента на сайте.
- На сервере "1С:Шины":
- Заполните параметры для подключения к сайту.
- Создадите информационную систему.
- Включите её в состав процесса интеграции.
- Запустите процесс интеграции.
- Создадите демонстрационную базу "1С:Предприятия":
- Создадите план обмена.
- Добавите сервис интеграции.
- Загрузите в него информацию о доступных каналах.
- Напишите код обмена сообщениями.
- Добавите регламентное задание для обмена сообщениями с "1С:Шиной".
- Настроите подключение к серверу.
- Проверите обмен сообщениями.
Создание проекта
На этом этапе вы создадите приложение, через которое информационные базы будут взаимодействовать друг с другом.
- Откройте панель управления сервера.
- Нажмите Приложения > + Новое приложение.

- Убедитесь, что выбраны варианты Из проекта и Новый проект.

- Задайте имя проекта — Пример №3 и нажмите Tab. "1С:Шина" заполнит остальные поля и включит режим разработки для создаваемого приложения.

- Выберите тип СУБД (в примере это будет Microsoft SQL Server) и нажмите Создать.

- Новое приложение появится в списке со статусом Создается. Через некоторое время статус приложения изменится на Работает.

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

- "1С:Шина" откроет новую вкладку браузера для среды разработки и запросит пароль. Введите пароль администратора, который вы создали при установке сервера, и нажмите Войти;

- "1С:Шина" подготовит рабочую область, построит проект и откроет его в среде разработки;

- Добавьте новый элемент проекта — процесс интеграции. Для этого в представлении 1C:PROJECT EXPLORER нажмите New > Project Element в контекстном меню подсистемы Основная;

- Выберите вид добавляемого элемента проекта — Процесс интеграции;

- Задайте имя создаваемого элемента — ОбменССайтом — и нажмите Ввод;
- "1С:Шина" создаст в проекте новый процесс интеграции и откроет редактор для создания его схемы;

Редактирование схемы процесса интеграции
На этом этапе вы создадите схему процесса интеграции, которая описывает взаимодействие двух информационных систем.
- Добавьте в схему группу участников. Для этого прокрутите палитру узлов, выберите ГруппаУчастников и кликните в верхней части схемы, чтобы разместить там группу;

- Выделите группу и в представлении PROPERTIES задайте ее имя — Офис;
- Добавьте на схему узел Канал1СИсточник и задайте имя — ИзОфиса;

- Свяжите группу участников Офис с узлом ИзОфиса. Для этого прокрутите палитру узлов, выберите Связь, а затем кликните последовательно на группу участников Офис и на узел ИзОфиса;

- Теперь добавьте на схему узел Http и свяжите его мартшрутом с узлом ИзОфиса.Для этого выберите в панели Маршрут, а затем кликните последовательно на узел- ИзОфиса и на узел- Http;

- Переименуйте узел Http в ОбменССайтом;

- В подсистеме Основная раскройте созданный процесс интеграции ОбменССайтом и добавьте новый элемент— параметр процесса интеграции.

- Создайте последовательно 4 параметра URL, API, Login, Password.

- Выделите узел ОбменССайтом и справа заполните параметр URL, нажав на кнопку, раскрывающую параметры процесса, и выбрав созданный ранее параметр URL

- Далее добавьте к параметру URL ещё один параметр API, повторно нажав на кнопку, раскрывающую параметры процесса, и выбрав созданный параметр API.

- Аналогично заполните остальные параметры ИмяПользователя как Login, пароль как Password. Также в выпадающем списке выберите метод - POST.

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

- Сервер запросит имя пользователя и пароль. Для аутентификации используйте учетную запись администратора и пароль, который вы создали при установке сервера;

- После успешной авторизации вы увидите приложение, а в нем — список процессов интеграции, существующих в приложении. В примере это будет единственный процесс интеграции ОбменССайтом;
Настройки на стороне сайта
В данном примере используется сайт на базе WordPress, созданный при помощи кроссплатформенной сборки локального веб-сервера XAMPP (https://www.apachefriends.org/ru/index.html). В качестве шаблона сайта был использован плагин WooCommerce (https://woocommerce.com/).
Для взаимодействия с сайтом мы будем использовать имеющийся у плагина WooCommerce собственный REST API.
- В панели управления сайтом перейдём в Настройки – Дополнительно и выберем пункт REST API

- Сгенерируйте и сохраните ключи от сайта.


- В документации к WooCommerce (https://woocommerce.github.io/woocommerce-rest-api-docs/) найдём метод, создающий новый продукт на сайте

Отметим, что метод POST совпадает с тем методом, который ранее мы указывали в качестве параметра в узле ОбменССайтом на схеме интеграции в 1С:Шине.
Настройка приложения в панели управления 1С:Шины
- Откройте приложение, если вдруг оно у вас закрыто;
- Нажмите Инфосистемы > + Добавить систему;

- Задайте код системы — office и наименование — Офис. Нажмите Добавить;

- Теперь для информационной системы нужно получить ключ, который она будет использовать при подключении к серверу 1С:Шины. Чтобы получить ключ, нажмите на информационную систему, а затем нажмите Выдать ключ API.

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

- Закройте окно Состав группы Офис;
Далее необходимо заполнить параметры у узла ОбменССайтом, которые позволят взаимодействовать 1С:Шине с сайтом.
- На схеме выберите узел ОбменССайтом и в правом нижнем углу нажмите Параметры;
- Заполните параметры следующим образом:
- URL: https://localhost/testsite
- API: /wp-json/wc/v3/products
- В Login и Password укажите пользовательский ключ и секретный код пользователя, полученные при генерации ключа на сайте.

- Теперь можно запустить созданный процесс интеграции. нажмите Запустить;

Настройка информационной базы 1С:Предприятия
В информационной базе Офис вы создадите объект конфигурации Сервис интеграции, взаимодействующий с севером 1С:Шины. Под управлением этого сервиса интеграции будет работать один канал. По каналу ИзОфиса сообщения из офиса будут уходить на сайт.
В комплект поставки 1С:Шины включены шаблоны конфигураций Офис (office_template.cf) и Магазин (shop_template.cf).
- Создайте пустую информационную базу, используя конфигурацию office_template;
- Запустите конфигуратор информационной базы Офис;
- Добавьте сервис интеграции с именем ОбменССайтом;

- Откройте приложение "1С:Шины" в браузере и скопируйте адрес приложения;

- Вернитесь в конфигуратор и установите скопированный адрес в качестве значения свойства Адрес внешнего сервиса интеграции;

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

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

Сообщения для отправки будут формироваться регламентным заданием.
- Создайте Регламентное задание ОтправкаСообщенийНаСайт и поставьте галочку Предопределенное, а для указания имени метода создайте общий модуль ЗаданиеОтправкаСообщенийНаСайт и укажите его.

Настройте расписание работы регламентного задания так, чтобы ваши изменения попадали в течение необходимого промежутка времени.
- Напишите код общего модуля ЗаданиеОтправкаСообщенийНаСайт;
Копировать в буфер обменаПроцедура ОтправкаСообщенийНаСайт() Экспорт
ПланыОбменаВыборка = ПланыОбмена.ОбменСИнтернетМагазином.Выбрать();
Пока ПланыОбменаВыборка.Следующий() Цикл
Если ПланыОбменаВыборка.ЭтотУзел Тогда
Продолжить;
КонецЕсли;
ОтправленноеСообщение = ПланыОбменаВыборка.НомерОтправленного;
Попытка
Выборка = ПланыОбмена.ВыбратьИзменения(ПланыОбменаВыборка.Ссылка, ОтправленноеСообщение);
МассивСообщений = Новый Массив;
МассивСсылок = Новый Массив;
Пока Выборка.Следующий() Цикл
МассивСсылок.Добавить(Выборка.Получить().Ссылка);
КонецЦикла;
МассивСообщений = СформироватьСообщенияКВыгрузке(МассивСсылок);
Для Каждого Сообщение Из МассивСообщений Цикл
ОтправитьСообщениеВИнтернетМагазин(Сообщение);
КонецЦикла;
ПланыОбмена.УдалитьРегистрациюИзменений(ПланыОбменаВыборка.Ссылка,ПланыОбменаВыборка.НомерОтправленного);
Исключение
ЗаписьЖурналаРегистрации("СервисыИнтеграции.ОбменССайтом",
УровеньЖурналаРегистрации.Ошибка,
ПланыОбменаВыборка,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Функция СформироватьСообщенияКВыгрузке(МассивСсылок) Экспорт
МассивСообщений = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование КАК 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 раз в минуту.
В примере, чтобы реализовать периодический вызов этого метода, вам потребуется регламентное задание.
- Создайте регламентное задание с именем СервисыИнтеграции:

- Выберите уже имеющийся обработчик для регламентного задания СервисыИнтеграцииСервер из серверный общий модуль с именем СервисыИнтеграцииСервер;

- Проверьте, что в этом модуле обработчик регламентного задания содержит код:
Копировать в буфер обменаПроцедура ВыполнениеОбработкиСервисовИнтеграции() Экспорт
СервисыИнтеграции.ВыполнитьОбработку();
КонецПроцедуры
- Установите флажки Использование и Предопределенное, чтобы задание в информационной базе создалось автоматически;
- Нажмите Расписание - Открыть и задайте расписание задания — каждый день; каждые 60 секунд;
- Обновите конфигурацию базы данных.
Подключение информационных баз 1С:Предприятия 8 к серверу 1С:Шины
Вы настроили конфигурации Офис так, что она готова к взаимодействию с использованием сервера "1С:Шины". Непосредственное подключение информационной базы 1С:Предприятия к конкретному серверу выполняется уже в режиме "1С:Предприятие".
- Запустите информационную базу Офис от имени пользователя с административными правами и откройте Функции для технического специалиста;

- Разверните ветку Стандартные и откройте Управление сервисами интеграции;

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

- Нажмите ОК для сохранения настроек;
- Чтобы запустить обмен сообщениями нажмите Установить активность. В результате будет установлен флаг Активность у выбранного сервиса;
Теперь необходимо создать план обмена, который будет отслеживать изменения в справочнике Товары.



Создание примера закончено, можно приступать к тестированию обмена сообщениями.
- Создадим в справочнике Товары несколько товаров Валенки, Галоши, Кеды, Тапочки.

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

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