Интеграция 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" (описание здесь), с помощью "Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса)" устанавливаем двоичные данные в боди запроса и посылаем на сайт.
Небольшая видео-демонстрация:
Заключение.
Как видим опубликовать, картинку на сайте не составляет большого труда.
Те, кому приходилось делать REST API на базе HTTP-сервисов 1С, могли в какой-то момент столкнуться с необходимостью разработки методов, которые позволяли бы возвращать данные с пагинацией, т.е. последовательными порциями.
В языках общего назначения пагинация реализуется простым использованием операторов OFFSET и LIMIT в SQL-запросе к базе данных. В языке запросов 1С оператора OFFSET нет, поэтому всем приходится решать эту задачу обходными способами.
Один из таких обходных способов представлен в этой статье.
В статье собраны некоторые полезные и интересные примеры доработок выгрузки из 1С на сайты на платформе Битрикс (Возможно, что-то подойдёт и для WordPress и других платформ, принимающих типовую выгрузку на сайт из 1С). Доработки рассмотрены без привязки к конкретным конфигурациям, примеры кода взяты в основном из доработок УТ 10 и 11. Некоторые доработки требуют изменений на стороне Битрикса, некоторые укладываются в типовой функционал.
Примеры взяты из личного опыта, возможно, описание где-то не полное, т.к. доработки делались в разное время. Если материал будет интересен или будут аналогичные актуальные задачи, буду стараться дополнять статью более подробным описанием и примерами.
Онлайн-сервисы, построенные на 1С, могут использовать все многообразие веб-технологий. О том, как спроектировать, реализовать и красиво оформить интерфейс продукта 1С, в докладе на конференции Infostart Event 2021 Post-Apocalypse рассказал CTO компании WiseAdvice Олег Филиппов.
ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.
На написание статьи побудило чтение книги "Технологии интеграции "1С:Предприятия 8.3"" Хрусталевой Е.Ю. В первой главе там постоянно чередуются слова REST, REST-интерфейс, архитектура REST и т.д. Мне стало интересно, я начал копать, что это такое, и тема оказалась достаточно интересной.
При обновлении релиза УПП до 1.3.178.2 пользователи начали жаловаться, что не отправляются в ФСС документы "Ответ на запрос ФСС для расчета пособия" и "Сведения о застрахованных лицах, ФСС". В статье предложен вариант обхода данной ошибки, возможно, это кому-то поможет.
В статье описаны критерии WYSIWYG HTML редакторов и общая картина интеграции с платформенными механизмами. На момент платформы 1С 8.3 и возможно для будущих релизов описание будет скорее всего актуально. Апробировано на 1С 8.3.20 и 8.2.12, а также на мобильной платформе 8.3.19.59.
На онлайн-митапе «Бизнес-анализ по данным базы 1С. Интеграция c платформами BI» выступил ведущий разработчик WiseAdvice.tech Дмитрий Фурцев. Дмитрий рассказал о том, как отдать миллионы строк из 1С в платформу бизнес-аналитики и не потратить на это сутки.
1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя.
Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.
В статье хочу поделиться опытом настройки подключения 1С к стороннему HTTP-сервису, использующему авторизацию посредством передачи клиентского SSL-сертификата.
Это вторая часть цикла статей, посвящённых типовому модулю интеграции 1С Предприятия и Битрикс24. Цель данной части: рассмотреть тонкости, связанные с обменом товарами и сопутствующими сущностями (спойлер - единицы измерения и свойства товаров). Также затронем некоторые нюансы связи сущностей 1С и Б24 (относящиеся не только к товарам) и их побочное влияние при переносе данных из модуля в модуль (при смене конфигурации, переустановки или обновлении модуля).
Мы дали ему название adm1c, он позволяет посредством веб доступа удалять или смотреть на сеансы в 1С базах и при необходимости удалять их. Да и что тут такого, сказали бы, есть же консоль на win, с нее же это можно делать, и все верно, но есть пара но.
На днях взялся за реализацию печатной формы, где данные должны быть представлены на иностранном языке. На удивление нашёл крайне мало информации по данному вопросу. Поэтому решил написать эту статью.
Цель статьи - указать на подводные камни и нюансы, о которых “не пишут на заборах” и которые встретились мне за время внедрения типового модуля интеграции 1С и Битрикс24. Будет интересна для людей, кто подумывает о том, чтобы настроить интеграцию, и хотят понять, с чем столкнутся. А также для тех, кто уже работает с подобным обменом, столкнулся с какими-то из описанных ситуаций и хочет понять, что пошло не так и “как жить дальше”. Постараюсь все описать “человеческим” языком с минимальной долей терминов, так как статья, надеюсь, будет полезна не только программистам.
С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2.
Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.
Рассказываем о WEB и HTTP сервисах, их практическом применении, о шишках, которые мы набили, и о выводах, которые сделали. Спойлер: тех, кто дочитает статью до конца, ждет бонус от автора.
ГИИС ДМДК - единая информационная платформа для взаимодействия участников рынка драгоценных металлов и драгоценных камней. с 01.09.21 стартовал обязательный обмен данными с Федеральной пробирной палатой (ФПП) исключительно через ГИИС. А постепенно - с 01.01.2022 и с 01.03.2022 - все данные о продаже драгоценных металлов и камней должны быть интегрированы с ГИИС.
У многих пользователей возникает вопрос как автоматизировать обмен между программой 1С и ГИИС ДМДК.
В настоящей статье ВЦ Раздолье поделится своим опытом о реализации такого обмена.
Автор статьи - Мордовин Антон - архитектор систем на базе 1С Внедренческого центра "Раздолье".
Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд).
Точность распознания до 98%.
Потребовалось отправить картинку в теле запроса в HTTP сервис методом POST, куча реализаций, но есть маленькие нюансы, если хотя бы кому-то поможет, то уже это было не напрасно.
Все чаще разработчики склоняются к использованию 1C в качестве бэкенда при разработке веб-приложений. Но благодаря встраиванию веб-клиента 1С в сайт можно получить еще больше готовой функциональности. О том, как реализовать гибридное приложение за счет связки 1С с другими веб-технологиями, рассказал разработчик компании Neti Эльдар Мингалиев.
Использование веб-сервисов 1С при обмене 1С – 1С позволяет быстро передавать достаточно большие объемы данных из базы-источника в базу-приемник в объектах языка 1С.
Данный метод обмена может применяться при бесшовной интеграции между двумя базами 1С, но требует определенной серверной инфраструктуры (установленного и настроенного WEB-сервера).
СПАРК помогает предотвратить мошенничество со стороны компаний и предпринимателей, благодаря актуальным сведениям о компаниях и системе выявления факторов риска.Сервис позволяет управлять налоговыми рисками и комплексно оценивать благонадежность контрагентов.
Путешествие начинающего программиста 1С. Глава вторая. Призываем экспертов в комментарии, оптимизируем код, ругаемся на кривые руки автора.
Автор же, в свою очередь, делится своим опытом, читает умные комментарии, стремится дать те знания, за которыми он сидел ночами тем, кто их хочет найти.
В статье будет много примеров кода с комментариями работы расширения для обмена данными УТ11.4 с Яндекс.Маршрутизацией через выгрузку/загрузку EXCEL файла.
В платформе 8.3.16 появилась возможность выводить на страницах сайта информацию из веб-клиента 1С так, что пользователь даже не заметит, что работает с платформой. Руководитель компании Айтон Михаил Пинягин на онлайн-митапе «Web-клиенты для 1С» рассказал о том, какие особенности нужно учесть при настройке встраиваемого веб-клиента, и какие возможности он дает.
При разработке сайтов, интегрированных с 1С через HTTP-сервисы, приходится бороться с кодировками, искать производительные интерфейсные решения и задумываться над безопасностью. В ходе онлайн-митапа «Web-клиенты для 1С» Юрий Лазаренко показал на практике, как работает магия самодельного веб-клиента и как решать проблемы, возникающие при интеграции.
В курсе обобщен опыт работы аналитика на проектах в течение пяти лет, в нескольких фирмах. Подходы к написанию документов унифицированы и по возможности не привязаны к конфигурациям 1С.
Как мы решали проблемы с доставкой в нашем интернет-магазине, внедрили новый бизнес-процесс за 3 месяца и научились меньшим количеством машин привозить больше заказов клиентам.
На Infostart Meetup «Интеграционные решения для 1С» выступил Сергей Наумов – руководитель центра аналитики и консалтинга WiseAdvice. Сергей поделился с коллегами кейсами из собственной практики: какие интеграционные решения остаются актуальными до сих пор, а каких приемов стоит избегать – даже в безвыходных ситуациях.
Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика, Украина.
Тестирование проводил на 1С:Предприятие 8.3 (8.3.10.2561).
Статья - пример для разработчика, как можно, не используя подсистему Интеграция с Документооборотом, управлять процессами, а именно на нашем примере прерывать выполнение процессов в 1С: Документооборот.
Используя данный пример, можно организовать http-сервис в любой конфигурации 1С, которая поддерживает механизм HTTP сервисов.
Чем больше в компании различных конфигураций и сервисов, тем актуальнее становится проблема единой системы авторизации single Sign-On. Его лидером практически безоговорочно считается Okta. Но на просторах интернета очень мало информации про интеграцию 1С с Okta через протокол OpenID Connect. Что ж, настало время восполнить недостающие пробелы и перевернуть эту печальную страницу в вашей истории