Альфа-Авто 5.0 и современные HTTP сервисы
Преамбула
Очень многие автосервисы и автосалоны когда-то купили конфигурацию Альфа-Авто 5.0 (разных релизов) работающую на платформе 1С 8.2. И очень немногие из них обновляли её до актуальных релизов, «заточили» для работы под свои бизнес процессы, работает и ладно. Но реалии современной жизни таковы, что необходимо пользоваться современными услугами построенными на основе HTTP-сервисов. Однако платформа 8.2 устарела и полноценно не может поддерживать работу с современными HTTP-сервисами. Один знакомый автосервис столкнулся с подобной проблемой.
Проблемы с материалами для окрасочных работ.
Пару слов об автосервисе, не лучше и не хуже других, осуществляет слесарный и кузовной ремонт. И была у него проблема с учетом компонентов для создания краски (миксов) и сопутствующих расходных материалов. Главная проблема была в расчетной части компонентов, где, когда и «сколько вешать в граммах» на одну деталь и как это точно рассчитать.
И вот недавно было предложено решение от одной компании, поставщика компонентов, нужное решение.
Что предоставлялось:
- Расчетная часть, работающая на SQL и Web серверах, с предоставлением доступа соответствующим сотрудникам через web браузер для просмотра, расчета и т.д. и т.п. Называется RMP.
- Небольшая демо конфигурация для 1С с возможностью создания в RMP заказ-наряда и импорта оттуда рассчитанных данных в Альфа-Авто.
- Все данные в Альфа-Авто можно получать с помощью HTTP-сервисов, предоставляемых программой.
Плюсы и минусы.
+ «То, что доктор прописал».
- Демо конфигурация написана под релиз платформы 8.3.12
- Поставщик не дорабатывает конфигурации клиентов.
- Альфа-Авто работает на платформе 8.2, переписана и адаптирована под внутренние бизнес-процессы.
- Платформа 8.2 посылает некорректные HTTP-запросы к Web-серверу RMP, в результате чего возвращаются неверные ответы.
- Обновление Альфа-Авто ради небольшого блока, создание новых сервера 1С, обновление клиентских частей, перенос измененного функционала из старой конфигурации в новую и т.д.
Продолжать можно долго и минусов накопилось достаточно много, что задумались «А стоит ли овчинка выделки?». Но внедрить новый функционал по учету компонентов и расходных материалов для создания комплекта краски очень хотелось.
Решение есть!
В связи с тем, что имелся опыт решения подобной проблемы (взаимодействие с «Честным знаком» в области обмена с ним маркированной продукцией, шины), было предложено использовать промежуточную конфигурацию 1С, развернуть WEB-сервер, и опубликовать эту промежуточную конфигурацию, которая может взаимодействовать и с сервисом RMP и со старой конфигурацией Альфа-Авто. Своего рода «буфер обмена», или как мы её назвали - «прокладка».
Принципиальная схема взаимодействия представлена на рис.1
Итак, принципиальная схема взаимодействия есть, осталось реализовать/материализовать это в виде программного кода на соответствующих конфигурациях и сервисах.
Расчетную часть и HTTP-сервисы есть в RMP и она предоставляет всё, что нам надо для учета в работе с конфигурацией Альфа-Авто 5.0. Поэтому её не трогаем и используем всё как есть. RMP развернута на отдельной виртуальной машине на Windows, там же развернут web-сервер Apache «заточенный» под работу именно этой программы и предоставлявшей свои сервисы на определенном порту.
Дабы не мудрствовать, для работы «буфера обмена» было решено использовать эту же виртуальную машину, мощности позволяли. В связи с тем, что поставщики категорически не рекомендовали использовать их web-сервер, пришлось разворачивать свой. Благо их сервер был «урезанный» и 32-битный, поэтому было принято решение разворачивать 64-битный, чтобы процессы не пересекались.
Конфигурация – «буфер обмена»
В нескольких словах, «конфигурация-буфер» представляет собой конфигурацию, работающую на платформе 1С 8.3.17 (минимальные требования для платформы 8.3.8), с разработанными HTTP-сервисами, взаимодействующими по HTTP протоколу с RMP и Альфа-Авто 5.0.
Основной функционал заключается в следующем:
- Получение и обработка запросов от Альфа-Авто.
- Обработка функциональной логики для работы с RMP.
- Запрос данных из RMP согласно запроса Альфа-Авто.
- Обработка http-ответа от RMP сервера.
- Трансформация данных полученных от RMP в формат, понятный для платформы 1С 8.2
- Возврат ответа в соответствии с запросом или данных в Альфа-Авто.
В конфигурации были разработаны HTTP-сервис, работающий по методу GET, и обработка, которая обслуживает всё, связанное с обработкой этих запросов.
В конфигурации выглядит так:
HTTP-сервис
Сам функционал HTTP-сервиса состоит из нескольких строк:
Функция Alfa50APIGET(Запрос) ///кейсы получения чего либо посредством GET
ГлОбработка=Обработки.RestAPI.Создать();
Возврат ГлОбработка.ВернутьОтветНаЗапросGET(Запрос);
КонецФункции
Для простоты отладки и разработки, весь функционал обработки GET-запросов вынесен в обработку.
Обработка RestAPI
Для минимизации разработки кода в Альфа-Авто было решено использовать совсем простые http «GET» запросы вида «ЧтоНадоСделать=Команда» и «НомерЗаказНаряда=NNNNNNN», с передачей этих данных в заголовках:
Команды для обработки, обрабатываемые через АПИ
Команда в Заголовках, одна из:
"CommandWhatToDo" = "RMPCreated" - Создан ли заказ-наряд?
"CommandWhatToDo" = "RMPCreateZN" - Создать новый заказ-наряд
"CommandWhatToDo" = "RMPClosed" - Заказ-наряд Закрыт?
"CommandWhatToDo" = "RMPReportReceived" - Отчет (данные) получены?
"CommandWhatToDo" = "RMPGetReport" - получить отчет и закрыть заказ-наряд в RMP.
"Response" - возвращаемый ответ в тексте, сообщение об ошибке и т.д.
Номер заказ-наряда в заголовках.
"NumberZN" = "NNNNNNNNNN" – передача номера заказ-наряда.
Обработка содержит основной специфичный функционал для работы с RMP: создание заказ-наряда, получение отчета и формирование таблиц с рассчитанными данными по расходу миксов/компонентов и расходных материалов для изготовления лакокрасочных материалов (далее по тексту ЛКМ). И вспомогательный функционал для получения и отправки данных от конфигурации Альфа-Авто 5.0.
Логика работы обработки RestAPI
*Весь контекст, связанный с работой Альфа-Авто 5.0 описан ниже.
Создание заказ-наряда в RMP:
- Из формы заказ-наряда Альфа-Авто, по соответствующей кнопке, с минимальным набором необходимых данных, отправляется GET HTTP-запрос вида "CommandWhatToDo" = "RMPCreateZN".
- Обработка обращается к RMP-сервису на предмет существования заказ-наряда с присланным номером, и, если такового нет, создает новый в соответствии с присланными исходными данными.
- Обрабатывает ответ от RMP и отправляет http-ответ в Альфа-Авто.
Получение отчета:
- Из формы заказ-наряда Альфа-Авто, по соответствующей кнопке, отправляется GET HTTP-запрос вида "CommandWhatToDo" = " RMPGetReport".
- Обработка обращается к RMP-сервису и запрашивает количество рассчитанных деталей в заказ-наряде, если количество деталей равно нулю, возвращается ответ с ошибкой.
- Если количество рассчитанных деталей больше нуля, возвращаются данные содержащие расчет затраченных компонентов и расходных материалов для изготовления ЛКМ.
- Обрабатывает ответ от RMP, если содержатся данные расчета ЛКМ формируются соответствующие таблицы с данными.
- Отправляет http-ответ в Альфа-Авто.
Приводить код функции не буду, так как он большой и имеет несколько связанных под-функций и процедур. Но если «очень надо», готов выложить.
Хочу отметить простоту и изящность решения по передаче таблиц из «буфера» в Альфа-Авто по http с помощью штатных средств 1С. Код функции:
Функция Alfa50API_СериализоватьОбъект(Значение)
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
СтрокаXML = ЗаписьXML.Закрыть();
Возврат СтрокаXML;
КонецФункции
Ответное значение «СтрокаXML» помещаем в тело http-ответа и отсылаем в Альфа-Авто. Что получаем в Альфа-Авто смотрите ниже.
На этом описание функционала конфигурации «буфер», можно считать закончено. Свой функционал промежуточного звена между устаревшей конфигурацией Альфа-Авто 5.0, работающей не платформе 8.2 и HTTP-сервисом RMP выполняет целиком и полностью, расширяем, независим, может обслуживать иные подобные сервисы.
Конфигурация Альфа-Авто 5.0
Конфигурация представляет собой стандартную, немного переработанную, конфигурацию «Альфа-Авто: Автосалон+Автосервис+Автозапчасти ПРОФ. Редакция 5», работающую на платформе 8.2
Здесь, в документ «Заказ-наряд» были добавлены две табличные части «RMP_Материалы» и «RMP_НормативыРасхода», соответствующие кнопки и код обслуживающий функционал работы с данными полученными из RMP-сервиса. И обработка «RMP_RestAPI» с кодом, обслуживающим функционал по работе с HTTP и конфигурацией «буфер».
Документ «Заказ-наряд»
Естественно, для работы с RMP-сервисом пришлось не только дописывать код, но и вносить соответствующие интерфейсные правки, вот так теперь выглядит измененная форма документа:
Вкладка «Нормативы расхода» носит исключительно информационный характер и никакой иной функциональной нагрузки не несёт.
Основной функционал расположен во вкладке «Материалы».
Вкладка «Материалы»
Кнопка «Создать ЗН в RMP»
Как можно понять из названия, по нажатии отправляется http-запрос с командой «CommandWhatToDo = "RMPCreateZN"» - Создать новый ЗН в конфигурацию «буфер». После успешного создания заказ-наряда в RMP устанавливается «флаг Создан в СМ», и «колорист» или иной сотрудник, может рассчитать и заполнить данные в сервисе RMP.
Кнопка «Загрузить из RMP»
По нажатии отправляется http-запрос с командой «CommandWhatToDo = "RMPGetReport"»- получить отчет, в конфигурацию «буфер». В случае если нет расчитанного количества деталей, заказ-наряд в RMP не закрывается, данные в Альфа-Авто не посылаются и возвращается ошибка. После успешного получения «отчета» заполняются таблицы «Материалы» и «Нормативы расхода».
Комплектация в производство.
После успешной загрузки данных в таблицу материалов можно «Создать комплектацию в производство», нажав соответствующую кнопку. Заполнение документа «Комплектация в производство» немного переработано, исходные данные берутся из таблицы «Материалы». Также добавлена возможность автоматического добавления комплекта ЛКМ в товары. Остальной функционал документа оставлен без изменения.
Обработка «RMP_RestAPI»
Здесь заложен весь функционал необходимый для работы с конфигурацией «буфер», посылки GET http запросов, обработки результатов ответов и передачи данных в документ «заказ-наряд».
Логика работы следующая:
- Из заказ-наряда формируется структура данных содержащая минимум два параметра
- В случае простого запроса: Номер заказ-наряда и команды, например, RMPGetReport.
- В случае создания заказ-наряда: номер заказ-наряда, команды и данные для создания заказ-наряда в сервисе RMP (данные по автомобилю, владельцу и т.д.).
- Обработка формирует: «HTTP-Соединение», в заголовки помещает переданные данные из структуры, «HTTP-Запрос» и отсылает запрос в «буфер».
- Обрабатывает полученные из «Соединение.Получить(Запрос)», формирует структуру ответа и отсылает в документ заказ-наряд.
В случае получения отчета, формируются соответствующие таблицы с данными с помощью
Функция ДеСериализоватьОбъект(СтрокаXML)
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(СтрокаXML);
Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Возврат Значение;
КонецФункции
И в заказ-наряде заполняются соответствующие табличные части и остальные действия производятся в коде документа «Заказ-наряд».
Что в итоге
Данным решением хотел показать, что далеко не всегда для решения какой-то задачи на устаревшей платформе необходимо тотальное обновление, и конфигурации, и платформы.
В итоге имеем успешно работающий функционал способный помочь устаревшим программным решениям оставаться «на плаву» и использовать функционал современных HTTP-сервисов, обмен с сайтом, например. Для этого необходимо всего лишь проявить немного изобретательности.
Автосервису не надо было вкладываться финансово и по времени в обновление конфигурации и платформы, переносе данных в новую конфигурацию, адаптацию и т.д. В двух словах – сплошные плюсы и полное отсутствие минусов.
В планах интеграция с сервисом «Честный знак» по продаже маркированных шин (и не только), будем внедрять решение по аналогичному сценарию. Ведь даже в последней версии Альфа-Авто 5.1 «полной» интеграции нет, есть только в 6.0.
Как говорится, «дорогу осилит идущий», успехов в разработке.
Решение работает.
1С:Предприятие 8.3, версия (8.3.17), уверен, будет работать на версии 8.3.8.