Пример 1. Настройка обмена данными между базой на платформе «1С:Предприятие» и интернет-сайтом
В данном примере используется демонстрационная база «1С:Предприятие 8». Ее можно скачать по ссылке.
«1С:Шина» поддерживает обмен данными между системами посредством HTTP-протокола, это дает возможность использовать обмен при помощи HTTP-сервисов, например, в соответствии с имеющимся REST API.
В примере выполняется синхронизация изменений по товарным позициям между информационной базой «1С:Предприятие» и сайтом, т. е. при создании или изменении товара в базе эти изменения автоматически отражаются на сайте.
Для того чтобы настроить синхронизацию между базой «1С:Предприятие» и сайтом при помощи «1С:Шины», необходимо, чтобы сайт работал по протоколу безопасного соединения HТТPS.
В ходе этого примера вы:
- В среде разработки «1С:Шины»:
- создадите проект и настроите в нем процесс интеграции;
- опубликуете проект на сервере и создадите приложение;
- проверите работоспособность приложения.
- В панели управления сайтом:
- сгенерируете ключи API;
- определите метод для создания элемента на сайте.
- На сервере «1С:Шины»:
- заполните параметры для подключения к сайту;
- создадите информационную систему;
- включите ее в состав процесса интеграции;
- запустите процесс интеграции.
- Создадите демонстрационную базу «1С:Предприятия»:
- создадите план обмена;
- добавите сервис интеграции;
- загрузите в него информацию о доступных каналах;
- напишете код обмена сообщениями;
- добавите регламентное задание для обмена сообщениями с «1С:Шиной»;
- настроите подключение к серверу;
- проверите обмен сообщениями.
Создание приложения и процесса интеграции
На этом этапе вы создадите в среде разработки «1С:Шины» приложение и добавите в него процесс интеграции.
- Создайте новое приложение с файловой СУБД и откройте его в режиме разработки.
- Добавьте новый элемент проекта — процесс интеграции. Назовите его ОбменССайтом и установите для его свойства СправочникУчастников значение ИнформационныеСистемы.
«1С:Шина» создаст в проекте новый процесс интеграции и откроет редактор для создания его схемы.
Редактирование схемы процесса интеграции
На этом этапе вы создадите схему процесса ин теграции, которая описывает взаимодействие информационных систем. Вы можете выполнить все действия самостоятельно или воспользоваться готовым примером из YAML-файла ниже и перейти к публикации приложения.
Пример YAML-файла процесса интеграции
ВидЭлемента: ПроцессИнтеграции
ОбластьВидимости: ВПодсистеме
Ид: 048d1db5-59eb-4063-a44d-54b7833f221e
Имя: ОбменССайтом
СправочникУчастников: e1c::Пример1::Основной::ИнформационныеСистемы
Схема:
ГруппыУчастников:
-
Ид: d20ac359-c313-4d80-a016-a929493d0c1b
Имя: Офис
X: 99
Y: 190
Высота: 60
Ширина: 138
Маршруты:
-
Ид: 75a3ec01-0a90-414a-8cb4-fa7e0a47a165
В: ОбменССайтом
Из: ИзОфиса
Точки:
-
X: 168
Y: 392
-
X: 165
Y: 392
-
X: 165
Y: 386
-
X: 168
Y: 386
Параметры:
-
Имя: URL
Тип: Строка
-
Имя: API
Тип: Строка
-
Имя: Login
Тип: Строка
-
Имя: Password
Тип: Строка
Связи:
-
Ид: 9130b692-56d6-4ffc-aa1d-e639ccc6988f
Группа: Офис
НаправлениеСвязи: ИзГруппыВУзел
Узел: ИзОфиса
Точки:
-
X: 168
Y: 276
-
X: 168
Y: 276
Узлы:
-
Вид: Канал1СИсточник
Ид: 45a84794-69a3-4eea-899b-286d88641366
Имя: ИзОфиса
X: 99
Y: 300
Высота: 62
Ширина: 139
-
Вид: Http
Ид: 8a3d2307-ae27-485c-b8b3-c46236aa8c2f
Имя: ОбменССайтом
Url: ="%{Параметры.URL}%{Параметры.API}"
X: 91
Y: 417
Высота: 63
ИмяПользователя: ="%{Параметры.Login}"
Метод: POST
Пароль: ="%{Параметры.Password}"
Ширина: 154
-
Добавьте в схему группу участников. Для этого прокрутите палитру узлов, выберите ГруппаУчастников и кликните в верхней части схемы, чтобы разместить там группу. Щелкните по ней два раза и задайте имя — Офис:

-
Добавьте на схему узел Канал1СИсточник и задайте имя — ИзОфиса:

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

-
Теперь добавьте на схему узел Http. Щелкните по нему два раза и задайте имя — ОбменССайтом:

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

-
В подсистеме Основной нажмите на значок плюса рядом с процессом интеграции ОбменССайтом и добавьте Параметр:

-
Назовите параметр URL. Затем нажмите Ввод:

-
По аналогии создайте еще три параметра: API, Login, Password. Созданные параметры отобразятся слева на панели:

-
Кликните на узел ОбменССайтом. В панели Свойства заполните параметр Url. Откройте список параметров и выберите URL:

-
Далее таким же образом добавьте к параметру URL еще один параметр — API:

-
Аналогично заполните остальные параметры. В качестве имени пользователя и пароля укажите параметры Login и Password. В поле Метод выберите значение POST:

Публикация и открытие приложения
Чтобы опубликовать и открыть приложение, выполните следующие действия:
-
Нажмите Ctrl+F5. Сервер запросит имя пользователя и пароль. Для аутентификации используйте учетную запись администратора и пароль, который вы создали при установке сервера.
-
После успешной авторизации вы увидите приложение, а в нем — список существующих процессов интеграции. В примере это будет единственный процесс интеграции ОбменССайтом:

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

-
Сгенерируйте и сохраните ключ от сайта. Для этого введите описание ключа в поле Описание (1). В поле Права кликните на выпадающий список (2) и выберите Чтение/Запись. Затем нажмите Генерировать ключ API:

-
Скопируйте и сохраните Пользовательский ключ и Секретный код пользователя:

-
В документации к WooCommerce найдем метод, создающий новый продукт на сайте:

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

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

- URL:
-
Теперь можно запустить созданный процесс интеграции. Для этого нажмите Запустить в правом верхнем углу:

Следующим шагом мы создадим и настроим информационную базу «1С:Предприятия».
Создание информационной базы «1С:Предприятия»
-
Откройте «1С:EDT». В стартовом окне нажмите Начать работу:

-
Откроется перспектива «1С:Предприятия»:

-
Откройте панель Информационные базы. По умолчанию она находится в правой части экрана. Однако если эта панель закрыта, вы можете открыть ее из главного меню основного окна, нажав Окно ⟶ Показать панель ⟶ Информационные базы:

-
В открывшемся окне нажмите Добавить:

-
По умолчанию будет выбран пункт Создание новой информационной базы. Оставьте выбор без изменений и нажмите Далее:

-
Выберите пункт Создание информационной базы без конфигурации и нажмите далее:

-
Введите название информационной базы. В качестве типа размещения файла выберите На данном компьютере или на компьютере в локальной сети. Нажмите Далее:

-
Система автоматически предложит вам каталог для сохранения информационной базы. Его можно оставить без изменений. Нажмите Далее:

-
Ничего не меняйте в открывшемся окне и нажмите Готово:

-
Информационная база создана. Теперь вы сможете увидеть ее на панели Информационные базы:

-
Далее следует загрузить шаблон информационной базы в созданную пустую информационную базу. Для этого кликните правой кнопкой мыши на созданную информационную базу (в данном примере Офис). Затем выберите Загрузить информационную базу:

-
В открывшемся окне нажмите Выбрать и выбер ите файл с примером информационной базы. Затем нажмите Готово:

-
Следующим шагом в панели Информационные базы выберите базу с той конфигурацией, разработку которой вы хотите перевести в «1C:EDT». Перетащите эту информационную базу в панель Навигатор:

-
В открывшемся окне нажмите Импорт:

-
После загрузки конфигурация базы отобразится слева в окне Навигатор:

После того как мы создали информационную базу «1С:Предприятия», можно переходить к ее настройке.
Настройка информационной базы «1С:Предприятия»
-
Добавьте сервис интеграции с именем ОбменССайтом. Для этого откройте вкладку Общее, затем правой кнопкой мыши нажмите Сервисы интеграции, в контекстном меню выберите Создать ⟶ Сервис интеграции:

-
Заполните имя сервиса интеграции. Нажмите Готово:

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

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

Чтобы сохранить изменения, нажмите Ctrl + S.
-
Правой кнопкой мыши нажмите на сервис интеграции ОбменССайтом и выберите Загрузить каналы:

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

-
В списке отобразится канал из схемы процесса интеграции. Убедитесь, что рядом с ним стоит галочка, и нажмите Загрузить:

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

Имя канала должно совпадать с тем названием, которое у вас указано в «1С:Шине»:


Изменения на сайт должны поступать автоматически при добавлении или изменении товара в справочнике Товары. Чтобы настроить соответствующий процесс, мы воспользуемся планами обмена.
-
Создайте новый план обмена ОбменСИнтернетМагазином. Для этого на вкладке Общие найдите Планы обмена и нажмите правой кнопкой мыши, после чего в раскрывшемся меню выберите Создать ⟶ План обмена:

-
Заполните поле Имя и нажмите Готово:

-
Откроется окно редактора. Если вдруг вы закрыли это окно, вы можете открыть его снова. Для этого на кладке Планы обмена дважды щелкните мышкой на план ОбменСИнтернетМагазином.
Перейдите на вкладку Состав, которая расположена в нижней части экрана:

-
Нажмите правой кнопкой мыши в любой точке рабочей области и выберите Редактировать элементы списка:

-
В разделе Справочники поставьте флажок рядом с пунктом Товары и нажмите ОК.
Чтобы сохранить изменения, нажмите Ctrl + S:

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

-
Заполните поле Имя и нажмите Готово:

-
Откроется окно редактора модуля ЗаданиеОтправкаСообщенийНаСайт:

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

-
Заполните поле Имя и нажмите Готово: