Типовой обмен между 1С и сайтом, базирующийся на протоколе CommerceML, в большинстве случаев настроен на сценарий: «выгрузка товаров на сайт и загрузка заказов в 1С». Однако в реальном бизнесе часто возникает обратная задача — передать информацию о состоянии уже существующих заказов обратно клиенту в его личный кабинет. Это особенно актуально для производственных предприятий на базе 1С:УПП 1.3, где клиенту важно видеть этапы производства: «в очереди», «в цеху», «покраска», «готов к отгрузке».
Разберем подробно, как реализовать такую систему обмена, используя современные инструменты платформы 1С 8.3, даже если ваша конфигурация работает на обычных формах.
Стандартный механизм обмена с сайтом (интеграция с Битрикс или другими CMS) заточен под передачу справочников и остатков. Заказы в этой схеме являются «входящим» потоком данных. Для реализации «исходящего» потока статусов нам потребуется написать собственную логику. Рассмотрим ситуацию: у вас есть сложный запрос, собирающий данные из различных регистров (ЗаказыПокупателей, ВыпускПродукции, ЗаказыНаПроизводство), и эти данные нужно оперативно доставлять на сайт.
Для того чтобы не выгружать тысячи заказов при каждом сеансе связи, проанализируем механизм планов обмена. Мы создадим новый ПланОбмена, который будет фиксировать только те документы ЗаказПокупателя, в которых произошли изменения.
ПланОбмена (назовем его ОбменСЛичнымКабинетом).ЗаказПокупателя.Проанализируем код для выборки измененных данных:
УзелОбмена = ПланыОбмена.ОбменСЛичнымКабинетом.НайтиПоНаименованию("Сайт");
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
ДанныеОбъекта = ВыборкаИзменений.Получить();
Если ТипЗнч(ДанныеОбъекта) = Тип("ДокументОбъект.ЗаказПокупателя") Тогда
// Здесь мы вызываем функцию сбора данных по заказу
СобратьИОтправитьДанные(ДанныеОбъекта);
КонецЕсли;
КонецЦикла;
В 1С:УПП 1.3 статус готовности продукции редко хранится в одном реквизите. Чаще всего его нужно вычислять. Рассмотрим пример запроса, который собирает информацию о производстве заказа:
Нам потребуется проанализировать регистр накопления ВыпускПродукции в связке с ЗаказамиНаПроизводство. Если по заказу покупателя есть выпуск, значит, статус — «Готов». Если есть размещение в заказах на производство, но нет выпуска — «В работе».
Для веб-программистов формат JSON является более предпочтительным и легким в обработке, чем XML. Несмотря на то что УПП — старая конфигурация, платформа 8.3 позволяет нам использовать объект ЗаписьJSON.
Разберем пример формирования структуры данных для отправки:
СтруктураЗаказа = Новый Структура;
СтруктураЗаказа.Вставить("OrderNumber", ЗаказОбъект.Номер);
СтруктураЗаказа.Вставить("OrderDate", ЗаказОбъект.Дата);
СтруктураЗаказа.Вставить("Status", ПолучитьТекущийСтатусПроизводства(ЗаказОбъект.Ссылка));
СтруктураЗаказа.Вставить("PlannedDate", ЗаказОбъект.ДатаОтгрузки);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураЗаказа);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Забудьте про FTP. Это медленно, небезопасно и требует от сайта постоянного сканирования папок. Рассмотрим более современный вариант — HTTP POST запрос к API сайта. Выясним у веб-разработчиков адрес (URL), на который они готовы принимать данные.
Пример функции отправки:
Сервер = "api.mysite.ru";
Ресурс = "/v1/update_order_status";
// Настройка соединения
Соединение = Новый HTTPСоединение(Сервер, , "User1C", "Password1C", , , Новый ЗащищенноеСоединениеOpenSSL());
// Подготовка заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/json");
// Формирование запроса
ЗапросHTTP = Новый HTTPЗапрос(Ресурс, Заголовки);
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
// Отправка и получение ответа
Попытка
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Если Ответ.КодСостояния = 200 Тогда
// Если сайт принял данные, подтверждаем отправку в плане обмена
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НомерСообщения);
КонецЕсли;
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
Для того чтобы обмен происходил без участия пользователя, настроим РегламентноеЗадание. Оно будет запускать процедуру обмена, например, каждые 15 минут. В УПП 1.3 это делается через консоль заданий или в режиме конфигуратора.
Важные моменты при настройке автоматизации:
Попытка...Исключение. Если сайт временно недоступен, 1С не должна «падать», она просто попробует отправить изменения в следующий раз (так как мы не удалим регистрацию изменений в случае ошибки).HTTPS (используя ЗащищенноеСоединениеOpenSSL).Мы выяснили, что задача выгрузки заказов из 1С на сайт вполне решаема стандартными средствами платформы 8.3 даже в старых конфигурациях. Основная цепочка действий выглядит так: Регистрация изменений (План обмена) -> Сбор данных запросом -> Сериализация в JSON -> Отправка через HTTPСоединение. Такой подход гарантирует высокую скорость работы, экономию трафика и удобство для веб-разработчиков, которые получат данные в понятном им формате.