Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции передачи фото из 1С, с комментариями внутри.
Преамбула.
Эта статья является логическим продолжением и дополнением этой моей статьи. А также полностью с ней взаимосвязана, отсылки к ней будут периодически здесь появляться.
Здесь мы рассмотрим код 1С, с помощью которого сможем сделать следующее с фотографией/картинкой (медиа) на сайте:
Создать.
Обновить/изменить.
Посмотреть 1.
Посмотреть список.
Удалить.
Также сможем сделать аналогичное с категориями товаров магазина WooCommerce, плюс привязка к категории картинки (Миниатюры).
Почему под некоторыми разными русскими "командами" используются одинаковые конечные точки WordPress? Не знаю, наверное, надо адресовать этот вопрос разработчикам CMS.
Маршруты WordPress используемые для медиа.
"Медиа" -> "/wp-json/wp/v2/media/"
Также можете по-экспериментировать с другими:
"Категория" -> "/wp-json/wp/v2/categories/"
"Посты" -> "/wp-json/wp/v2/posts/"
"Страницы" -> "/wp-json/wp/v2/pages/"
Немного теории. REST API Handbook / Reference / Media
Является моим вольным переводом книги разработчика, источник.
Мои комментарии: образец моего комментария.
Схема
Схема определяет все поля, существующие в записи элемента мультимедиа. Можно ожидать, что любой ответ от этих конечных точек будет содержать поля описанные ниже, если только не используется параметр запроса "_filter" или поле схемы не появляется только в определенном контексте.
date
Array, datetime
Дата публикации объекта в часовом поясе сайта.
Контекст: view, edit, embed В контексте приведенного ниже кода не использую.
date_gmt
Array, datetime
Дата публикации объекта - GMT.
Контекст: view, edit В контексте приведенного ниже кода не использую.
guid
object
Глобальный уникальный идентификатор объекта.
Только для чтения.
Контекст: view, edit В контексте приведенного ниже кода не использую, генерируется системой автоматически.
id
integer
Уникальный идентификатор объекта.
Только для чтения
Контекст: view, edit, embed В коде использую, генерируется системой автоматически.
link
string,
uri
URL объекта.
Только для чтения
Контекст: view, edit, embed В коде не использую, генерируется системой автоматически.
modified
string,
datetime
Дата последнего изменения объекта в часовом поясе сайта.
Только для чтения
Контекст: view, edit В коде использую, генерируется системой автоматически.
modified_gmt
string, datetime
Дата последней модификации объекта в GMT.
Только для чтения.
Контекст: view, edit В контексте приведенного ниже кода не использую.
slug
string
Слаг, буквенно-цифровой идентификатор объекта, уникальный для его типа.
Контекст: view, edit, embed В коде использую, лучше создавать самому, в латинице. Может генерироваться системой автоматически.
status
string
Определенный статус объекта.
Контекст: view, edit.
Один из вариантов: publish, future, draft, pending, private В коде использую как publish, обязательный реквизит.
type
string
Type of Post for the object.
Только для чтения.
Контекст: view, edit, embed В контексте приведенного ниже кода не использую, генерируется системой автоматически.
permalink_template
string
Шаблон Permalink для объекта.
Только для чтения.
Контекст: edit В контексте приведенного ниже кода не использую, генерируется системой автоматически.
generated_slug
string
Слаг автоматически генерируется из названия объекта.
Только для чтения.
Контекст: edit В контексте приведенного ниже кода не использую, генерируется системой автоматически.
title
object
Заголовок/название объекта.
Контекст: view, edit, embed В коде использую, обязательный для заполнения реквизит.
author
integer
ID автора публикации объекта.
Контекст: view, edit, embed В контексте приведенного ниже кода не использую, берется системой автоматически из Токена.
comment_status
string
Устанавливает открыты или нет комментарии к объекту.
Контекст: view, edit
Один из: open, closed В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
ping_status
string
Устанавливает открыт или нет пинк к объекту.
Контекст: view, edit
Один из: open, closed В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
meta
object
Мета поля.
Контекст: view, edit В контексте приведенного ниже кода не использую. Честно говоря, не знай где и как использовать.
template
string
Файл темы, используемый для отображения объекта.
Контекст: view, edit В контексте приведенного ниже кода не использую. Честно говоря, не знай где и как использовать.
alt_text
string
Альтернативный текст для отображения, если вложение не отображается.
Контекст: view, edit, embed В коде использую, не обязательный для заполнения реквизит.
caption
object
Подпись к вложению.
Контекст: view, edit, embed В коде использую, не обязательный для заполнения реквизит.
description
object
Описание.
Контекст: view, edit В коде использую, не обязательный для заполнения реквизит.
media_type
string
Тип вложения.
Только для чтения.
Контекст: view, edit, embed
Один из: image, file В контексте приведенного ниже кода не использую, генерируется системой автоматически.
mime_type
string
MIME тип вложения.
Только для чтения.
Контекст: view, edit, embed В контексте приведенного ниже кода не использую, генерируется системой автоматически.
media_details
object
Подробные сведения о медиафайле, относящиеся к его типу.
Только для чтения.
Контекст: view, edit, embed В контексте приведенного ниже кода не использую, генерируется системой автоматически.
post
integer
ID связанной записи вложения.
Контекст: view, edit В контексте приведенного ниже кода не использую, генерируется системой автоматически.
source_url
string,
uri
URL-адрес исходного файла вложения.
Только для чтения.
Контекст: view, edit, embed В контексте приведенного ниже кода не использую, генерируется системой автоматически.
missing_image_sizes
array
Список отсутствующих размеров изображений вложения.
Только для чтения.
Контекст: edit В контексте приведенного ниже кода не использую, генерируется системой автоматически.
Список медиа.
Запрос по этой конечной точке, чтобы получить коллекцию медиа. Полученный ответ можно контролировать и фильтровать с помощью приведенных ниже параметров URL-запроса.
GET /wp/v2/media
В контексте нижеописанного кода 1С выглядит так: СПИСОК /wp/v2/media
Про Аргументы маршрута можно почитать по ссылке выше. Без аргументов выдает список из десяти элементов. Мной не использовались за ненадобность.
Просмотр элемента медиа.
Запрос по этой конечной точке, чтобы получить конкретную запись элемента мультимедиа.
GET /wp/v2/media/<id>
В контексте нижеописанного кода 1С выглядит так: Получить /wp/v2/media/<id>
id - обязательный аргумент.
Удалить элемент медиа.
Аргументы.
id
Уникальный идентификатор объекта.
force
Нужно ли помещать в "Корзину" или принудительно удалять его. Принимаемые значения "Истина" или "Ложь".
DELETE /wp/v2/media/<id>
В контексте нижеописанного кода 1С выглядит так: Удалить /wp/v2/media/<id>
id - обязательный аргумент.
Обновить элемент медиа.
Аналогичен созданию элемента медиа, описание ниже по тексту.
POST /wp/v2/media/<id>
В контексте нижеописанного кода 1С выглядит так: Обновить /wp/v2/media/<id>
id - обязательный аргумент.
Создать элемент медиа.
Аргументы.
date
Дата публикации объекта в часовом поясе сайта. В контексте приведенного ниже кода не использую, генерируется системой автоматически.
date_gmt
Дата публикации объекта - GMT. В контексте приведенного ниже кода не использую, генерируется системой автоматически.
slug
Слаг, буквенно-цифровой идентификатор объекта, уникальный для его типа.
В коде использую, лучше создавать самому, в латинице. Может генерироваться системой автоматически.
status
Определенный статус объекта.
Один из вариантов: publish, future, draft, pending, private В коде использую как publish, обязательный реквизит.
title
Заголовок/название объекта.
В коде использую, обязательный для заполнения реквизит.
author
ID автора публикации объекта.
В контексте приведенного ниже кода не использую, берется системой автоматически из Токена.
comment_status
Устанавливает открыты или нет комментарии к объекту.
Один из: open, closed В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
ping_status
Устанавливает открыт или нет пинк к объекту.
Один из: open, closed В контексте приведенного ниже кода не использую, системой автоматически устанавливается closed
meta
Мета поля.
В контексте приведенного ниже кода не использую.
template
Файл темы, используемый для отображения объекта.
В контексте приведенного ниже кода не использую.
alt_text
Альтернативный текст для отображения, если вложение не отображается.
В коде использую, не обязательный для заполнения реквизит.
caption
Подпись к вложению.
В коде использую, не обязательный для заполнения реквизит.
description
Описание.
В коде использую, не обязательный для заполнения реквизит.
post
ID связанной записи вложения.
В контексте приведенного ниже кода не использую.
Как используется.
POST /wp/v2/media
В контексте нижеописанного кода 1С выглядит так: СОЗДАТЬ /wp/v2/media [Список аргументов]
Наверное это самый важный момент, поэтому рассмотрим его максимально подробно.
Публикация медиа-картинки из 1С на сайт WordPress.
Для этого использую внешнюю обработку на обычных формах. Код на управляемых формах не будет отличаться от приведенного здесь, чуть-чуть сложнее, но думаю для вас не составит труд адаптировать. Мне, честно говоря, было лень.
Исходные данные.
Аргументы запроса
Что означают первые 4 пункта, можно прочитать здесь.
Token.
Server
Маршрут
КонечнаяТочка
_Заголовок - title в WordPress
ИмяФайла - полный путь картинки на диске, например: C:\Foto\media.jpg
Описание - description в WordPress
альт_текст - alt_text в WordPress
м_описание - caption в WordPress
РасширениеФото - mime_type в WordPress, расширение файла
Слаг - slug в WordPress, временное имя файла, если всё хорошо, становится именем.
Аргументы с 5 по 11 должны присутствовать в реквизитах элемента справочника (иной сущности) 1С. Можно иные данные, как вам будет удобнее.
Важное замечание: с самого начала, делал реквизиты на английском, как в WordPress. Однако в последствии столкнулся с тем, что многие "аглицкие" названия зарезервированы самой 1С, про этот момент забыл. Поэтому пришлось делать структуру перевода с "Русского" на "Английский" и обратно.
Образец структуры
ВП_СтруктураСоответствийСАнгНаРусского=Новый Структура;
////маршруты ВП
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Категория") , "/wp-json/wp/v2/categories/");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Медиа") , "/wp-json/wp/v2/media/");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Посты") , "/wp-json/wp/v2/posts/");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Страницы") , "/wp-json/wp/v2/pages/");
////команды/конечные точки запросов ВП
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Список") ,"GET");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Получить") ,"GET");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Создать") ,"POST");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Обновить") ,"POST");
ВП_СтруктураСоответствийСРусскогоНаАнг.Вставить(Врег("Удалить") ,"DELETE");
ВП_СтруктураСоответствийСРусскогоНаАнг=Новый Структура;
////Обратное преобразование
/////Конвертируем ВП_СтруктураСоответствийСАнгНаРусского
Для каждого КлючИЗначение Из ВП_СтруктураСоответствийСРусскогоНаАнг Цикл
ВП_СтруктураСоответствийСАнгНаРусского.Вставить(НовыйКлюч,КлючИЗначение.Ключ);
КонецЦикла;
Сначала было непривычно, потом привык, потом расширил, стал использовать для конвертации ответов от сайта, так как многие аргументы совпадают или практически похожи, что не всегда понимаешь точно "аглицкий" ответ. А с этим очень многое сразу встало на свои места.
Если лениво создавать свои структуры, возьмите из обработки, скачать можно отсюда.
Перем МассивОбязательныхРеквизитовМедиа;
МассивОбязательныхРеквизитовМедиа=Новый Массив;
МассивОбязательныхРеквизитовМедиа.Добавить("_Заголовок");
МассивОбязательныхРеквизитовМедиа.Добавить("ИмяФайла");
МассивОбязательныхРеквизитовМедиа.Добавить("Описание");
МассивОбязательныхРеквизитовМедиа.Добавить("альт_текст");
МассивОбязательныхРеквизитовМедиа.Добавить("м_описание");
МассивОбязательныхРеквизитовМедиа.Добавить("РасширениеФото");
МассивОбязательныхРеквизитовМедиа.Добавить("Слаг");
////ещё используется для публикации категорий магазина, об этом в следующей статье.
Думаю, комментарии излишни, разберем позже.
Процедура ПослатьЗапросНаСайтМедиаНажатие
Процедура ПослатьЗапросНаСайтМедиаНажатие(Элемент)
ТекСтрока=ЭлементыФормы.ТаблицаМедиа.ТекущаяСтрока;
Если НЕ ЗначениеЗаполнено(ОперацииСМедиа) Тогда
Сообщить("Не выбрана конечная точка!");
Возврат;
КонецЕсли;
СтруктураПараметров=Новый Структура;
СтруктураПараметров.Вставить("Token",СоединениеССайтом_JWToken);
СтруктураПараметров.Вставить("Server",СоединениеССайтом_JWTServer);
СтруктураПараметров.Вставить("Маршрут",МаршрутМедиа);
СтруктураПараметров.Вставить("КонечнаяТочка",ОперацииСМедиа);
////СтруктураПараметров.Вставить("",);
Если НЕ ОперацииСМедиа="СПИСОК" Тогда
ТекСтрока=ЭлементыФормы.ТаблицаМедиа.ТекущаяСтрока;
Если ОперацииСМедиа="СОЗДАТЬ" Тогда
СтруктураПараметров=ДобавитьДанныеМедиаВСтруктуру(СтруктураПараметров, ТекСтрока.Ссылка);
Иначе
Если ТекСтрока.id=0 Тогда
Сообщить("id=0, продолжение невозможно.");
Возврат;
КонецЕсли;
СтруктураПараметров.Вставить("id",ТекСтрока["id"]);
Если ОперацииСМедиа="ОБНОВИТЬ" Тогда
СтруктураПараметров=ДобавитьДанныеМедиаВСтруктуру(СтруктураПараметров, ТекСтрока.Ссылка);
КонецЕсли;
Если ОперацииСМедиа="УДАЛИТЬ" Тогда
СтруктураПараметров.Вставить("force","true");
КонецЕсли;
КонецЕсли;
КонецЕсли;
СтруктураОтветаССайта = _рс_публикация_ПодсистемаWordPressМедиа(СтруктураПараметров);
ФормаПросмотраОтветаССайта=ПолучитьОбщуюФорму("ФормаПросмотраОтветаССайта");
ФормаПросмотраОтветаССайта.КодСостояния =СтруктураОтветаССайта["КодСостояния"];
ФормаПросмотраОтветаССайта.ОписаниеОтвета =СтруктураОтветаССайта["ОписаниеОтвета"];
ФормаПросмотраОтветаССайта.РезультатКонвертацииИзJSON =СтруктураОтветаССайта["ЗначениеОтвета"];
ФормаПросмотраОтветаССайта.Открыть();
КартинкаОбъект=ТекСтрока.Ссылка.ПолучитьОбъект();
Если ОперацииСМедиа="УДАЛИТЬ" Тогда
ТекСтрока.id=0;
КартинкаОбъект.id=0;
КартинкаОбъект.link="";
КартинкаОбъект.status="";
КартинкаОбъект.source_url="";
ИначеЕсли ОперацииСМедиа="СПИСОК" Тогда
/////ничего не обрабатываем
Возврат;
Иначе
ПарсерСтруктура=_рс_ПостОбработка_РаспарситьПростуюСтрокуДерева(СтруктураОтветаССайта["ЗначениеОтвета"]);
ТекСтрока.id=ПарсерСтруктура.id;
ТекСтрока.Слаг=ПарсерСтруктура.Слаг;
ТекСтрока.link=ПарсерСтруктура.link;
ТекСтрока.status=ПарсерСтруктура.status;
КартинкаОбъект.id=ПарсерСтруктура.id;
КартинкаОбъект.Слаг=ПарсерСтруктура.Слаг;
КартинкаОбъект.link=ПарсерСтруктура.link;
КартинкаОбъект.status=ПарсерСтруктура.status;
КартинкаОбъект.source_url=ПарсерСтруктура.source_url;
КонецЕсли;
КартинкаОбъект.Записать();
КонецПроцедуры
В этой процедуре подготавливаем структуру, для последующей публикации из модуля объекта.
Для получения списка нам никакие аргументы не нужны.
Для того, чтобы "Получить" или "Удалить" нам обязательно нужен id. Чтобы удалить на сайте без сохранения в "корзину" надо добавить ещё один аргумент: СтруктураПараметров.Вставить("force","true")
Для "обновить" на нужны те же данные, что и для "создать", плюс id.
Функция ДобавитьДанныеМедиаВСтруктуру
Функция ДобавитьДанныеМедиаВСтруктуру(ТемпСтруктураПараметров, Ссылка)
Для каждого ЭлМассива Из МассивОбязательныхРеквизитовМедиа Цикл
ТемпСтруктураПараметров.Вставить(ЭлМассива,Ссылка[ЭлМассива]);
КонецЦикла;
Возврат ТемпСтруктураПараметров;
КонецФункции // ДобавитьДанныеМедиаВСтруктуру()
Добавляем данные в структуру согласно массива обязательных реквизитов медиа.
Отправляем данные в модуль объекта для публикации, в зависимости от запроса обрабатываем ответ (парсим данные), сохраняем полученные от сайта данные.
Процедуры и функции модуля объекта.
Код публикации медиа/картинок немного отличается от остальных. Подробности в спойлере.
Функция _рс_публикация_ПодсистемаWordPressМедиа
Функция _рс_публикация_ПодсистемаWordPressМедиа(_ВхСтруктураПараметров) Экспорт
Если НЕ _ВхСтруктураПараметров["КонечнаяТочка"]="СОЗДАТЬ" Тогда //// Если мы не создаем новый медиа-файл на сайте, то всё идет штатным путем.
_ВхСтруктураПараметров.Вставить("status","publish"); //// Обязательный аргумент
Возврат _рс_публикация_ПодсистемаWordPressПостыСтраницы(_ВхСтруктураПараметров);
КонецЕсли;
/////_ВхСтруктураПараметров структура данных необходимых для действий на сайте, не нужные удаляются
ВозвращаемыйОтвет=_рс_подготовка_СоздатьСтруктуруВозвращаемогоОтвета();
Если ТипЗнч(_ВхСтруктураПараметров)<>Тип("Структура") Тогда ////проверка
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета","Входящие параметры не соответствуют типу данных <Структура>");
Возврат ВозвращаемыйОтвет;
КонецЕсли;
///// в этом блоке получаем и удаляем из структуры данные необходимые для подготовки к публикации
_token_ =_ВхСтруктураПараметров["Token"];
_JWTServer_ =_ВхСтруктураПараметров["Server"];
_Маршрут_ =_Текст_ПеревестиНаАнгл_ПолучитьЗначениеПоКлючу(_ВхСтруктураПараметров["Маршрут"]); //// получаем аглицкое название по русскому ключу
_КонечнаяТочка_ =_Текст_ПеревестиНаАнгл_ПолучитьЗначениеПоКлючу(_ВхСтруктураПараметров["КонечнаяТочка"]); //// получаем аглицкое название по русскому ключу
_ИмяФайла_ =_ВхСтруктураПараметров["ИмяФайла"];
_Расширение_ =_ВхСтруктураПараметров["РасширениеФото"];
_ТемпСлаг_ =_ВхСтруктураПараметров["Слаг"];
_ВхСтруктураПараметров.Удалить("Token");
_ВхСтруктураПараметров.Удалить("Server");
_ВхСтруктураПараметров.Удалить("Маршрут");
_ВхСтруктураПараметров.Удалить("КонечнаяТочка");
_ВхСтруктураПараметров.Удалить("ИмяФайла");
_ВхСтруктураПараметров.Удалить("РасширениеФото");
///// в этом блоке получаем и удаляем из структуры данные необходимые для подготовки к публикации
/////////----------Публикуем 2 раза, т.к. соединить бинарные данные и текстовые в одном теле запроса не представляется возможным
Попытка
ДД_Картинка = Новый ДвоичныеДанные(_ИмяФайла_); ////создаем бинарные данные
Исключение
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета","Не удалось получить двоичные данный картинки/фото. "+_ИмяФайла_+" ._ТемпСлаг_ "+_ТемпСлаг_);
Возврат ВозвращаемыйОтвет;
КонецПопытки;
_ТелоЗапроса_=__ПодсистемаWordPressМедиа_СоздатьТело_Изображения__(ДД_Картинка); //// чудеса магии с преобразованием в тело/боди запроса
_ЗаголовкиHTTP_=Новый Соответствие;
_Расширение=?(ЗначениеЗаполнено(_Расширение_),_Расширение_,"jpg");
_ЗаголовкиHTTP_.Вставить("Content-Disposition","attachment; filename="+_ТемпСлаг_+"."+_Расширение); //// особые заголовки и их параметры _Расширение_ - без "."
_ЗаголовкиHTTP_.Вставить("Content-Type","image/jpeg");
_ЗаголовкиHTTP_.Вставить("Authentication", "Bearer "+_token_);
Запрос =_рс_подготовка_ПолучитьЗапросHTTP(_Маршрут_, _ЗаголовкиHTTP_, _ТелоЗапроса_); //// получаем ЗапросHTTP
Результат =_рс_публикация_ПослатьГотовыйЗапросНаСайт(_КонечнаяТочка_, _JWTServer_, Запрос); //// посылаем запрос на сайт и получаем результат HTTPОтвет
_ТелоЗапроса_=Неопределено; ////очищаем
Запрос=Неопределено; ////очищаем
/////---получаем результат ответа - соответствие
РезультатРасшифровка=_Контроль_РезультатHTTPЗапросаСодержитОшибку(Результат); //// Расшифровываем ответ от сайта
/////// преобразовываем JSON результат ответа в "дерево значений"
РезультатОтветаДерево=_рс_ПостОбработка_ЗаполнитьДеревоJSON(Результат.ПолучитьТелоКакСтроку());
Если Результат.КодСостояния >= 200 И Результат.КодСостояния <= 202 Тогда ////ОК
СтруктураВхДанных=_рс_ПостОбработка_РаспарситьПростуюСтрокуДерева(РезультатОтветаДерево); //// здесь парсим, чтобы получить id картинки
Попытка
ИдКартинки=Число(СтруктураВхДанных["id"]);
Исключение
ИдКартинки=0
КонецПопытки;
Если ИдКартинки=0 Тогда
ВозвращаемыйОтвет.Вставить("ЗначениеОтвета",РезультатОтветаДерево);
ВозвращаемыйОтвет.Вставить("КодСостояния",РезультатРасшифровка["КодСостояния"]);
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета","Не удалось извлечь из ответа сайта id опубликованной картинки/фото. ");
Возврат ВозвращаемыйОтвет;
КонецЕсли;
_ВхСтруктураПараметров.Вставить("id",ИдКартинки); //// добавляем id для последующего обновления
_Маршрут_=_Маршрут_+ИдКартинки; //// добавляем id к маршруту POST /wp/v2/media/<id>
Иначе ////возможно не ошибка, но нам нужно чтобы все было ОК
ВозвращаемыйОтвет.Вставить("ЗначениеОтвета",рс_ПостОбработка_ЗаполнитьДеревоJSON(Результат.ПолучитьТелоКакСтроку()));
ВозвращаемыйОтвет.Вставить("КодСостояния",РезультатРасшифровка["КодСостояния"]);
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета",РезультатРасшифровка["ОписаниеОшибки"]);
Возврат ВозвращаемыйОтвет;
КонецЕсли;
/////////----------Публикуем 2 раза, т.к. соединить бинарные данные и текстовые в одном теле запроса не представляется возможным
/////если дошли сюда значит все ОК, картинка зашла на сайт, но это только медиа без описаний
//// обновляем описания и т.д.
_ВхСтруктураПараметров.Вставить("status","publish"); //// обязательный аргумент
_БодиПубликации_=_рс_подготовка_КонвертироватьВСоответствие(_ВхСтруктураПараметров);
_ЗаголовкиHTTP_ =_рс_ПолучитьТиповыеЗаголовкиХТТП();
_ЗаголовкиHTTP_.Вставить("Authentication", "Bearer "+_token_);
/////типовые действия по публикации/обновлению и т.д.
_ТелоЗапроса_ =_рс_подготовка_ОбъектВJSON(_БодиПубликации_);
Запрос =_рс_подготовка_ПолучитьЗапросHTTP(_Маршрут_, _ЗаголовкиHTTP_, _ТелоЗапроса_);
Результат =_рс_публикация_ПослатьГотовыйЗапросНаСайт(_КонечнаяТочка_, _JWTServer_, Запрос);
/////---получаем результат ответа - соответствие
РезультатРасшифровка=_Контроль_РезультатHTTPЗапросаСодержитОшибку(Результат);
ВозвращаемыйОтвет.Вставить("ЗначениеОтвета",РезультатОтветаДерево); //// дерево с ответом из рс_ПостОбработка_ЗаполнитьДеревоJSON
ВозвращаемыйОтвет.Вставить("КодСостояния",РезультатРасшифровка["КодСостояния"]); //// код состояния 200, 201, 404, и т.д. из Контроль_РезультатHTTPЗапросаСодержитОшибку
ВозвращаемыйОтвет.Вставить("ОписаниеОтвета",РезультатРасшифровка["ОписаниеОшибки"]); //// краткое описание ошибки из Контроль_РезультатHTTPЗапросаСодержитОшибку
Возврат ВозвращаемыйОтвет;
КонецФункции // ПодсистемаWordPressПостыСтраницы()
Большинство функций взято из предыдущей публикации, о них можно прочитать здесь.
Чудеса магии с преобразованием в тело/боди запроса.
Функция __ПодсистемаWordPressМедиа_СоздатьТело_Изображения__
Функция __ПодсистемаWordPressМедиа_СоздатьТело_Изображения__(МедиаФотоКартинка) ////чудеса магии с преобразованием в тело/боди запроса
////МедиаФотоКартинка в ДвоичныеДанные
ПотокДвДанных = Новый ПотокВПамяти();
ДвД_ЗаписьДанных = Новый ЗаписьДанных(ПотокДвДанных);
ДвД_ЗаписьДанных.Записать(МедиаФотоКартинка);
ДвД_ЗаписьДанных.Закрыть();
Возврат ПотокДвДанных.ЗакрытьИПолучитьДвоичныеДанные();
КонецФункции
Экспериментировал с кодом по посылке двоичных данных довольно долго, в результате пришел к этому. Объем (размер в КБ или МБ) в принципе не имеет значения. Чем больше объем, тем больше время передачи на сайт.
В "Функция _рс_подготовка_ПолучитьЗапросHTTP" (описание здесь), с помощью "Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса)" устанавливаем двоичные данные в боди запроса и посылаем на сайт.
Небольшая видео-демонстрация:
Заключение.
Как видим опубликовать, картинку на сайте не составляет большого труда.
Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам.
Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp.
Я покажу, как с её помощью можно значительно облегчить себе труд.
Решение, позволяющее программным продуктам, работающим на устаревших версиях платформы 1С (8.2), интегрироваться с современными HTTP сервисами. Решение, интегрированное с HTTP-сервисом программы по расчету компонентов для изготовления ЛКМ, описанное в настоящей статье, успешно работает в одном из автосервисов, работающем на устаревшей платформе и конфигурации Альфа-Авто 5.0.
В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.
Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.
Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.
C 2011 года я занимаюсь интеграцией с интернет-магазинами и за это время, наверное, повидал все. Делал интеграцию как «культурными», так и «экзотическими» способами. Количество магазинов исчисляется сотнями. В этой серии статей я буду делиться своим опытом, а также выкладывать какие-то полезные наработки.
JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.
Задача: из множества систем (1С:ERP, 1C:CRM, Кронос:WMS, 1С:Розница, 1С:УПП...) оперативно и онлайн осуществлять мониторинг на телефоне/десктопе/планшете/телевизоре бизнес-аналитику в дашборде для директора. Рассмотрим в статье, как правильно интегрировать между собой все базы, какие для этого инструменты использовать.
В обработке ДиадокПро все дополнительные модули встроены во внешние обработки, которые хранятся в макетах. Это усложняет процесс самостоятельной интеграции, так как теряется возможность попасть в них в режиме отладки. Но не всё так страшно, поэтому ниже инструкция)
Задача - передавать на сайт объекты с наименованием и уникальным идентификатором (УИ), которые изменяются в 1С. Также нужно сохранять историю отправленных пакетов.
В этой статье научим прослойку отправлять данные в 1С, для этого используем HTTP-сервисы платформы. Обменяемся данными с новым справочником Клиенты. Но главное создадим HTTP-сервис для получения сообщений из очереди RabbitMQ.
При разработке http сервиса возникает ситуация, а как протестировать http сервис?
Создали мы сервис, настроили шаблоны, передали, если нужно параметры, открываем браузер заполняем строку подключения и БАХ, ошибка. Что делать?
В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке
При эксплуатации большого количества информационных систем 1С, предоставляющих интернет-сервисы, возникают проблемы, связанные с зависимостью от производительности и стабильности веб-сервера. Как объединить отдельно стоящие веб-сервера с помощью платформы Kubernetes для централизованного мониторинга всех опубликованных интернет-сервисов на конференции Infostart Event 2019 Inception рассказал программист компании BIA Technologies Владимир Кирбаба.
В процессе разработки web приложения на 1С, и это не шутка))), а пожелание заказчика, возникла ситуации когда понадобилось знать, с какого IP подключался клиент.
Использование чат-ботов в мессенджерах позволяет автоматизировать многие сложные бизнес-процессы путем диалога с системой через виртуального собеседника. О том, как создать универсальную систему ботов с бэкендом на 1С, работающую в Telegram, Viber и Facebook Messenger одновременно, на конференции Infostart Event 2019 Inception рассказал программист-фрилансер Константин Гейнрих.
Есть девочки как девочки, есть мальчики как мальчики, есть сайтики как сайтики, но странички их обманщики.
В целях сохранить информацию, от автоматизированного сбора, многие ресурсы пытаются защитить ее. Один из таких способов - вывод информации на странице через JavaScript. При получении такой страницы в 1С, JavaScript не успевает вывести необходимые данные, и в 1с получаем практически пустую страницу.
В статье приведу пример разработки, для парсинга таких страниц, без регистрации и смс.
Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции передачи фото из 1С и категорий товаров на сайт. Внешняя обработка с комментариями внутри.
Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции публикации категорий товаров в магазин WooCommerce, с комментариями внутри.
Быстрый старт. Только практические примеры. Установка, запуск и публикация бизнес-процесса на сервере Camunda BPM. Управление бизнес-процессами из 1С при помощи Camunda REST API.
Интеграция 1С и CMS WordPress посредством функционала Rest API. Используем только язык программирования 1С и штатный функционал Rest API предоставляемый CMS, без дополнительных библиотек и плагинов. Процедуры и функции 1С с комментариями внутри.
Инфостарт ® достаточно удобный в плане работы со своим личным кабинетом сайт. Но программисты тем и отличаются от большинства людей, что им хочется знать больше.
Поэтому появилась конфигурация 1С (она же мобильное приложение 1С) для более подробного учета статистики публикаций: рейтинг, количество просмотров, количество комментариев в динамике и в разрезах.