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

03.11.18

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Динамическое выполнение кода OneScript из 1С:Предприятие:
.cf 9,39Mb
8
8
1 SM
Скачать Купить за 1 850 руб.

Введение

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

См. также

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

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    2420    vkrivov@yandex.ru    8    

18

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    3909    bayselonarrend    2    

60

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2441    bayselonarrend    18    

70

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

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

25.03.2024    2052    bayselonarrend    3    

41

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

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

17.01.2024    3958    kamisov    21    

62

OneScript Программист Бесплатно (free)

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

21.11.2023    3748    NikitaIvanchenko    16    

48

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

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

31.07.2023    2349    ahyahy    8    

32

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

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

13.03.2023    4622    ardn    3    

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

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

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

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

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


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

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

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


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

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

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

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

вот как раз и хочется понять чем выгодней использовать os против os.web, и делать все эти манипуляции
14. blackhole321 1310 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 272 06.11.18 12:21 Сейчас в теме
(14)
Порт я надеюсь не вшит в приложение и может быть сконфигурирован извне?


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

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


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

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


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

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

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

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

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


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


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

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


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

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

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

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

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

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

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


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

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


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