Введение
Периодически возникают прикладные задачи, требующие от сервера приложений 1С:Предприятие больших вычислительных ресурсов, что приводит к необходимости установки дополнительных рабочих серверов на отдельном оборудовании и как следствие – к покупке дополнительных серверных лицензий. Альтернативным путем, может являться выполнение “тяжелых” операций, на отдельном оборудовании в среде OneScript, с последующим возвратом результатов в 1С:Предприятие для дальнейшей обработки. Такой подход, позволяет сократить затраты на серверные лицензии 1С:Предприятие.
Реализация
В качестве основы, для нашего “сервера приложений” OneScript, используем каркасную конфигурацию для создания http-сервисов. При необходимости, мы можем развернуть ее на нескольких серверах и настроить NLB-кластер, что позволит увеличить суммарную производительность и обеспечит масштабируемость.
Поскольку обратиться к “серверу приложений” можно только по протоколу http(s), все взаимодействие сводится к выполнению соответствующих http-запросов, с последующей обработкой полученных результатов. В качестве протокола, для передачи данных, между 1С:Предприятие и http-сервисами OneScript используем JSON. Данный формат достаточно прост в использовании и поддерживается штатными средствами 1С:Предприятие. Поскольку в OneScript 1.0.20, на базе которого создана каркасная конфигурация, не имеет штатной поддержки JSON, для сериализации и десериализации данных используем слегка модифицированные функции из этой публикации.
На стороне 1С:Предприятие создадим функцию, которая отправляет POST запрос по указанному URL и передает в теле JSON объект, содержащий поля Параметры и Скрипт. Первое поле – содержит передаваемые параметры, а второе – собственно фрагмент кода, который необходимо выполнить.
&НаКлиенте
Процедура ВыполнитьСкрипт(Команда)
// Вставить содержимое обработчика.
ДанныеТело = Новый Соответствие;
ДанныеТело.Вставить("Скрипт", Объект.Скрипт);
ДанныеПараметры = Новый Соответствие;
Для каждого Параметр Из Объект.Параметры Цикл
ДанныеПараметры.Вставить(Параметр.Имя, Параметр.Значение);
КонецЦикла;
ДанныеТело.Вставить("Параметры", ДанныеПараметры);
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеТело);
Объект.Результаты = ОтправитьЗапрос(Объект.URL, ЗаписьJSON.Закрыть());
КонецПроцедуры
&НаКлиенте
Функция ОтправитьЗапрос(Url, ТелоЗапроса = "") Экспорт
ЧастиUrl = ПолучитьЧастиURL(Url);
Запрос = Новый HTTPЗапрос();
Запрос.АдресРесурса = ЧастиUrl.ОтносительныйUrl;
Соединение = Новый HTTPСоединение(
ЧастиUrl.Сервер
, ЧастиUrl.Порт
,
,
,
,
,
);
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки = Заголовки;
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Возврат Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецФункции // ОтправитьHTTPЗапрос()
На стороне OneScript, создадим http-сервис (в нашем примере – runscript.os), обработчик которого, получает переданный объект JSON, и выполняет необходимый фрагмент кода.
Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
Ответ = Новый HTTPСервисОтвет(200);
Попытка
ДанныеЗапрос = JSON.Прочитать(Запрос.ПолучитьТелоКакСтроку());
Результат = Неопределено;
Параметры = ДанныеЗапрос["Параметры"];
Выполнить(ДанныеЗапрос["Скрипт"]);
ДанныеОтвет = Новый Соответствие;
ДанныеОтвет.Вставить("БылиОшибки", Ложь);
ДанныеОтвет.Вставить("Результат", Результат);
Исключение
Ошибка = ОписаниеОшибки();
ДанныеОтвет = Новый Соответствие;
ДанныеОтвет.Вставить("БылиОшибки", Истина);
ДанныеОтвет.Вставить("ОписаниеОшибки", Строка(Ошибка));
КонецПопытки;
Ответ.УстановитьТелоИзСтроки(JSON.Записать(ДанныеОтвет));
Возврат Ответ;
КонецФункции
Выполняемый фрагмент имеет доступ к переменной Параметры, которая представляет собой результат десериализации одноименного поля, передаваемого объекта JSON.
Возврат результатов, осуществляется присваиванием переменной Результат возвращаемого значения.
Возвращаемое значение, представляет собой объект JSON, который содержит информацию о наличии ошибок в процессе выполнения (поле БылиОшибки), а также информацию о возаращаемом значении (поле Результат), в случае успеха, или информацию об ошибке (поле ОписаниеОшибки), в случае ее возникновения. Данный объект может быть десериализован на стороне 1С:Предприятие для дальнейшего использования результатов выполнения.
Заключение
Вот таким вот нехитрым способом, практически за 10-15 минут, мы организовали динамическое выполнение фрагментов кода в среде OneScript.
Надеюсь, что данная статья поможет в создании нагруженных информационных систем, на основе платформы 1С:Предприятие.