Конструктор не найден (ТурбоКонф)

tormozit Закрыто

Много раз уже видел такую ошибку на последней версии Турбоконфа

ScriptEngine.Machine.RuntimeException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 11002 / Конструктор не найден (ТурбоКонф)}
ТурбоКонф = Новый ("ТурбоКонф");
---> ScriptEngine.Machine.RuntimeException: {Модуль / Ошибка в строке: -1 / Тип не зарегистрирован (ТурбоКонф)}

в ScriptEngine.Machine.StandartTypeManager.GetTypeByName(String name)
в ScriptEngine.Machine.TypeManager.GetFactoryFor(String typeName)
--- Конец трассировки внутреннего стека исключений ---
в ScriptEngine.Machine.TypeManager.GetFactoryFor(String typeName)
в ScriptEngine.Machine.MachineInstance.NewFunc(Int32 argCount)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
в ScriptEngine.Machine.MachineInstance.ExecuteCode()
в ScriptEngine.Machine.MachineInstance.ExecuteModuleBody(IRunnable sdo)
в ScriptEngine.Machine.Contexts.UserScriptContextInstance.OnInstanceCreation()
в TurboConf.HostApplication.HostApplicationForm.ExecuteScript(Script script, Keys ctrl, Keys alt, Keys shift, ScreenForm statusForm, String entryPoint, ScriptOptions options, IVariable[] parameters)

Ссылка скрыта

Комментарии

bolsun
#1, ред. 03 октября 2025 09:27

В этой версии я вызываю некоторые обработчики без локера (обработчик ИИ и выбора значения).
Ошибка происходит из-за того, что OneScript не поддерживает несколько одновременных вызовов, т.к. использует статические поля и затирает текущий контекст уже исполняемого обработчика.
Значит вариант с асинхронным вызовом обработчиков не будет работать, поэтому все таки придется все обработчики вызывать в порядке очереди.
Это приведет к тому, что обработчик ПриВыполнениииЗапросаИИ будет блокировать все остальные обработчики, пока не завершится.


bolsun
#2, 03 октября 2025 09:31

Вариант решения пока один - опять выстраивать все обработчики в очередь. Запрос к ИИ выполнять уже на стороне ТурбоКонф, после завершения обработчика, чтобы не держать очередь. Скрипт должен передавать заголовки и тело запроса.


tormozit
#3, 03 октября 2025 09:33

(2) bolsun, Тогда нужно еще второе событие ПриПолученииОтветаИИ


bolsun
#4, ред. 03 октября 2025 11:54

(3) tormozit, сколько по времени может занимать выполнение обработчика ПриВыполненииЗапросаИИ на твоей стороне? Это важно, т.к. он будет блокировать выполнение обработчиков ПриАктивизацииСтроки.
Если это может занимать продолжительное время, возможно стоит добавить файл признак, по аналогии t9.lck, что необходимо срочно прервать выполнение расчета.


bolsun
#5, 03 октября 2025 11:55

Ну и t9.lck конечно тоже нужно отслеживать иначе это заблокирует вставку.


bolsun
#6, ред. 03 октября 2025 11:57

(4) таким образом обработчики ИИ будут выполнятся только в свободное время, а если пользователь захочет это ускорить он может встать на строку ИИ и дождаться ответа.

Опять же если расчет занимает немного времени это будет излишним.


tormozit
#7, ред. 03 октября 2025 14:21

(4) bolsun, чисто мой код до 100мс + выполнение хттп запроса до 1500мс. Сервер Напарника асинхронный режим запроса не предоставляет. Поэтому вежливо прервать ожидание ответа сервера невозможно.


bolsun
#8, ред. 03 октября 2025 15:35

6.5.9407.31492

https://disk.yandex.ru/d/XRPUNWQtrbwBUw

  • Все обработчики опять выполняются в порядке очереди.

API

Процедура ПриВыполненииЗапросаИИТ9(Параметры, Отказ, СтандартнаяОбработка)
	
	Параметры.Адрес = "https://code.1c.ai/api/v1/create_session";

	ЗаголовкиНапарника = Новый Соответствие;
	//ЗаголовкиНапарника.Вставить("Content-Type", "application/json"); //Не нужно, будет установлено автоматически
	ЗаголовкиНапарника.Вставить("Authorization", КлючНапарника);
	ЗаголовкиНапарника.Вставить("Unique-Id", ...);

	Параметры.Заголовки = ЗаголовкиНапарника;

	//Формируем тело запроса
	//...	

	Параметры.ТелоЗапроса = ТелоЗапросаСтрока;	
	
КонецПроцедуры

Процедура ПослеВыполненияЗапросаИИТ9(Параметры, Отказ, СтандартнаяОбработка)
	
	Если Параметры.КодСостояния <> 200 Тогда
		Сообщить("Ошибка " + Параметры.КодСостояния + " подключения: " + Параметры.Причина, СтатусСообщения.ОченьВажное);
		Отказ = Истина;
		Возврат;		
	КонецЕсли;
	
	Сообщить("Ответ сервера:" + Параметры.ТелоОтвета);
	
	//Резбираем JSON ответ Параметры.ТелоОтвета
	//...
	Параметры.Ответ = "Работает!";

	Параметры.ФорматироватьТекст = Истина;

КонецПроцедуры


tormozit
#9, 03 октября 2025 18:44

Тяжело без отладки понять такое.
AITimerOnTick System.InvalidOperationException: Неправильное имя заголовка. Убедитесь, что заголовки запросов используются с HttpRequestMessage, заголовки ответов — с HttpResponseMessage, а заголовки содержимого — с объектами HttpContent.
в System.Net.Http.Headers.HttpHeaders.CheckHeaderName(String name)
в System.Net.Http.Headers.HttpHeaders.Add(String name, String value)
в TurboConf.Service.NewT9Form.'iTpJTx?b{//oo(2n1TSscJI%.MoveNext()

	 	Заголовки.Вставить("Authorization", КлючСервисаНапарник);
	Заголовки.Вставить("Content-Type", "application/json"); 
	Заголовки.Вставить("Unique-Id", Контекст.ИдентификаторКомпьютера);
	Заголовки.Вставить("Session-Id", Контекст.Сессия);


bolsun
#10, 03 октября 2025 19:26

(9) tormozit, сверь код с примером или пришли полный

	ЗаголовкиНапарника = Новый Соответствие;
	//ЗаголовкиНапарника.Вставить("Content-Type", "application/json"); //Не нужно, будет установлено автоматически
	ЗаголовкиНапарника.Вставить("Authorization", КлючНапарника);
	ЗаголовкиНапарника.Вставить("Unique-Id", ...);


tormozit
#11, 03 октября 2025 21:13

Ты написал расплывчато
//ЗаголовкиНапарника.Вставить("Content-Type", "application/json"); //Не нужно, будет установлено автоматически
А нужно было написать
//Нельзя устанавливать этот заголовок, т.к. он будет конфликтовать с устанавливаемым автоматически


tormozit
#12, ред. 03 октября 2025 21:14

(11) @bolsun В связи с этим прошу в Турбоконфе удалять этот заголовок или выдавать понятную ошибку.


tormozit
#13, 04 октября 2025 00:23

Если в обработчике ПриВыполненииЗапросаИИТ9 сразу выполнить ВОзврат, то возникает ошибка

AITimerOnTick System.InvalidOperationException: Указан недопустимый URI запроса. URI запроса должен быть абсолютным URI, или необходимо задать BaseAddress.
в System.Net.Http.HttpClient.PrepareRequestMessage(HttpRequestMessage request)
в System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
в System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
в TurboConf.Service.NewT9Form.'iTpJTx?b{//oo(2n1TSscJI%.MoveNext()


bolsun
#14, 04 октября 2025 00:26

(13) tormozit, используй Отказ = Истина.


tormozit
#15, 04 октября 2025 00:29

(14) bolsun, чем в этих обработчиках отличается
СтандартнаяОбработка = Ложь
от
Отказ = Истина
?


bolsun
#16, 04 октября 2025 00:35

(15) tormozit, Отказ = Истина - обработка запроса к ИИ прервется.
СтандартнаяОбработка = Ложь - запрос к серверу не будет выполнен, но следующие обработчики выполнятся.


tormozit
#17, 04 октября 2025 17:18

(14) bolsun, проверил. Такая же ошибка

AITimerOnTick System.InvalidOperationException: Указан недопустимый URI запроса. URI запроса должен быть абсолютным URI, или необходимо задать BaseAddress.
в System.Net.Http.HttpClient.PrepareRequestMessage(HttpRequestMessage request)
в System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
в System.Net.Http.HttpClient.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
в TurboConf.Service.NewT9Form.'iTpJTx?b{//oo(2n1TSscJI%.MoveNext()


tormozit
#18, ред. 05 октября 2025 00:31

Исходная ошибка вернулась

ScriptEngine.Machine.RuntimeException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 11072 / Конструктор не найден (ТурбоКонф)}
ТурбоКонф = Новый ("ТурбоКонф");
---> ScriptEngine.Machine.RuntimeException: {Модуль / Ошибка в строке: -1 / Тип не зарегистрирован (ТурбоКонф)}

в ScriptEngine.Machine.StandartTypeManager.GetTypeByName(String name)
в ScriptEngine.Machine.TypeManager.GetFactoryFor(String typeName)
--- Конец трассировки внутреннего стека исключений ---
в ScriptEngine.Machine.TypeManager.GetFactoryFor(String typeName)
в ScriptEngine.Machine.MachineInstance.NewFunc(Int32 argCount)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
в ScriptEngine.Machine.MachineInstance.ExecuteCode()
в ScriptEngine.Machine.MachineInstance.ExecuteModuleBody(IRunnable sdo)
в ScriptEngine.Machine.Contexts.UserScriptContextInstance.OnInstanceCreation()
в TurboConf.HostApplication.HostApplicationForm.ExecuteScript(Script script, Keys ctrl, Keys alt, Keys shift, ScreenForm statusForm, String entryPoint, ScriptOptions options, IVariable[] parameters)

Ссылка скрыта


bolsun
#19, 05 октября 2025 00:39

(18) tormozit, ошибка возникает в другом месте.

ScriptEngine.Machine.RuntimeException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 11072

Не удалось выполнить скрипт ИРАдаптер->ПриОткрытииОкна

OneScript не поддерживает асинхронные вызовы.
Каждый вызов обработчика в T9, затирает контекст.

Что с этим делать пока не знаю.


bolsun
#20, ред. 05 октября 2025 00:42

Только не понятно что делал обработчик ИР ПриОткрытииОкна, в момент вызова ПриАктивизацииСтрокиТ9 или ПриВыполненииЗапросаИИТ9. Там появилось окно Конфигуратор


bolsun
#21, 05 октября 2025 00:45

Возможно подсказка была закрыта и мне требуется отменять все накопленные обработчики. В данный момент я их отменяю только при вставке.


bolsun
#22, 05 октября 2025 00:47

Почему разработчки OneScript сделали весь контекст статическим, до сих пор удивляюсь.


tormozit
#23, 05 октября 2025 09:48

(18) tormozit, больше не появлялась, т.е. после исправления только один раз появилась. Видимо какое то редкое сочетание условий нужно. Исходно она появлялась довольно часто.


bolsun
#24, ред. 05 октября 2025 13:27

(19) воспроизвел ошибку, она возникала если были накоплены обработчики и при открытой подсказке вызывалось Ctrl+S. В случае появления окна "Конфигуратор" об ошибке срабатывал обработчик ПриОткрытииОкна, но его контекст затирал следующий обработчик из очереди. Добавлю отмену очереди при скрытии подсказки.


bolsun
#25, 05 октября 2025 14:06

6.5.9409.28703

Критические изменения!
ПриВыполненииЗапросаИИТ9 теперь ПриОтправкеЗапросаИИT9
ПослеВыполненияЗапросаИИТ9 теперь ПриПолученииОтветаИИТ9

  • Накопленные вызовы обработчиков теперь отменяются при скрытии подсказки.
  • Обработчик ПриПолученииОтветаИИТ9 теперь не выполняется в случае если в обработчике ПриОтправкеЗапросаИИT9 произошли ошибки.
  • Добавил новые обработчики в список окна "Методы модуля"

https://disk.yandex.ru/d/XRPUNWQtrbwBUw


bolsun
#26, 05 октября 2025 14:18

Добавлены различные отсутствующие обработчики
t9_script_events.t9t


tormozit
#27, 05 октября 2025 14:31

(26) bolsun, что делать с этим файлом? Почему ты его отдельно выложил? У меня его нет в папке Турбоконфа.


bolsun
#28, ред. 05 октября 2025 14:39

(27) tormozit, нет в templates?


tormozit
#29, 05 октября 2025 14:41

(28) bolsun, да есть. Теперь заменил файл.


tormozit
#30, 01 декабря 2025 08:22

tormozit изменил статус на Закрыто


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера