Динамическое выполнение кода OneScript из 1С:Предприятие

03.11.18

Разработка - OneScript

В статье описан подход, позволяющий динамически выполнять фрагменты кода OneScript из 1С:Предприятие и получать результаты выполнения

Скачать файлы

Наименование Файл Версия Размер
Динамическое выполнение кода OneScript из 1С:Предприятие:
.cf 9,39Mb
8
.cf 9,39Mb 8 Скачать

Введение

Периодически возникают прикладные задачи, требующие от сервера приложений 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С:Предприятие.

OneScript http масштабирование высокая нагрузка

См. также

Особенности национального Workflow: Github Actions и OneScript

Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    1172    bayselonarrend    3    

35

TCP прокси-сервер хранилища конфигурации 1С

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    2772    kamisov    17    

57

Что такое ОСень? Или как лучшие практики из мира Java прижились в экосистеме OneScript

OneScript Бесплатно (free)

Думаете, на OneScript неудобно создавать сложные инфраструктурные приложения? Ошибаетесь. Благодаря фреймворку ОСень за последний год экосистема библиотек, упрощающих написание собственных приложений, существенно выросла. Расскажем о самых передовых технологиях OneScript. Спойлер: будет много рефлексии, мета-аннотаций, желудей, напильников и дубов с завязями.

21.11.2023    3111    NikitaIvanchenko    16    

46

Библиотека создания клиент-серверных приложений для сценарного языка OneScript

Инструментарий разработчика Работа с интерфейсом OneScript Россия Бесплатно (free)

Представленная библиотека позволяет создать многопоточный TCP сервер, к которому может одновременно подключиться множество TCP клиентов с удаленных компьютеров. Эти клиенты могут вызывать методы скриптов как на сервере, так и на других клиентах. Методы будут выполнены в контексте скрипта на удаленной машине. Возможна передача параметров в метод и получение результата. Для TCP клиента можно создать графический интерфейс с большим набором элементов управления, модальными диалоговыми окнами и с обработкой событий.

31.07.2023    2015    ahyahy    8    

32

Получаем статистику по git-репозиторию в разрезе разработчиков

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота! Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.

13.03.2023    3621    ardn    3    

27

Прокси хранилища 1С (IIS, OneScript)

Групповая разработка (Git, хранилище) OneScript DevOps и автоматизация разработки Платформа 1С v8.3 Россия Бесплатно (free)

Избавляемся от версионной зависимости, проверяем комментарии, вызываем веб-хуки, делаем красивые пути. И все это на привычном IIS и понятном OneScript.

08.12.2022    8036    kamisov    57    

95

OneScript на страже порядка на сервере тестовых баз данных

Администрирование СУБД OneScript Бесплатно (free)

Наводим порядок на сервере тестовых баз с помощью любимого инструмента - OneScript. Находим заброшенные базы на сервере MS SQL, определяем кандидатов на удаление.

14.06.2022    4255    ardn    23    

37

Идем в Serverless с кодом 1С

Облачные сервисы, хостинг OneScript Россия Абонемент ($m)

Запускаем код OneScript в Serverless Container Яндекса.

1 стартмани

29.04.2022    3696    1    papami    2    

9
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. zeegin 114 04.11.18 11:43 Сейчас в теме
А как тут с безопасностью?
Любой может исполнить произвольный код?
2. blackhole321 1303 04.11.18 13:40 Сейчас в теме
(1)Как таковые, http-сервисы OneScript, пока не предоставляют какого-либо функционала, связанного конкретно с безопасностью, однако Вы можете настроить безопасность на уровне web-сервера, в частности IIS имеет в этом плане богатые возможности, а также настроить ограничения на брандмауэре (Windows firewall with advanced features также имеет развитый функционал). Apache также имеет возможности по проверке подлинности и авторизации.
3. 🅵🅾️🆇 522 04.11.18 22:30 Сейчас в теме
Эм, если у вас настолько тяжелые операции, что их надо выносить на отдельное оборудование и не годится кейс "выполнить регламентным заданием пока все спят" - зачем исполнять такие вещи с помощью jit языков, а не взять плюсы/раст/го?
4. blackhole321 1303 05.11.18 08:15 Сейчас в теме
(3)
зачем исполнять такие вещи с помощью jit языков, а не взять плюсы/раст/го?

Ну конечно можно и так, только в среднем, ситуация развивается постепенно, и к моменту, когда встанет вопрос о масштабировании, в системе уже будет приличное количество функционала, написанного на 1С. В предлагаемом Вами варианте, его надо будет полностью переписать на плюсах/расте/го, вместо переноса выполнения в среду OneScript, что потенциально более затратно. Соответственно и все люди, учавствующие в разработке и дальнейшей поддержке/доработке такого решения также должны будут владеть этим языком программирования.
pallid; 🅵🅾️🆇; +2 Ответить
5. pallid 270 06.11.18 09:19 Сейчас в теме
наверное скоро начнут появляться вакансии, в которых будут требоваться 1Сники для инфроструктурных проектов ))))

на чистом os немного тяжко поднимать http сервис, быстрей это сделать на os.web
6. blackhole321 1303 06.11.18 09:32 Сейчас в теме
(5)
на чистом os немного тяжко поднимать http сервис, быстрей это сделать на os.web

Ctrl+C -> Ctrl+V. Полагаю, что это не очень тяжко :)
7. pallid 270 06.11.18 09:47 Сейчас в теме
(6) имел ввиду настройку https://infostart.ru/public/789679/ - как тут описано
9. blackhole321 1303 06.11.18 10:12 Сейчас в теме
(7)Ну дык это же установка и настройка web-сервера, причем для разработки и отладки.
8. pallid 270 06.11.18 09:49 Сейчас в теме
(6)неговоря уже о невиндоус ОС
10. blackhole321 1303 06.11.18 10:13 Сейчас в теме
(8)В невиндоус - еще проще, пяток команд по моему и это тоже установка web-сервера.
11. pallid 270 06.11.18 10:31 Сейчас в теме
(10) верю на слово, не пробовал )))) (т.е пробовал, но на 15 минут не смог победить, и забросил)

просто в os.web это
oscript.webhost.exe 


и все, и нет никаких настроек

но там паттерн приложения mvc (тут могу быть проблемы у людей)
12. blackhole321 1303 06.11.18 10:33 Сейчас в теме
(11)Тут как-бы есть свои ньюансы :)
просто в os.web это

И это уже служба?
Проверка подлинности, порты, доменные имена, url rewrite & reverse proxy etc.?
13. pallid 270 06.11.18 11:47 Сейчас в теме
(12)
И это уже служба?


нет, не служба

порт можно указать свой

остальное i don`t kwon ))) не изучал, не требовалось

но подозреваю что данную функциональность можно вынести вперед, до непосредственных сервисов.

вот как раз и хочется понять чем выгодней использовать os против os.web, и делать все эти манипуляции
14. blackhole321 1303 06.11.18 12:07 Сейчас в теме
(13)
нет, не служба

Значит надо писать скрипт, запускающий при старте системы и в случае с Windows дать права на старт as batch job.
Также наверное надо-бы установить .net core

порт можно указать свой

Порт я надеюсь не вшит в приложение и может быть сконфигурирован извне?

но подозреваю что данную функциональность можно вынести вперед, до непосредственных сервисов

Ну типа того. Так и поступают в продуктиве, интегрируют с IIS или Apache, ngix etc.
Я собсно к тому, что .net core web application не заменяет web-сервер и его придется таки устанавливать и настраивать, кроме простых интранетных случаев.

вот как раз и хочется понять чем выгодней использовать os против os.web, и делать все эти манипуляции

Смотря для каких целей.
Вы для какой практической задачи (или класса задач) сравниваете?
Где-то достаточно $listener = new-object System.Net.HttpListener ... $listener.Start(), а где-то нет
15. pallid 270 06.11.18 12:21 Сейчас в теме
(14)
Порт я надеюсь не вшит в приложение и может быть сконфигурирован извне?


Да, его можно задать переменной окружения

Вы для какой практической задачи (или класса задач) сравниваете?


пока только в качестве небольших слабосвязанных как либо сервисов, в своем интранете

Где-то достаточно $listener = new-object System.Net.HttpListener ... $listener.Start(), а где-то нет


вот хотелось бы как раз посмотреть как и для чего готовят такое
16. blackhole321 1303 06.11.18 12:31 Сейчас в теме
Да, его можно задать переменной окружения

А два экземпляра на разных портах как ?

вот хотелось бы как раз посмотреть как и для чего готовят такое

Не понял, что Вы имеете ввиду?

пока только в качестве небольших слабосвязанных как либо сервисов, в своем интранете


Ну тогда имеет смысл использовать то, что удобнее, привычнее, то, чем лучше владеете, т.к. все более/менее современные технологии обеспечивают некий минимум, который я думаю покрывает подавляющее большинство простых задач.
17. pallid 270 06.11.18 12:52 Сейчас в теме
(16)
А два экземпляра на разных портах как ?


в видноус да, в докер не пробовал (ну понятно почему)

Не понял, что Вы имеете ввиду?


раньше считал что лучше поднять для 1С apache и не напрягаться с IIS, нет тебе ковыряний после обновления платформы и т.п

потом прочитал, что сами 1С вроде как рекомендуют использовать именно IIS, тем более в x64

сам не пробовал, не имею опыт именно в эксплуатации, и со всеми проблемами с которыми можно столкнуться (проблемы транспорта, в чей власти сеть и т.п)

просто как то так сложилось, что не особо положительно к IIS
18. blackhole321 1303 06.11.18 13:11 Сейчас в теме
(17)
в видноус да

Да - можно или Да - нельзя :) ?

что не особо положительно к IIS

Нормальный web-сервер с хорошим функционалом и штатно из коробки.
Если Вы платите деньги за систему, почему-бы не использовать имеющиеся возможности по максимуму?
19. pallid 270 06.11.18 13:56 Сейчас в теме
(18)
Если Вы платите деньги за систему, почему-бы не использовать имеющиеся возможности по максимуму?


согласен, надо попробовать основательно разобраться в этом...

Да - можно или Да - нельзя :) ?


Да, можно
Оставьте свое сообщение