[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `мСценСкрипт_ОбработатьТипУзла`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура мСценСкрипт_ОбработатьТипУзла(Узел,ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,мПараметрыКлиентСервер)
Экспорт

	Если ЗначениеЗаполнено(Узел.ИмяПеременной) И НЕ мПараметрыКлиент.Свойство(Узел.ИмяПеременной) Тогда
		мПараметрыКлиент.Вставить(Узел.ИмяПеременной,Неопределено);
	КонецЕсли;

	ТекущаяПеременная = Неопределено;
	РодительПеременная = Неопределено;
	PID 				= 0;

	Если ТекущийAPI = "1cClientApp" ИЛИ ТекущийAPI="" Тогда
		Если ЗначениеЗаполнено(Узел.ИмяПеременной) Тогда
			ТекущаяПеременная = мПараметрыКлиент[Узел.ИмяПеременной];
			Если ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
				Если НЕ Узел.ПолучитьРодителя()=Неопределено Тогда
					Если ЗначениеЗаполнено(Узел.ПолучитьРодителя().ИмяПеременной) Тогда
						РодительПеременная = мПараметрыКлиент[Узел.ПолучитьРодителя().ИмяПеременной];
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	// Текущий api, меняется только при смене подключения
	//TODO: отрефакторить кусок по переключению API
	//Если (Узел.Действие="ПодключитьТестируемоеПриложение" ИЛИ Узел.Действие="GenerateClientConnectionScript") Тогда
		Если ЗначениеЗаполнено(Узел.API) Тогда
			ТекущийAPI = Узел.API;
		Иначе
			ТекущийAPI = "1cClientApp"; // по дефолту 1С api
		КонецЕсли;
	//КонецЕсли;

	ПараметрыТекущегоПриложения = мСценСкрипт_ПолучитьПараметрыТекущегоПриложения(Узел);
	PID = ПараметрыТекущегоПриложения.PID;
	Если ТипЗнч(PID)=Тип("Число") Тогда
		PID = Формат(PID,"ЧГ=;");
	Иначе
		PID = СтрЗаменить(PID," ","" );
	КонецЕсли;

	// Определеим стратегию вывода
	ТекущийМодульОбработки = Неопределено;

	Если ТекущийAPI = "1cClientApp" Тогда
		ТекущийМодульОбработки = Модуль_ОбработкаДействий;

		Если НЕ ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
			// попробуем получить по переменной родителя
			Если Узел.Свойство("РодительИмяПеременной")
				И ЗначениеЗаполнено(Узел.РодительИмяПеременной)
				И мПараметрыКлиент.Свойство(Узел.РодительИмяПеременной) Тогда
				РодительПеременная = мПараметрыКлиент[Узел.РодительИмяПеременной];
			КонецЕсли;
			Если РодительПеременная=Неопределено Тогда
				// Переопределим родитель переменная по текущему окну или объекту
				Если Узел.Действие="НайтиОсновноеОкно" Тогда
					РодительПеременная = ТестовоеПриложение;
				ИначеЕсли Узел.Действие="НайтиФорму" ИЛИ Узел.Действие="FindForm"
					ИЛИ	Узел.Действие = "ПолучитьКомандныйИнтерфейс" ИЛИ Узел.Действие = "GetCommandInterface"
					//ИЛИ	Узел.Действие = "НайтиОбъект" ИЛИ Узел.Действие = "FindObject"
					Тогда
					РодительПеременная = ТекущийМодульОбработки.ПолучитьТекущееОкно(ТекущийНомерПорта);
				Иначе
					РодительПеременная = ТекущийМодульОбработки.ПолучитьТекущийОбъект(ТекущийНомерПорта);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;

	ИначеЕсли ТекущийAPI = "AutomationUI" Тогда
		ТекущийМодульОбработки = Модуль_ОбработкаДействийAutomationUI;
	ИначеЕсли ТекущийAPI = "Selenium" Тогда
		ТекущийМодульОбработки = Модуль_ОбработкаДействийSelenium;
	Иначе
		ВызватьИсключение "Неподдерживаемый API";
	КонецЕсли;

	// состав данных
	Наименование 		= Узел.Наименование;
	ЗаголовокОбъекта 	= Узел.ЗаголовокОбъекта;
	OutputText 			= Узел.OutputText;
	Presentation		= Узел.Presentation;
	ИмяОбъекта			= Узел.ИмяОбъекта;
	Area				= Узел.Area;
	CommandRef			= Узел.CommandRef;
	ИмяКлассаОбъекта	= Узел.ИмяКлассаОбъекта;
	FileName 			= Узел.FileName;
	mKey 				= Узел.Key;
	xPath				= Узел.xPath;

	мСценСкрипт_ПодставитьЗначениеПараметра(Наименование);
	мСценСкрипт_ПодставитьЗначениеПараметра(ИмяОбъекта);
	мСценСкрипт_ПодставитьЗначениеПараметра(ЗаголовокОбъекта);
	мСценСкрипт_ПодставитьЗначениеПараметра(OutputText);
	мСценСкрипт_ПодставитьЗначениеПараметра(Presentation);
	мСценСкрипт_ПодставитьЗначениеПараметра(Area);
	мСценСкрипт_ПодставитьЗначениеПараметра(CommandRef);
	мСценСкрипт_ПодставитьЗначениеПараметра(ИмяКлассаОбъекта);
	мСценСкрипт_ПодставитьЗначениеПараметра(FileName);
	мСценСкрипт_ПодставитьЗначениеПараметра(mKey);
	Если ЗначениеЗаполнено(xPath) И Найти(xPath,"&") Тогда
		мСценСкрипт_ПодставитьЗначениеПараметра(xPath);
	КонецЕсли;

	// Сформируем универсальную структуру передачи данных
	мПараметры = новый Структура();
	// для ПодключитьТестируемоеПриложение
	мПараметры.Вставить("ИмяПеременной",Узел.ИмяПеременной);
	мПараметры.Вставить("ИмяПеременнойРодителя","");
	Если ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
		Если НЕ Узел.ПолучитьРодителя()=Неопределено Тогда
			мПараметры.ИмяПеременнойРодителя = Узел.ПолучитьРодителя().ИмяПеременной;
		КонецЕсли;
	КонецЕсли;
	мПараметры.Вставить("СвойстваПодключенияКлиентаТестирования",Узел.СвойстваПодключенияКлиентаТестирования);
	мПараметры.Вставить("ПараметрыСценария",ПараметрыСценария);
	мПараметры.Вставить("НомерПорта",Объект.НомерПорта);
	мПараметры.Вставить("Интервал",Узел.Интервал);
	мПараметры.Вставить("ТекущийНомерПорта",ТекущийНомерПорта);
	// для ЗакрытьТестируемоеПриложение
	// для НайтиОсновноеОкно
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("PID",PID);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	// для НайтиОкно
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("PID",PID);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	// для НайтиОбъект
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("ТипОбъекта",Узел.ТипОбъекта);
	мПараметры.Вставить("РодительПеременная",РодительПеременная);
	мПараметры.Вставить("ИмяОбъекта",ИмяОбъекта);
	мПараметры.Вставить("ИмяКлассаОбъекта",ИмяКлассаОбъекта);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	мПараметры.Вставить("ИдентификаторОбъекта",Узел.ИдентификаторОбъекта);
	мПараметры.Вставить("Attribute",Узел.Attribute);
	мПараметры.Вставить("ОдинУровеньВниз",Узел.ОдинУровеньВниз);
	// для Команда
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("ИмяКоманды",Узел.Команда);
	мПараметры.Вставить("ТипОбъекта",Узел.ТипОбъекта);
	мПараметры.Вставить("OutputText",OutputText);
	мПараметры.Вставить("CommandRef",CommandRef);
	мПараметры.Вставить("Presentation",Presentation);
	мПараметры.Вставить("Direction",Узел.Direction);
	мПараметры.Вставить("RowDescription",Узел.RowDescription);
	мПараметры.Вставить("SwitchSelection",Узел.SwitchSelection);
	мПараметры.Вставить("Cancel",Узел.Cancel);
	мПараметры.Вставить("Area",Area);
	мПараметры.Вставить("ИмяПараметра",Узел.ИмяПараметра);
	мПараметры.Вставить("ЗначениеПараметра",Узел.ЗначениеПараметра);
	мПараметры.Вставить("ПараметрыСценария",ПараметрыСценария);
	мПараметры.Вставить("ClickX",Узел.ClickX);
	мПараметры.Вставить("ClickY",Узел.ClickY);
	мПараметры.Вставить("xPath",xPath);
	мПараметры.Вставить("Интервал",Узел.Интервал);
	// для НайтиФорму
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	// для запросов
	мПараметры.Вставить("НомерПортаExternAutomationUI",Объект.НомерПортаExternAutomationUI);
	мПараметры.Вставить("АдресИнтернетExternAutomationUI",Объект.АдресИнтернетExternAutomationUI);
	// представление данных
	мПараметры.Вставить("ПредставлениеДанных",Узел.ПредставлениеДанных);
	мПараметры.Вставить("ИмяПараметра",Узел.ИмяПараметра);
	мПараметры.Вставить("ИмяПараметра2",Узел.ИмяПараметра2);
	мПараметры.Вставить("ЗначениеПараметра",Узел.ЗначениеПараметра);
	// сравнить с представлением
	мПараметры.Вставить("УсловиеСравнения",Узел.УсловиеСравнения);

	мПараметры.Вставить("Key",mKey);
	мПараметры.Вставить("Type",Узел.Type);
	мПараметры.Вставить("FileName",FileName);
	мПараметры.Вставить("TurnToCommentInBlock",Узел.TurnToCommentInBlock);

	// параметры подключения по умолчанию
	ПараметрыПодключенияПоУмолчанию = новый Структура();
	ПараметрыПодключенияПоУмолчанию.Вставить("ПутьКФайлуСценария",Объект.ПутьКФайлуСценария);
	ПараметрыПодключенияПоУмолчанию.Вставить("СтрокаПодключения",Объект.ПутьПодключенияКлиентаТестирования);
	ПараметрыПодключенияПоУмолчанию.Вставить("ДополнительныеОпцииЗапуска",Объект.ДополнительныеОпцииЗапуска);
	ПараметрыПодключенияПоУмолчанию.Вставить("ЭтоФайловаяБаза",Объект.ФайловаяБаза);
	ПараметрыПодключенияПоУмолчанию.Вставить("Пользователь1С",Объект.Пользователь1С);
	ПараметрыПодключенияПоУмолчанию.Вставить("Пароль1С",Объект.Пароль1С);
	ПараметрыПодключенияПоУмолчанию.Вставить("НомерПорта",Объект.НомерПорта);
	ПараметрыПодключенияПоУмолчанию.Вставить("ПутьКИсполняемомуФайлу1С",Объект.ПутьКИсполняемомуФайлу1С);
	мПараметры.Вставить("ПараметрыПодключенияПоУмолчанию",ПараметрыПодключенияПоУмолчанию);

	Если Узел.Действие="ПодключитьТестируемоеПриложение" ИЛИ Узел.Действие="GenerateClientConnectionScript" Тогда

		ТекущийМодульОбработки.мСценСкрипт_GenerateClientConnection(ТестовоеПриложение, ОписаниеОшибки, мПараметры);
		ТекущийНомерПорта = мПараметры.ТекущийНомерПорта;

	ИначеЕсли Узел.Действие="GenerateClientDisconnectionScript" ИЛИ Узел.Действие="ЗакрытьТестируемоеПриложение" Тогда

		ТекущийМодульОбработки.мСценСкрипт_GenerateClientDisconnection(ТестовоеПриложение, ОписаниеОшибки, мПараметры);

	ИначеЕсли Узел.Действие = "Стоп" Тогда

		ТестЗапущен = Ложь;
		ИндексТекущегоШага = 0;
		ПройтиПоУзлуУстновкаЭлементаВниз(ДеревоСценария,"РезультатВыполнения","");

	ИначеЕсли Узел.Действие = "ВызватьИсключение" ИЛИ Узел.Действие = "ThrowExeption" Тогда

		ВызватьИсключение OutputText;

	ИначеЕсли Узел.Действие = "СделатьСнимокОкна" ИЛИ Узел.Действие = "MakeScreenShot" Тогда

	ИначеЕсли Узел.Действие = "Пауза" Тогда

		РучнойРежим = Истина;

	ИначеЕсли Узел.Действие = "ПолучитьПредставлениеДанных" Тогда

		ТекущийМодульОбработки.мСценСкрипт_ПолучитьПредставлениеДанных(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная,мПараметры,ПараметрыСценария);

		Узел.ПредставлениеДанных = мПараметры.ПредставлениеДанных;
		Узел.ЗначениеПараметра = мПараметры.ЗначениеПараметра;

	ИначеЕсли Узел.Действие = "СравнитьСПредставлениемДанных" ИЛИ Узел.Действие = "Assert" Тогда

		ТекущийМодульОбработки.мСценСкрипт_СравнитьСПредставлениемДанных(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная,мПараметры,ПараметрыСценария);

		Узел.ПредставлениеДанных = мПараметры.ПредставлениеДанных;

	ИначеЕсли Узел.Действие="ВыполнитьПроизвольныйКодКлиент" ИЛИ Узел.Действие="ExecuteCustomCodeClient" Тогда

		мСценСкрипт_ExecuteCustomCodeClient(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,мПараметрыКлиентСервер,Узел.CustomCodeClient);

	ИначеЕсли Узел.Действие="ВыполнитьПроизвольныйКодСервер" ИЛИ Узел.Действие="ExecuteCustomCodeServer" Тогда

		мСценСкрипт_ExecuteCustomCodeServer(ОписаниеОшибки,мПараметрыКлиентСервер,Узел.CustomCodeServer);
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура мСценСкрипт_ОбработатьТипУзла(Узел,ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,мПараметрыКлиентСервер)  Экспорт

	Если ЗначениеЗаполнено(Узел.ИмяПеременной) И НЕ мПараметрыКлиент.Свойство(Узел.ИмяПеременной) Тогда
		мПараметрыКлиент.Вставить(Узел.ИмяПеременной,Неопределено);
	КонецЕсли;

	ТекущаяПеременная = Неопределено;
	РодительПеременная = Неопределено;
	PID 				= 0;

	Если ТекущийAPI = "1cClientApp" ИЛИ ТекущийAPI="" Тогда
		Если ЗначениеЗаполнено(Узел.ИмяПеременной) Тогда
			ТекущаяПеременная = мПараметрыКлиент[Узел.ИмяПеременной];
			Если ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
				Если НЕ Узел.ПолучитьРодителя()=Неопределено Тогда
					Если ЗначениеЗаполнено(Узел.ПолучитьРодителя().ИмяПеременной) Тогда
						РодительПеременная = мПараметрыКлиент[Узел.ПолучитьРодителя().ИмяПеременной];
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	// Текущий api, меняется только при смене подключения
	//TODO: отрефакторить кусок по переключению API
	//Если (Узел.Действие="ПодключитьТестируемоеПриложение" ИЛИ Узел.Действие="GenerateClientConnectionScript") Тогда
		Если ЗначениеЗаполнено(Узел.API) Тогда
			ТекущийAPI = Узел.API;
		Иначе
			ТекущийAPI = "1cClientApp"; // по дефолту 1С api
		КонецЕсли;
	//КонецЕсли;

	ПараметрыТекущегоПриложения = мСценСкрипт_ПолучитьПараметрыТекущегоПриложения(Узел);
	PID = ПараметрыТекущегоПриложения.PID;
	Если ТипЗнч(PID)=Тип("Число") Тогда
		PID = Формат(PID,"ЧГ=;");
	Иначе
		PID = СтрЗаменить(PID," ","" );
	КонецЕсли;

	// Определеим стратегию вывода
	ТекущийМодульОбработки = Неопределено;

	Если ТекущийAPI = "1cClientApp" Тогда
		ТекущийМодульОбработки = Модуль_ОбработкаДействий;

		Если НЕ ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
			// попробуем получить по переменной родителя
			Если Узел.Свойство("РодительИмяПеременной")
				И ЗначениеЗаполнено(Узел.РодительИмяПеременной)
				И мПараметрыКлиент.Свойство(Узел.РодительИмяПеременной) Тогда
				РодительПеременная = мПараметрыКлиент[Узел.РодительИмяПеременной];
			КонецЕсли;
			Если РодительПеременная=Неопределено Тогда
				// Переопределим родитель переменная по текущему окну или объекту
				Если Узел.Действие="НайтиОсновноеОкно" Тогда
					РодительПеременная = ТестовоеПриложение;
				ИначеЕсли Узел.Действие="НайтиФорму" ИЛИ Узел.Действие="FindForm"
					ИЛИ	Узел.Действие = "ПолучитьКомандныйИнтерфейс" ИЛИ Узел.Действие = "GetCommandInterface"
					//ИЛИ	Узел.Действие = "НайтиОбъект" ИЛИ Узел.Действие = "FindObject"
					Тогда
					РодительПеременная = ТекущийМодульОбработки.ПолучитьТекущееОкно(ТекущийНомерПорта);
				Иначе
					РодительПеременная = ТекущийМодульОбработки.ПолучитьТекущийОбъект(ТекущийНомерПорта);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;

	ИначеЕсли ТекущийAPI = "AutomationUI" Тогда
		ТекущийМодульОбработки = Модуль_ОбработкаДействийAutomationUI;
	ИначеЕсли ТекущийAPI = "Selenium" Тогда
		ТекущийМодульОбработки = Модуль_ОбработкаДействийSelenium;
	Иначе
		ВызватьИсключение "Неподдерживаемый API";
	КонецЕсли;

	// состав данных
	Наименование 		= Узел.Наименование;
	ЗаголовокОбъекта 	= Узел.ЗаголовокОбъекта;
	OutputText 			= Узел.OutputText;
	Presentation		= Узел.Presentation;
	ИмяОбъекта			= Узел.ИмяОбъекта;
	Area				= Узел.Area;
	CommandRef			= Узел.CommandRef;
	ИмяКлассаОбъекта	= Узел.ИмяКлассаОбъекта;
	FileName 			= Узел.FileName;
	mKey 				= Узел.Key;
	xPath				= Узел.xPath;

	мСценСкрипт_ПодставитьЗначениеПараметра(Наименование);
	мСценСкрипт_ПодставитьЗначениеПараметра(ИмяОбъекта);
	мСценСкрипт_ПодставитьЗначениеПараметра(ЗаголовокОбъекта);
	мСценСкрипт_ПодставитьЗначениеПараметра(OutputText);
	мСценСкрипт_ПодставитьЗначениеПараметра(Presentation);
	мСценСкрипт_ПодставитьЗначениеПараметра(Area);
	мСценСкрипт_ПодставитьЗначениеПараметра(CommandRef);
	мСценСкрипт_ПодставитьЗначениеПараметра(ИмяКлассаОбъекта);
	мСценСкрипт_ПодставитьЗначениеПараметра(FileName);
	мСценСкрипт_ПодставитьЗначениеПараметра(mKey);
	Если ЗначениеЗаполнено(xPath) И Найти(xPath,"&") Тогда
		мСценСкрипт_ПодставитьЗначениеПараметра(xPath);
	КонецЕсли;

	// Сформируем универсальную структуру передачи данных
	мПараметры = новый Структура();
	// для ПодключитьТестируемоеПриложение
	мПараметры.Вставить("ИмяПеременной",Узел.ИмяПеременной);
	мПараметры.Вставить("ИмяПеременнойРодителя","");
	Если ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
		Если НЕ Узел.ПолучитьРодителя()=Неопределено Тогда
			мПараметры.ИмяПеременнойРодителя = Узел.ПолучитьРодителя().ИмяПеременной;
		КонецЕсли;
	КонецЕсли;
	мПараметры.Вставить("СвойстваПодключенияКлиентаТестирования",Узел.СвойстваПодключенияКлиентаТестирования);
	мПараметры.Вставить("ПараметрыСценария",ПараметрыСценария);
	мПараметры.Вставить("НомерПорта",Объект.НомерПорта);
	мПараметры.Вставить("Интервал",Узел.Интервал);
	мПараметры.Вставить("ТекущийНомерПорта",ТекущийНомерПорта);
	// для ЗакрытьТестируемоеПриложение
	// для НайтиОсновноеОкно
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("PID",PID);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	// для НайтиОкно
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("PID",PID);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	// для НайтиОбъект
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("ТипОбъекта",Узел.ТипОбъекта);
	мПараметры.Вставить("РодительПеременная",РодительПеременная);
	мПараметры.Вставить("ИмяОбъекта",ИмяОбъекта);
	мПараметры.Вставить("ИмяКлассаОбъекта",ИмяКлассаОбъекта);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	мПараметры.Вставить("ИдентификаторОбъекта",Узел.ИдентификаторОбъекта);
	мПараметры.Вставить("Attribute",Узел.Attribute);
	мПараметры.Вставить("ОдинУровеньВниз",Узел.ОдинУровеньВниз);
	// для Команда
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("ИмяКоманды",Узел.Команда);
	мПараметры.Вставить("ТипОбъекта",Узел.ТипОбъекта);
	мПараметры.Вставить("OutputText",OutputText);
	мПараметры.Вставить("CommandRef",CommandRef);
	мПараметры.Вставить("Presentation",Presentation);
	мПараметры.Вставить("Direction",Узел.Direction);
	мПараметры.Вставить("RowDescription",Узел.RowDescription);
	мПараметры.Вставить("SwitchSelection",Узел.SwitchSelection);
	мПараметры.Вставить("Cancel",Узел.Cancel);
	мПараметры.Вставить("Area",Area);
	мПараметры.Вставить("ИмяПараметра",Узел.ИмяПараметра);
	мПараметры.Вставить("ЗначениеПараметра",Узел.ЗначениеПараметра);
	мПараметры.Вставить("ПараметрыСценария",ПараметрыСценария);
	мПараметры.Вставить("ClickX",Узел.ClickX);
	мПараметры.Вставить("ClickY",Узел.ClickY);
	мПараметры.Вставить("xPath",xPath);
	мПараметры.Вставить("Интервал",Узел.Интервал);
	// для НайтиФорму
	мПараметры.Вставить("ЗаголовокОбъекта",ЗаголовокОбъекта);
	мПараметры.Вставить("ИспользоватьВариантыПоиска",Узел.ИспользоватьВариантыПоиска);
	// для запросов
	мПараметры.Вставить("НомерПортаExternAutomationUI",Объект.НомерПортаExternAutomationUI);
	мПараметры.Вставить("АдресИнтернетExternAutomationUI",Объект.АдресИнтернетExternAutomationUI);
	// представление данных
	мПараметры.Вставить("ПредставлениеДанных",Узел.ПредставлениеДанных);
	мПараметры.Вставить("ИмяПараметра",Узел.ИмяПараметра);
	мПараметры.Вставить("ИмяПараметра2",Узел.ИмяПараметра2);
	мПараметры.Вставить("ЗначениеПараметра",Узел.ЗначениеПараметра);
	// сравнить с представлением
	мПараметры.Вставить("УсловиеСравнения",Узел.УсловиеСравнения);

	мПараметры.Вставить("Key",mKey);
	мПараметры.Вставить("Type",Узел.Type);
	мПараметры.Вставить("FileName",FileName);
	мПараметры.Вставить("TurnToCommentInBlock",Узел.TurnToCommentInBlock);

	// параметры подключения по умолчанию
	ПараметрыПодключенияПоУмолчанию = новый Структура();
	ПараметрыПодключенияПоУмолчанию.Вставить("ПутьКФайлуСценария",Объект.ПутьКФайлуСценария);
	ПараметрыПодключенияПоУмолчанию.Вставить("СтрокаПодключения",Объект.ПутьПодключенияКлиентаТестирования);
	ПараметрыПодключенияПоУмолчанию.Вставить("ДополнительныеОпцииЗапуска",Объект.ДополнительныеОпцииЗапуска);
	ПараметрыПодключенияПоУмолчанию.Вставить("ЭтоФайловаяБаза",Объект.ФайловаяБаза);
	ПараметрыПодключенияПоУмолчанию.Вставить("Пользователь1С",Объект.Пользователь1С);
	ПараметрыПодключенияПоУмолчанию.Вставить("Пароль1С",Объект.Пароль1С);
	ПараметрыПодключенияПоУмолчанию.Вставить("НомерПорта",Объект.НомерПорта);
	ПараметрыПодключенияПоУмолчанию.Вставить("ПутьКИсполняемомуФайлу1С",Объект.ПутьКИсполняемомуФайлу1С);
	мПараметры.Вставить("ПараметрыПодключенияПоУмолчанию",ПараметрыПодключенияПоУмолчанию);

	Если Узел.Действие="ПодключитьТестируемоеПриложение" ИЛИ Узел.Действие="GenerateClientConnectionScript" Тогда

		ТекущийМодульОбработки.мСценСкрипт_GenerateClientConnection(ТестовоеПриложение, ОписаниеОшибки, мПараметры);
		ТекущийНомерПорта = мПараметры.ТекущийНомерПорта;

	ИначеЕсли Узел.Действие="GenerateClientDisconnectionScript" ИЛИ Узел.Действие="ЗакрытьТестируемоеПриложение" Тогда

		ТекущийМодульОбработки.мСценСкрипт_GenerateClientDisconnection(ТестовоеПриложение, ОписаниеОшибки, мПараметры);

	ИначеЕсли Узел.Действие = "Стоп" Тогда

		ТестЗапущен = Ложь;
		ИндексТекущегоШага = 0;
		ПройтиПоУзлуУстновкаЭлементаВниз(ДеревоСценария,"РезультатВыполнения","");

	ИначеЕсли Узел.Действие = "ВызватьИсключение" ИЛИ Узел.Действие = "ThrowExeption" Тогда

		ВызватьИсключение OutputText;

	ИначеЕсли Узел.Действие = "СделатьСнимокОкна" ИЛИ Узел.Действие = "MakeScreenShot" Тогда

	ИначеЕсли Узел.Действие = "Пауза" Тогда

		РучнойРежим = Истина;

	ИначеЕсли Узел.Действие = "ПолучитьПредставлениеДанных" Тогда

		ТекущийМодульОбработки.мСценСкрипт_ПолучитьПредставлениеДанных(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная,мПараметры,ПараметрыСценария);

		Узел.ПредставлениеДанных = мПараметры.ПредставлениеДанных;
		Узел.ЗначениеПараметра = мПараметры.ЗначениеПараметра;

	ИначеЕсли Узел.Действие = "СравнитьСПредставлениемДанных" ИЛИ Узел.Действие = "Assert" Тогда

		ТекущийМодульОбработки.мСценСкрипт_СравнитьСПредставлениемДанных(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная,мПараметры,ПараметрыСценария);

		Узел.ПредставлениеДанных = мПараметры.ПредставлениеДанных;

	ИначеЕсли Узел.Действие="ВыполнитьПроизвольныйКодКлиент" ИЛИ Узел.Действие="ExecuteCustomCodeClient" Тогда

		мСценСкрипт_ExecuteCustomCodeClient(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,мПараметрыКлиентСервер,Узел.CustomCodeClient);

	ИначеЕсли Узел.Действие="ВыполнитьПроизвольныйКодСервер" ИЛИ Узел.Действие="ExecuteCustomCodeServer" Тогда

		мСценСкрипт_ExecuteCustomCodeServer(ОписаниеОшибки,мПараметрыКлиентСервер,Узел.CustomCodeServer);

	ИначеЕсли Узел.Действие="ДилогВыбораФайла" ИЛИ Узел.Действие="FileDialog" Тогда

		ТекущийМодульОбработки.мСценСкрипт_setFileDialogResult(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиентСервер,Узел.FileName);

	ИначеЕсли Узел.Действие="Timer" ИЛИ Узел.Действие="Таймер" Тогда

		мСценСкрипт_seTimer(ОписаниеОшибки,Узел.Интервал);

	ИначеЕсли Узел.Действие="ИзПараметра1ВПараметр2" Тогда

		мСценСкрипт_ИзПараметра1ВПараметр2(ОписаниеОшибки,Узел.ИмяПараметра,Узел.ИмяПараметра2);

	ИначеЕсли Узел.Действие="ЗначениеВПараметр" Тогда

		мСценСкрипт_ЗначениеВПараметр(ОписаниеОшибки,Узел.ПредставлениеДанных,Узел.ИмяПараметра);

	ИначеЕсли Узел.Действие="НайтиОсновноеОкно" Тогда

		ТекущийМодульОбработки.мСценСкрипт_НайтиОсновноеОкно(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры);

	ИначеЕсли Узел.Действие="НайтиОкно" ИЛИ Узел.Действие="FindWindow" Тогда

		ТекущийМодульОбработки.мСценСкрипт_НайтиОкно(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры);

	ИначеЕсли Узел.Действие="ПолучитьАктивноеОкно" ИЛИ Узел.Действие="GetActiveWindow" Тогда

		ТекущийМодульОбработки.мСценСкрипт_ПолучитьАктивноеОкно(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры);

	ИначеЕсли Узел.Действие="НайтиФорму" ИЛИ Узел.Действие="FindForm" Тогда

		ТекущийМодульОбработки.мСценСкрипт_НайтиФорму(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры);

	ИначеЕсли Узел.Действие = "ПолучитьКомандныйИнтерфейс" ИЛИ Узел.Действие = "GetCommandInterface" Тогда

		ТекущийМодульОбработки.мСценСкрипт_ПолучитьКомандныйИнтерфейс(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры);

	ИначеЕсли Узел.Действие = "НайтиОбъект" ИЛИ Узел.Действие = "FindObject" Тогда

		ТекущийМодульОбработки.мСценСкрипт_НайтиОбъект(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная, мПараметры);

	ИначеЕсли Узел.Действие = "ПроверкаНаличияЭлемента" Тогда

		ТекущийМодульОбработки.мСценСкрипт_ПроверкаНаличияЭлемента(ТестовоеПриложение, ОписаниеОшибки, мПараметры, ПараметрыСценария);

	ИначеЕсли Узел.Действие = "Команда" ИЛИ Узел.Действие = "Command" Тогда

		ИмяПеременнойРодителя="";
		Если ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
			Если НЕ Узел.ПолучитьРодителя()=Неопределено Тогда
				ИмяПеременнойРодителя = Узел.ПолучитьРодителя().ИмяПеременной;
			КонецЕсли;

			Если ИмяПеременнойРодителя="" Тогда
				РодительПеременная = Неопределено;
			Иначе
				РодительПеременная = мПараметрыКлиент[ИмяПеременнойРодителя];
			КонецЕсли;
		КонецЕсли;

		// если имя переменной не задано, тогда присвоим ей родителя, т.к. все кнопки и действия принадлежат обычно родителю
		Если ТекущаяПеременная=Неопределено Тогда
			ТекущаяПеременная = РодительПеременная;
		КонецЕсли;

		Если ТекущаяПеременная=Неопределено И ТекущийAPI = "1cClientApp" и ТипЗнч(Узел)=Тип("ДанныеФормыЭлементДерева") Тогда
			Сообщить("Для действия ["+Узел.Наименование+"] не указана переменная, либо не верная ("+Узел.ИмяПеременной+")!"+
			"К текущему родителю ["+?(Узел.ПолучитьРодителя()=Неопределено,"Нет родителя",Узел.ПолучитьРодителя().Наименование)+"] не применимо! Уажите имя переменной!");
		КонецЕсли;

		ТекущийМодульОбработки.мСценСкрипт_ВыполнитьКоманду(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная,мПараметры);

		Узел.ПредставлениеДанных = мПараметры.ПредставлениеДанных;
		Узел.ЗначениеПараметра = мПараметры.ЗначениеПараметра;

	ИначеЕсли Узел.Действие = "Условие" ИЛИ Узел.Действие = "Сondition" Тогда

		ОсуществитьПереходСТекущегоШага=Ложь;
		ТекущийМодульОбработки.мСценСкрипт_ОбработатьУсловие(ТестовоеПриложение,ОписаниеОшибки, Узел, Узел.ИмяПараметра,Узел.ИмяПараметра2,Узел.ЗначениеПараметра,Узел.УсловиеСравнения,ПараметрыСценария,ОсуществитьПереходСТекущегоШага);
		Если ОсуществитьПереходСТекущегоШага=Истина Тогда
			ИндексПереходСТекущегоШага = ТаблицаСценария[ИндексТекущегоШага].ИндексСледующегоАктивногоШага;
		КонецЕсли;

	ИначеЕсли Узел.Действие = "Замер" ИЛИ Узел.Действие = "Measurement" Тогда

		// посчитаем замер
		Если Узел.Команда="Начать" Тогда
			стр_н = ТаблицаЗамеров.Добавить();
			стр_н.Идентификатор = Строка(Новый UUID());
			стр_н.Ключ = mKey;
			стр_н.ДатаНачала = ТекущаяДата();
			стр_н.ДатаНачалаУнив = ТекущаяУниверсальнаяДатаВМиллисекундах();
		ИначеЕсли Узел.Команда="Завершить" Тогда
			мОтбор = Новый Структура("Ключ,Зафиксирован",mKey,Ложь);
			н_строки = ТаблицаЗамеров.НайтиСтроки(мОтбор);
			Если н_строки.Количество()>0 Тогда
				н_строки[0].Длительность = Окр((ТекущаяУниверсальнаяДатаВМиллисекундах()-н_строки[0].ДатаНачалаУнив)/1000,2);
				н_строки[0].Зафиксирован=Истина;
			КонецЕсли;
		ИначеЕсли Узел.Команда="Удалить"  Тогда
			мОтбор = Новый Структура("Ключ,Зафиксирован",mKey,Ложь);
			н_строки = ТаблицаЗамеров.НайтиСтроки(мОтбор);
			Если н_строки.Количество()>0 Тогда
				ТаблицаЗамеров.Удалить(н_строки[0]);
			КонецЕсли;
		КонецЕсли;

	ИначеЕсли Узел.Действие = "Память" ИЛИ Узел.Действие = "Memory" Тогда

		Модуль_ФункцияПамять.мСценСкрипт_ОбработатьОперациюРаботыПамяти(ОписаниеОшибки,мПараметрыКлиент,мПараметры);

	КонецЕсли;

	Если ТекущийAPI = "1cClientApp" Тогда
		Если ЗначениеЗаполнено(Узел.ИмяПеременной) Тогда
			мПараметрыКлиент[Узел.ИмяПеременной] = ТекущаяПеременная;
		КонецЕсли;
	КонецЕсли;

	Узел.Выполнено = НЕ ЗначениеЗаполнено(ОписаниеОшибки);
	Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		Узел.РезультатВыполнения = "Ошибка";
	КонецЕсли;

	Если ТестовоеПриложение<>Неопределено Тогда
		Если ТекущийAPI="1cClientApp" ИЛИ ТекущийAPI="" Тогда
			Попытка
				ИнформацияОбОшибке = ТестовоеПриложение.ПолучитьТекущуюИнформациюОбОшибке();
				Если ИнформацияОбОшибке <> Неопределено Тогда
					Сообщить(НСтр("ru='Описание=';en='Description='")
						+ ИнформацияОбОшибке.Описание + "'");
					Сообщить(НСтр("ru='ИмяМодуля=';en='ModuleName='")
						+ ИнформацияОбОшибке.ИмяМодуля + "'");
					Сообщить(НСтр("ru='НомерСтроки=';en='LineNumber='")
						+ ИнформацияОбОшибке.НомерСтроки + "'");
					Сообщить(НСтр("ru='ИсходнаяСтрока=';en='SourceLine='")
						+ ИнформацияОбОшибке.ИсходнаяСтрока + "'");
					ОписаниеОшибки = ОписаниеОшибки + Символы.ПС
						+ НСтр("ru='Описание=';en='Description='") + ИнформацияОбОшибке.Описание
						+ "'";
					ОписаниеОшибки = ОписаниеОшибки + Символы.ПС
						+ НСтр("ru='ИмяМодуля=';en='ModuleName='") + ИнформацияОбОшибке.ИмяМодуля
						+ "'";
					ОписаниеОшибки = ОписаниеОшибки + Символы.ПС
						+ НСтр("ru='НомерСтроки=';en='LineNumber='")
						+ ИнформацияОбОшибке.НомерСтроки + "'";
					ОписаниеОшибки = ОписаниеОшибки + Символы.ПС
						+ НСтр("ru='ИсходнаяСтрока=';en='SourceLine='")
						+ ИнформацияОбОшибке.ИсходнаяСтрока + "'";

					Узел.ТекстОшибки = ОписаниеОшибки;
					Узел.РезультатВыполнения = "Предупрежедение" ;
				КонецЕсли;
			Исключение
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;

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

&НаКлиенте


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ПриСозданииНаСервере`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Действие = Параметры.Действие;
	ТекущийПуть = Параметры.ТекущийПуть;

	// заполним другие параметры
	ЗаполнитьЗначенияСвойств(Объект,Параметры);

	// свойство это новый
	Параметры.Свойство("ЭтоНовый",ЭтоНовый);

	Элементы.ТипФайлаСценария.СписокВыбора.Добавить("XML","XML");
	Объект.ТипФайлаСценария = "XML";

	Если Действие="Новый сценарий" Тогда
		Попытка
			Выполнить("Объект.Автор = Строка(ПользователиКлиентСервер.ТекущийПользователь());");
		Исключение
			Объект.Автор = "Аноним";
		КонецПопытки;
		Объект.Наименование = "";
		Элементы.РасположениеПоУмолчанию.Видимость = Истина;
		РасположениеПоУмолчанию = "РабочийКаталог";
	ИначеЕсли Действие="Изменить сценарий" Тогда
		Элементы.РасположениеПоУмолчанию.Видимость = Ложь;
		Элементы.ПутьКФайлуСценария.ТолькоПросмотр = Истина;
		Элементы.ФормаСоздатьИЗакрыть.Заголовок = "Принять изменения";
    // TODO: допиши оставшуюся часть

[Assistant]
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Действие = Параметры.Действие;
	ТекущийПуть = Параметры.ТекущийПуть;

	// заполним другие параметры
	ЗаполнитьЗначенияСвойств(Объект,Параметры);

	// свойство это новый
	Параметры.Свойство("ЭтоНовый",ЭтоНовый);

	Элементы.ТипФайлаСценария.СписокВыбора.Добавить("XML","XML");
	Объект.ТипФайлаСценария = "XML";

	Если Действие="Новый сценарий" Тогда
		Попытка
			Выполнить("Объект.Автор = Строка(ПользователиКлиентСервер.ТекущийПользователь());");
		Исключение
			Объект.Автор = "Аноним";
		КонецПопытки;
		Объект.Наименование = "";
		Элементы.РасположениеПоУмолчанию.Видимость = Истина;
		РасположениеПоУмолчанию = "РабочийКаталог";
	ИначеЕсли Действие="Изменить сценарий" Тогда
		Элементы.РасположениеПоУмолчанию.Видимость = Ложь;
		Элементы.ПутьКФайлуСценария.ТолькоПросмотр = Истина;
		Элементы.ФормаСоздатьИЗакрыть.Заголовок = "Принять изменения";
	ИначеЕсли Действие="Новый каталог" Тогда
		Объект.Наименование = "";
		РасположениеПоУмолчанию = "РабочийКаталог";
	КонецЕсли;

	Если Найти(Действие,"каталог") Тогда
		Элементы.ИдентификаторТеста.Видимость = ложь;
		Элементы.ПутьКФайлуСценария.Заголовок = "Путь к каталогу";
		Элементы.Severity.Видимость = ложь;
		Элементы.ДополнительныеПараметры.Видимость = Ложь;
	КонецЕсли;

	Элементы.Severity.СписокВыбора.Добавить("Блокирующая","Блокирующая");
	Элементы.Severity.СписокВыбора.Добавить("Критическая","Критическая");
	Элементы.Severity.СписокВыбора.Добавить("Значительная","Значительная");
	Элементы.Severity.СписокВыбора.Добавить("Незначительная","Незначительная");
	Элементы.Severity.СписокВыбора.Добавить("Тривиальная","Тривиальная");

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	//Вставить содержимое обработчика
КонецПроцедуры

&НаКлиенте
Процедура СоздатьИЗакрыть(Команда)
	Если НЕ ЗначениеЗаполнено(Объект.Наименование) Тогда
		Сообщить("Указание наименования сценария обязательно!");
		Возврат;
	КонецЕсли;
	Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлуСценария) Тогда
		Сообщить("Указание пути к файлу сценария обязательно!");
		Возврат;
	КонецЕсли;

	Если НЕ Найти(Действие,"каталог") Тогда
		мПараметры = новый Структура("Наименование,Автор,ПутьКФайлуСценария,ТипФайлаСценария,Комментарий,ИдентификаторТеста,Severity");
		ЗаполнитьЗначенияСвойств(мПараметры,Объект);
		Оповестить(Действие,мПараметры,ЭтаФорма);
	Иначе
		// создадим каталог
		ВыборСозданиеКаталога = новый ОписаниеОповещения("ВыборСозданиеКаталога",ЭтотОбъект);
		НачатьСозданиеКаталога(ВыборСозданиеКаталога,Объект.ПутьКФайлуСценария+"\"+Объект.Наименование);
	КонецЕсли;
	ЭтаФорма.Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура ПутьКФайлуСценарияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	Если Найти(Действие,"каталог") Тогда
		Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
		Диалог.Заголовок = "Выберите каталог";
	Иначе
		Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		Диалог.Заголовок = "Выберите файл";
		Диалог.ПолноеИмяФайла = "";
	КонецЕсли;

	Если ЗначениеЗаполнено(Объект.ПутьКФайлуСценария) Тогда
		Диалог.Каталог = ПолучитьКаталогПоПутиФайла(Объект.ПутьКФайлуСценария);
		Если Найти(Действие,"каталог") Тогда
			Диалог.ПолноеИмяФайла = ПолучитьИмяПоПутиФайла(Объект.ПутьКФайлуСценария);
		КонецЕсли;
	ИначеЕсли ЗначениеЗаполнено(ТекущийПуть) Тогда
		Если Найти(ТекущийПуть,".") Тогда
			Диалог.Каталог = ПолучитьКаталогПоПутиФайла(ТекущийПуть);
			Если Найти(Действие,"каталог") Тогда
				Диалог.ПолноеИмяФайла = ПолучитьИмяПоПутиФайла(ТекущийПуть);
			КонецЕсли;
		Иначе
			Диалог.Каталог = ПолучитьКаталогПоПутиФайла(ТекущийПуть+"\");
		КонецЕсли;
	КонецЕсли;

	Фильтр = "XML-файл (*.xml)|*.xml";
	Диалог.Фильтр = Фильтр;
	Диалог.МножественныйВыбор = Ложь;
	ВыборФайлаОткрытияСтруктурыКонфигурации = новый ОписаниеОповещения("ВыборФайлаОткрытияСтруктурыКонфигурации",ЭтотОбъект);
	Диалог.Показать(ВыборФайлаОткрытияСтруктурыКонфигурации);

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

&НаКлиенте
Процедура ВыборФайлаОткрытияСтруктурыКонфигурации(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	 Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
		Объект.ПутьКФайлуСценария = ВыбранныеФайлы[0];
	КонецЕсли;

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

&НаКлиенте
Процедура ВыборСозданиеКаталога(ИмяКаталога, ДополнительныеПараметры) Экспорт

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

&НаКлиенте
Функция  ПолучитьКаталогПоПутиФайла(Знач ПутьКФайлу)
	Файл = новый Файл(ПутьКФайлу);
	Возврат Файл.Путь;
КонецФункции

&НаКлиенте
Функция  ПолучитьИмяПоПутиФайла(Знач ПутьКФайлу)
	Файл = новый Файл(ПутьКФайлу);
	Возврат Файл.ИмяБезРасширения;
КонецФункции

&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)

	// если нет идентификатора
	Если НЕ ЗначениеЗаполнено(Объект.ИдентификаторТеста) Тогда
		Объект.ИдентификаторТеста = СформироватьАвтоматическиИдентификаторТеста(Объект.Наименование);
	КонецЕсли;

	// если не указан путь
	Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлуСценария) Тогда
		Если РасположениеПоУмолчанию="РабочийКаталог" Тогда
			Объект.ПутьКФайлуСценария = Объект.ПутьККаталогуНаборовСценариев+"\"+?(Найти(Действие,"каталог"),"",УдалитьНедопустимыеСимволыДляПутиФайла(Объект.Наименование)+".xml");
		Иначе
			Объект.ПутьКФайлуСценария = Объект.ПутьККаталогуБиблиотекиСценариев+"\"+?(Найти(Действие,"каталог"),"",УдалитьНедопустимыеСимволыДляПутиФайла(Объект.Наименование)+".xml");
		КонецЕсли;
	КонецЕсли;

	// если путь менялся, тогда попробуем поменять имя
	Если ЗначениеЗаполнено(СтароеИмяФайла) И Найти(Врег(Объект.ПутьКФайлуСценария),Врег(СтароеИмяФайла+".xml")) Тогда
		Объект.ПутьКФайлуСценария = СтрЗаменить(Объект.ПутьКФайлуСценария,СтароеИмяФайла+".xml",Объект.Наименование+".xml");
	КонецЕсли;

	СтароеИмяФайла = Объект.Наименование;

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

&НаКлиенте
Функция УдалитьНедопустимыеСимволыДляПутиФайла(Знач ПутьКФайлу)

	КорректныйПутьКФайлу = ПутьКФайлу;

	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"*","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"|","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"\","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"/","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,":","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"""","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"<","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,">","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"?","");
	КорректныйПутьКФайлу = СтрЗаменить(КорректныйПутьКФайлу,"+","");

	Возврат КорректныйПутьКФайлу;

КонецФункции

&НаКлиенте
Функция СформироватьАвтоматическиИдентификаторТеста(Знач Наименование)
	Ключ = Наименование;
	Ключ = СтрЗаменить(Ключ," ","_");
	Возврат Ключ;
КонецФункции

&НаКлиенте
Процедура РасположениеПоУмолчаниюПриИзменении(Элемент)
	Если РасположениеПоУмолчанию="РабочийКаталог" Тогда
		Если Найти(Объект.ПутьКФайлуСценария,Объект.ПутьККаталогуБиблиотекиСценариев) Тогда
			Объект.ПутьКФайлуСценария = СтрЗаменить(Объект.ПутьКФайлуСценария,Объект.ПутьККаталогуБиблиотекиСценариев,Объект.ПутьККаталогуНаборовСценариев);
		КонецЕсли;
	Иначе
		Если Найти(Объект.ПутьКФайлуСценария,Объект.ПутьККаталогуНаборовСценариев) Тогда
			Объект.ПутьКФайлуСценария = СтрЗаменить(Объект.ПутьКФайлуСценария,Объект.ПутьККаталогуНаборовСценариев,Объект.ПутьККаталогуБиблиотекиСценариев);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(ЗаписьJSON, ТелоЗапроса)

	Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
		ЗаписьJSON.ЗаписатьИмяСвойства("requestBody");
		ЗаписьJSON.ЗаписатьНачалоОбъекта(); // requestBody

		Если ТипЗнч(ТелоЗапроса.МассивТиповMIME) = Тип("Массив") И
			ТелоЗапроса.МассивТиповMIME.Количество() > 0 Тогда

			ЗаписьJSON.ЗаписатьИмяСвойства("content");
			ЗаписьJSON.ЗаписатьНачалоОбъекта(); // content

			Для каждого ТипMIME Из ТелоЗапроса.МассивТиповMIME Цикл

				ЗаписьJSON.ЗаписатьИмяСвойства(ТипMIME.Заголовок); // e.g. application/json
				ЗаписьJSON.ЗаписатьНачалоОбъекта(); // тип MIME

				ЗаписьJSON.ЗаписатьИмяСвойства("schema");
				ЗаписьJSON.ЗаписатьНачалоОбъекта(); // schema

				Если ЗначениеЗаполнено(ТипMIME.Тип) Тогда
					ЗаписьJSON.ЗаписатьИмяСвойства("type");
					ЗаписьJSON.ЗаписатьЗначение(ТипMIME.Тип);

					Если ТипMIME.Тип = "array" Тогда
						ЗаписьJSON.ЗаписатьИмяСвойства("items");
						ЗаписьJSON.ЗаписатьНачалоОбъекта(); // items

						СоздатьОписаниеСхемы(ЗаписьJSON, ТипMIME.Схема);

						ЗаписьJSON.ЗаписатьКонецОбъекта(); // items
					КонецЕсли;
				ИначеЕсли ЗначениеЗаполнено(ТипMIME.Схема) Тогда
					СоздатьОписаниеСхемы(ЗаписьJSON, ТипMIME.Схема);
				КонецЕсли;

				ЗаписьJSON.ЗаписатьКонецОбъекта(); // schema

				ЗаписьJSON.ЗаписатьКонецОбъекта(); // тип MIME

			КонецЦикла;

			ЗаписьJSON.ЗаписатьКонецОбъекта(); // content
		КонецЕсли;

		ЗаписьJSON.ЗаписатьИмяСвойства("description");
		ЗаписьJSON.ЗаписатьЗначение(ТелоЗапроса.Описание);

		ЗаписьJSON.ЗаписатьКонецОбъекта(); // requestBody
	КонецЕсли;

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

Процедура СоздатьОтветыМетода(ЗаписьJSON, ОтветыМетода)

	ЗаписьJSON.ЗаписатьИмяСвойства("responses");
	ЗаписьJSON.ЗаписатьНачалоОбъекта(); // responses

	Для каждого ОтветМетода Из ОтветыМетода Цикл

		ЗаписьJSON.ЗаписатьИмяСвойства(Строка(ОтветМетода.Код));
		ЗаписьJSON.ЗаписатьНачалоОбъекта(); // ответ

		ЗаписьJSON.ЗаписатьИмяСвойства("description");
		ЗаписьJSON.ЗаписатьЗначение(ОтветМетода.Описание);

		Если ТипЗнч(ОтветМетода.МассивТиповMIME) = Тип("Массив") И ОтветМетода.МассивТиповMIME.Количество() > 0 Тогда

			ЗаписьJSON.ЗаписатьИмяСвойства("content");
			ЗаписьJSON.ЗаписатьНачалоОбъекта(); // content

			Для каждого ТипMIME Из ОтветМетода.МассивТиповMIME Цикл

				ЗаписьJSON.ЗаписатьИмяСвойства(ТипMIME.Заголовок); // e.g. application/json
				ЗаписьJSON.ЗаписатьНачалоОбъекта(); // тип MIME

				ЗаписьJSON.ЗаписатьИмяСвойства("schema");
				ЗаписьJSON.ЗаписатьНачалоОбъекта(); // schema

				Если ЗначениеЗаполнено(ТипMIME.Тип) Тогда
					ЗаписьJSON.ЗаписатьИмяСвойства("type");
					ЗаписьJSON.ЗаписатьЗначение(ТипMIME.Тип);

					Если ТипMIME.Тип = "array" Тогда
						ЗаписьJSON.ЗаписатьИмяСвойства("items");
						ЗаписьJSON.ЗаписатьНачалоОбъекта(); // items

						СоздатьОписаниеСхемы(ЗаписьJSON, ТипMIME.Схема);

						ЗаписьJSON.ЗаписатьКонецОбъекта(); // items
					КонецЕсли;
				ИначеЕсли ЗначениеЗаполнено(ТипMIME.Схема) Тогда
					СоздатьОписаниеСхемы(ЗаписьJSON, ТипMIME.Схема);
				КонецЕсли;

				ЗаписьJSON.ЗаписатьКонецОбъекта(); // schema

				ЗаписьJSON.ЗаписатьКонецОбъекта(); // тип MIME

			КонецЦикла;

			ЗаписьJSON.ЗаписатьКонецОбъекта(); // content

		КонецЕсли;

		ЗаписьJSON.ЗаписатьКонецОбъекта(); // ответ

	КонецЦикла;

	ЗаписьJSON.ЗаписатьКонецОбъекта(); // responses

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

Процедура СоздатьМассивДанныхОбАутентификации(ЗаписьJSON)

	ЗаписьJSON.ЗаписатьИмяСвойства("security");
	ЗаписьJSON.ЗаписатьНачалоМассива(); // security

	ЗаписьJSON.ЗаписатьНачалоОбъекта();

	ЗаписьJSON.ЗаписатьИмяСвойства("basic");
	ЗаписьJSON.ЗаписатьНачалоМассива();
	ЗаписьJSON.ЗаписатьКонецМассива();

	ЗаписьJSON.ЗаписатьКонецОбъекта();

	ЗаписьJSON.ЗаписатьКонецМассива(); // security

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

Процедура СоздатьКомпоненты(ЗаписьJSON, Объекты)

	ЗаписьJSON.ЗаписатьИмяСвойства("components");
	ЗаписьJSON.ЗаписатьНачалоОбъекта(); // components

	СоздатьСхемыОбъектов(ЗаписьJSON, Объекты);
	СоздатьСхемыАутентификации(ЗаписьJSON);

	ЗаписьJSON.ЗаписатьКонецОбъекта(); // components

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

[Assistant] Процедура СоздатьТело(ЗаписьJSON, ТелоЗапроса)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(ЗаписьJSON, Объекты)

	Если ЗначениеЗаполнено(Объекты) И Объекты.Количество() > 0 Тогда

		ЗаписьJSON.ЗаписатьИмяСвойства("schemas");
		ЗаписьJSON.ЗаписатьНачалоОбъекта(); // schemas

		Для каждого ОбъектСервиса Из Объекты Цикл

			ЗаписьJSON.ЗаписатьИмяСвойства(ОбъектСервиса.Имя);
			ЗаписьJSON.ЗаписатьНачалоОбъекта(); // объект

			ЗаписьJSON.ЗаписатьИмяСвойства("type");
			ЗаписьJSON.ЗаписатьЗначение(ОбъектСервиса.Тип);

			Если Не ПустаяСтрока(ОбъектСервиса.ОписаниеОбъекта) Тогда
				ЗаписьJSON.ЗаписатьИмяСвойства("description");
				ЗаписьJSON.ЗаписатьЗначение(ОбъектСервиса.ОписаниеОбъекта);
			КонецЕсли;

			Если ТипЗнч(ОбъектСервиса.ОбязательныеПоля) = Тип("Строка") И Не ПустаяСтрока(ОбъектСервиса.ОбязательныеПоля) Тогда
				МассивПолей = СтрРазделить(ОбъектСервиса.ОбязательныеПоля, ",", Ложь);
				Если МассивПолей.Количество() > 0 Тогда

					ЗаписьJSON.ЗаписатьИмяСвойства("required");
					ЗаписьJSON.ЗаписатьНачалоМассива(); // required

					Для каждого ОбязательноеПоле Из МассивПолей Цикл
						ЗаписьJSON.ЗаписатьЗначение(СокрЛП(ОбязательноеПоле));
					КонецЦикла;

					ЗаписьJSON.ЗаписатьКонецМассива(); // required

				КонецЕсли;
			КонецЕсли;

			Если ТипЗнч(ОбъектСервиса.МассивСвойств) = Тип("Массив") И ОбъектСервиса.МассивСвойств.Количество() > 0 Тогда
				ЗаписьJSON.ЗаписатьИмяСвойства("properties");
				ЗаписьJSON.ЗаписатьНачалоОбъекта(); // properties

				Для каждого СвойствоОбъекта Из ОбъектСервиса.МассивСвойств Цикл
					ЗаписьJSON.ЗаписатьИмяСвойства(СвойствоОбъекта.Имя);
					ЗаписьJSON.ЗаписатьНачалоОбъекта(); // свойство объекта

					ЗаписьJSON.ЗаписатьИмяСвойства("type");
					ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.Тип);

					Если ЗначениеЗаполнено(СвойствоОбъекта.Описание) Тогда
						ЗаписьJSON.ЗаписатьИмяСвойства("description");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.Описание);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("Nullable") И
						СвойствоОбъекта.Nullable = Истина Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("nullable");
						ЗаписьJSON.ЗаписатьЗначение(Истина);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("Обязательный") И
						СвойствоОбъекта.Обязательный = Истина Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("require");
						ЗаписьJSON.ЗаписатьЗначение(Истина);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("Формат") И
						Не ПустаяСтрока(СвойствоОбъекта.Формат) Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("format");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.Формат);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("Максимум") И
						ТипЗнч(СвойствоОбъекта.Максимум) = Тип("Число") Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("maximum");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.Максимум);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("Минимум") И
						ТипЗнч(СвойствоОбъекта.Минимум) = Тип("Число") Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("minimum");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.Минимум);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("НеВключаяМаксимум") И
						СвойствоОбъекта.НеВключаяМаксимум = Истина Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("exclusiveMaximum");
						ЗаписьJSON.ЗаписатьЗначение(Истина);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("НеВключаяМинимум") И
						СвойствоОбъекта.НеВключаяМинимум = Истина Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("exclusiveMinimum");
						ЗаписьJSON.ЗаписатьЗначение(Истина);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("МаксимальнаяДлина") И
						ТипЗнч(СвойствоОбъекта.МаксимальнаяДлина) = Тип("Число") Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("maxLength");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.МаксимальнаяДлина);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("МинимальнаяДлина") И
						ТипЗнч(СвойствоОбъекта.МинимальнаяДлина) = Тип("Число") Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("minLength");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.МинимальнаяДлина);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("ПоУмолчанию") И
						Не СвойствоОбъекта.ПоУмолчанию = Неопределено Тогда

						ЗаписьJSON.ЗаписатьИмяСвойства("default");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.ПоУмолчанию);
					КонецЕсли;

					Если СвойствоОбъекта.Тип = "array" Тогда
						ЗаписьJSON.ЗаписатьИмяСвойства("items");
						ЗаписьJSON.ЗаписатьНачалоОбъекта();

						СоздатьОписаниеСхемы(ЗаписьJSON, СвойствоОбъекта.Схема);

						ЗаписьJSON.ЗаписатьКонецОбъекта();
					ИначеЕсли СвойствоОбъекта.Тип = "object" Тогда
						СоздатьОписаниеСхемы(ЗаписьJSON, СвойствоОбъекта.Схема);
					ИначеЕсли ЗначениеЗаполнено(СвойствоОбъекта.Пример) Тогда
						ЗаписьJSON.ЗаписатьИмяСвойства("example");
						ЗаписьJSON.ЗаписатьЗначение(СвойствоОбъекта.Пример);
					КонецЕсли;

					Если СвойствоОбъекта.Свойство("Перечисление") И
						ТипЗнч(СвойствоОбъекта.Перечисление) = Тип("Массив") И
						(СвойствоОбъекта.Тип = Неопределено Или
						СвойствоОбъекта.Тип = "string" Или
						СвойствоОбъекта.Тип = "integer") Тогда

						СоздатьМассивПеречислений(ЗаписьJSON, СвойствоОбъекта.Перечисление)
					КонецЕсли;

					ЗаписьJSON.ЗаписатьКонецОбъекта(); // свойство объекта
				КонецЦикла;

				ЗаписьJSON.ЗаписатьКонецОбъекта(); // properties
			КонецЕсли;

			ЗаписьJSON.ЗаписатьКонецОбъекта(); // объект

		КонецЦикла;

		ЗаписьJSON.ЗаписатьКонецОбъекта(); // schemas

	КонецЕсли;

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

Процедура СоздатьСхемыАутентификации(ЗаписьJSON)

	ЗаписьJSON.ЗаписатьИмяСвойства("securitySchemes");
	ЗаписьJSON.ЗаписатьНачалоОбъекта(); // securitySchemes

	ЗаписьJSON.ЗаписатьИмяСвойства("basic");
	ЗаписьJSON.ЗаписатьНачалоОбъекта(); // basic

	ЗаписьJSON.ЗаписатьИмяСвойства("type");
	ЗаписьJSON.ЗаписатьЗначение("http");
	ЗаписьJSON.ЗаписатьИмяСвойства("scheme");
	ЗаписьJSON.ЗаписатьЗначение("basic");

	ЗаписьJSON.ЗаписатьКонецОбъекта(); // basic

	ЗаписьJSON.ЗаписатьКонецОбъекта(); // securitySchemes

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

Процедура СоздатьМассивПеречислений(ЗаписьJSON, Перечисления, Nullable = Ложь)

	ЗаписьJSON.ЗаписатьИмяСвойства("enum");
	ЗаписьJSON.ЗаписатьНачалоМассива();

	Для каждого ЭлементПеречисления Из Перечисления Цикл
		ЗаписьJSON.ЗаписатьЗначение(ЭлементПеречисления);
	КонецЦикла;

	Если Nullable Тогда
		ЗаписьJSON.ЗаписатьЗначение(Null);
	КонецЕсли;

	ЗаписьJSON.ЗаписатьКонецМассива();

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

Процедура СоздатьОписанияТегов(ЗаписьJSON, Теги)

	ЗаписьJSON.ЗаписатьИмяСвойства("tags");
	ЗаписьJSON.ЗаписатьНачалоМассива(); // tags

	Для каждого Тег Из Теги Цикл

		ЗаписьJSON.ЗаписатьНачалоОбъекта();

		ЗаписьJSON.ЗаписатьИмяСвойства("name");
		ЗаписьJSON.ЗаписатьЗначение(Тег.Имя);

		ЗаписьJSON.ЗаписатьИмяСвойства("description");
		ЗаписьJSON.ЗаписатьЗначение(Тег.Описание);

		ЗаписьJSON.ЗаписатьКонецОбъекта();

	КонецЦикла;

	ЗаписьJSON.ЗаписатьКонецМассива(); // tags

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

Функция ОбщийМодуль(Имя)

	Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда
		// АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно.
		УстановитьБезопасныйРежим(Истина);
		Модуль = Вычислить(Имя);
		// АПК:488-вкл
	Иначе
		Модуль = Неопределено;
	КонецЕсли;

	Возврат Модуль;

КонецФункции

Процедура  СоздатьОписаниеСхемы(ЗаписьJSON, Схема)

	Если Не ЗначениеЗаполнено(Схема) Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(Схема) = Тип("Строка") Тогда
		ЗаписьJSON.ЗаписатьИмяСвойства("$ref");
		ЗаписьJSON.ЗаписатьЗначение(Схема);
	Иначе // oneOf, anyOf, allOf, not
		ЗаписьJSON.ЗаписатьИмяСвойства(Схема.СпособОбъединенияСхем);
		ЗаписьJSON.ЗаписатьНачалоМассива();

		Для каждого ТипЭлемента Из Схема.МассивТиповСхемы Цикл
			ЗаписьJSON.ЗаписатьНачалоОбъекта();

			ЗаписьJSON.ЗаписатьИмяСвойства("$ref");
			ЗаписьJSON.ЗаписатьЗначение(ТипЭлемента);

			ЗаписьJSON.ЗаписатьКонецОбъекта();
		КонецЦикла;

		ЗаписьJSON.ЗаписатьКонецМассива();
	КонецЕсли;

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

#КонецОбласти

#Область JSON_RPC

[Assistant] Процедура СоздатьСхемыОбъектов(ЗаписьJSON, Объекты)


[System] Ты анализируешь код 1С и подбираешь точные имена для процедур и функций.

[User]
Восстанови осмысленное имя процедуры или функции на 1С по её телу. Верни только полную сигнатуру первой строки.

Процедура ИмяФункции(ИмяПараметра, Значение)

	Для каждого Свойство Из СтруктураОписания.МассивСвойств Цикл
		Если Свойство.ИмяСвойства = СтруктураОписания.ТекущееСвойство Тогда
			Если ИмяПараметра = "Схема" И ТипЗнч(Свойство["Схема"]) = Тип("Структура") Тогда
				МассивТипов = Свойство["Схема"].МассивТиповСхемы;
				МассивТипов.Добавить(Значение);
				Свойство["Схема"].МассивТиповСхемы = МассивТипов;
			Иначе
				Свойство[ИмяПараметра] = Значение;
			КонецЕсли;

			Возврат;
		КонецЕсли;
	КонецЦикла;

	ВызватьИсключение СтрШаблон("УстановитьПараметрВМассивеСвойств: в массиве свойств не найдено свойство с именем ""%1""",
		СтруктураОписания.ТекущееСвойство);

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

Функция ПолучитьСвойствоВМассивеСвойств()

	Для каждого Свойство Из СтруктураОписания.МассивСвойств Цикл
		Если Свойство.ИмяСвойства = СтруктураОписания.ТекущееСвойство Тогда
			Возврат Свойство;
		КонецЕсли;
	КонецЦикла;

	ВызватьИсключение СтрШаблон("ПолучитьСвойствоВМассивеСвойств: в массиве свойств не найдено свойство с именем ""%1""",
		СтруктураОписания.ТекущееСвойство);

КонецФункции

Процедура ДобавитьПоследнийОбъектВМассивОбъектов()

	Если СтруктураОписания.Свойство("ТекущийОбъект") И
		ТипЗнч(СтруктураОписания.ТекущийОбъект) = Тип("Структура")
		И Не СтруктураОписания.ТекущийОбъект.Количество() = 0 Тогда

		ДобавитьСвойстваВОбъект(СтруктураОписания.ТекущийОбъект);
		СтруктураОписания.ТекущийОбъект.ОбязательныеПоля = СтруктураОписания.ОбязательныеПоля;
		СтруктураОписания.ТекущийОбъект.Описание         = СтруктураОписания.ОписаниеОбъекта;

		МассивОбъектов = Новый Массив;
		Если СтруктураОписания.Свойство("МассивОбъектов") И
			ТипЗнч(СтруктураОписания.МассивОбъектов) = Тип("Массив") Тогда

			МассивОбъектов = СтруктураОписания.МассивОбъектов;
		КонецЕсли;

		МассивОбъектов.Добавить(СтруктураОписания.ТекущийОбъект);
		СтруктураОписания.Вставить("МассивОбъектов", МассивОбъектов);
	КонецЕсли;

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

Процедура ДобавитьСвойстваВОбъект(ТекущийОбъект)

	МассивСвойствОбъекта = Новый Массив;

	Если СтруктураОписания.Свойство("МассивСвойств") И
		ТипЗнч(СтруктураОписания.МассивСвойств) = Тип("Массив") Тогда

		Для каждого СвойствоОбъекта Из СтруктураОписания.МассивСвойств Цикл

			Если ТипЗнч(СвойствоОбъекта.Схема) = Тип("Структура") Тогда
				СвойствоОбъекта.Схема = Swag_ФормированиеОписаний.ОписаниеСоставнойСхемы(
					СвойствоОбъекта.Схема.СпособОбъединенияСхем, СвойствоОбъекта.Схема.МассивТиповСхемы);
			КонецЕсли;

			СтруктураСвойства = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта(
				СвойствоОбъекта.ИмяСвойства, СвойствоОбъекта.Тип, СвойствоОбъекта.Схема);
			ЗаполнитьЗначенияСвойств(СтруктураСвойства, СвойствоОбъекта,, "Тип, Схема");

			МассивСвойствОбъекта.Добавить(СтруктураСвойства);

		КонецЦикла;

	КонецЕсли;

	ТекущийОбъект.Свойства = МассивСвойствОбъекта;

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

#КонецОбласти

[Assistant] Процедура УстановитьПараметрВМассивеСвойств(ИмяПараметра, Значение)


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ПриСозданииНаСервере`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АдресЗначения", АдресЗначения) Тогда
		Таблица = ПолучитьИзВременногоХранилища(АдресЗначения);
		Если ТипЗнч(Таблица) = Тип("ТаблицаЗначений") И ЗначениеЗаполнено(Таблица.Колонки) Тогда
			Для Каждого Колонка Из Таблица.Колонки Цикл
				// Заполняем таблицу колонок
				нСтрока = КолонкиТаблицыЗначений.Добавить();
				ЗаполнитьЗначенияСвойств(нСтрока, Колонка);
			КонецЦикла;
			// Создаем реквизиты формы, выводим таблицу формы
			ПоказатьТаблицу = Истина;
			ОбновитьТаблицуСтрок();
			// Заполняем таблицу строк
    // TODO: допиши оставшуюся часть

[Assistant]
// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
// URL:    https://github.com/firstBitSportivnaya/PSSL/
//

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Если Параметры.Свойство("АдресЗначения", АдресЗначения) Тогда
		Таблица = ПолучитьИзВременногоХранилища(АдресЗначения);
		Если ТипЗнч(Таблица) = Тип("ТаблицаЗначений") И ЗначениеЗаполнено(Таблица.Колонки) Тогда
			Для Каждого Колонка Из Таблица.Колонки Цикл
				// Заполняем таблицу колонок
				нСтрока = КолонкиТаблицыЗначений.Добавить();
				ЗаполнитьЗначенияСвойств(нСтрока, Колонка);
			КонецЦикла;
			// Создаем реквизиты формы, выводим таблицу формы
			ПоказатьТаблицу = Истина;
			ОбновитьТаблицуСтрок();
			// Заполняем таблицу строк
			Для Каждого Стр Из Таблица Цикл
				нСтрока = СтрокиТаблицыЗначений.Добавить();
				ЗаполнитьЗначенияСвойств(нСтрока, Стр);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	УстановитьВидимостьЭлементов();

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)

	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;

	Если СохранитьРезультат Тогда
		Адрес = АдресТаблицыВХранилище();
		ОповеститьОВыборе(Новый Структура("Адрес", Адрес));
	КонецЕсли;

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыКолонкиТаблицыЗначений

&НаКлиенте
Процедура КолонкиТаблицыЗначенийИмяПриИзменении(Элемент)
	ТекДанные = Элементы.КолонкиТаблицыЗначений.ТекущиеДанные;
	Если ЗначениеЗаполнено(ТекДанные.Имя) Тогда
		Результат = СтрЗаменить(ТекДанные.Имя, " ", "");
		пбп_ОбщегоНазначенияКлиентСервер.УдалитьНедопустимыеСимволы(Результат);
		ТекДанные.Имя = Результат;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура КолонкиТаблицыЗначенийПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;

	ТекДанные = Элементы.КолонкиТаблицыЗначений.ТекущиеДанные;
	ТекДанные.Имя = "Колонка_";
	// Установим тип по умолчанию "Строка"
	ТекДанные.ТипЗначения = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10));

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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура КолонкиСтроки(Команда)
	УстановитьВидимостьЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура СохранитьРезультат(Команда)
	СохранитьРезультат = Истина;
	Закрыть();
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция АдресТаблицыВХранилище()

	УИД = ?(ПустаяСтрока(АдресЗначения), Новый УникальныйИдентификатор, АдресЗначения);
	ТаблицаЗначений = СтрокиТаблицыЗначений.Выгрузить();
	Адрес = ПоместитьВоВременноеХранилище(ТаблицаЗначений, УИД);

	Возврат Адрес;

КонецФункции

&НаСервере
Процедура ОбновитьТаблицуСтрок()

	ИменаКолонок = Новый Массив;
	Для Каждого Реквизит Из КолонкиТаблицыЗначений Цикл
		ИменаКолонок.Добавить(Реквизит.Имя);
	КонецЦикла;

	ИмяТаблицы = "СтрокиТаблицыЗначений";
	РеквизитыТаблицы = ПолучитьРеквизиты(ИмяТаблицы);
	ИменаРеквизитов = Новый Массив();

	УдаляемыеРеквизиты = Новый Массив;
	Для Каждого Реквизит Из РеквизитыТаблицы Цикл
		ИменаРеквизитов.Добавить(Реквизит.Имя);
		Если ИменаКолонок.Найти(Реквизит.Имя) = Неопределено Тогда
			УдаляемыеРеквизиты.Добавить(ИмяТаблицы + "." + Реквизит.Имя);
			пбп_РаботаСФормами.УдалитьЭлемент(ЭтотОбъект, ИмяТаблицы + Реквизит.Имя);
		КонецЕсли;
	КонецЦикла;

	ДобавляемыеРеквизиты = Новый Массив;
	Для Каждого Колонка Из КолонкиТаблицыЗначений Цикл
		Если ИменаРеквизитов.Найти(Колонка.Имя) = Неопределено Тогда
			НовыйРеквизит = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТаблицы);
			ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
		КонецЕсли;
	КонецЦикла;

	Если Не ЗначениеЗаполнено(УдаляемыеРеквизиты) И Не ЗначениеЗаполнено(ДобавляемыеРеквизиты) Тогда
		Возврат;
	КонецЕсли;

	НачатьТранзакцию();
	Попытка

		ИзменитьРеквизиты(, УдаляемыеРеквизиты);
		ИзменитьРеквизиты(ДобавляемыеРеквизиты);

		Для Каждого Реквизит Из ДобавляемыеРеквизиты Цикл
			Если Элементы.Найти(ИмяТаблицы + Реквизит.Имя) = Неопределено Тогда
				пбп_РаботаСФормами.СоздатьКолонкаТаблицыФормы(
					ЭтотОбъект,
					ИмяТаблицы + Реквизит.Имя,
					Элементы.СтрокиТаблицыЗначений,
					,
					,
					ИмяТаблицы + "." + Реквизит.Имя);
			КонецЕсли;
		КонецЦикла;

		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;

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

&НаСервере
Процедура УстановитьВидимостьЭлементов()
	Если ПоказатьТаблицу Тогда
		ОбновитьТаблицуСтрок();
	КонецЕсли;
	ОбновитьЗаголовокКнопки();
	Элементы.КолонкиТаблицыЗначений.Видимость = Не ПоказатьТаблицу;
	Элементы.СтрокиТаблицыЗначений.Видимость = ПоказатьТаблицу;
	ПоказатьТаблицу = Не ПоказатьТаблицу;
КонецПроцедуры

&НаСервере
Процедура ОбновитьЗаголовокКнопки()
	Элементы.ФормаПоказатьКолонкиСтроки.Заголовок = ?(ПоказатьТаблицу, "Показать колонки", "Показать строки");
КонецПроцедуры

#КонецОбласти

PSSL-develop/src/cf/Catalogs/пбп_ПользовательскиеФункции/Forms/ФормаТаблицыЗначений/Ext/Form/Module.bsl


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало функция `ТипСтрока`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Функция ТипСтрока(Знач Значение)
СписокДобавленныхТипов = Новый СписокЗначений;
	Справочники.пбп_ПользовательскиеФункции.СформироватьСписокТипов(СписокДобавленныхТипов);

	ТипСтрока = Строка(Тип(Значение));
	Если Значение = "СписокЗначений" Тогда
		Возврат "СписокЗначений";
	КонецЕсли;

	ТипНайден = Ложь;
	Для Каждого ЭлементСписка Из СписокДобавленныхТипов Цикл
		Если ЭлементСписка.Представление = ТипСтрока Тогда
			ТипНайден = Истина;
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ТипСтрока(Знач Значение)

	СписокДобавленныхТипов = Новый СписокЗначений;
	Справочники.пбп_ПользовательскиеФункции.СформироватьСписокТипов(СписокДобавленныхТипов);

	ТипСтрока = Строка(Тип(Значение));
	Если Значение = "СписокЗначений" Тогда
		Возврат "СписокЗначений";
	КонецЕсли;

	ТипНайден = Ложь;
	Для Каждого ЭлементСписка Из СписокДобавленныхТипов Цикл
		Если ЭлементСписка.Представление = ТипСтрока Тогда
			ТипНайден = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если Не ТипНайден Тогда
		ТипСтрока = XMLТип(Тип(Значение)).ИмяТипа;
	КонецЕсли;

	Возврат ТипСтрока;

КонецФункции

&НаСервере

Процедура УдалениеДанныхИзВременногоХранилища()
	Для Каждого Параметр Из Объект.ПараметрыФункции Цикл
		Если ЗначениеЗаполнено(Параметр.АдресЗначения) Тогда
			УдалитьИзВременногоХранилища(Параметр.АдресЗначения);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере

Процедура СохранитьПараметрыФункции(Отказ = Ложь)

	НастройкиПараметров = ПолучитьПараметрыФункции();

	// Ключ - Идентификатор параметра, Значение - Структура("Имя,Тип,Значение")
	Данные = Новый Соответствие;
	Для Каждого Параметр Из Объект.ПараметрыФункции Цикл
		ОписаниеПараметра = Новый Структура;
		ОписаниеПараметра.Вставить("Имя", Параметр.Наименование);
		ОписаниеПараметра.Вставить("Тип", Параметр.Тип);
		// Берем значение с формы только для типов не требующих преобразования
		Значение = Параметр.ЗначениеВФорме;
		Если ЗначениеЗаполнено(Параметр.АдресЗначения) Тогда
			Значение = ПолучитьИзВременногоХранилища(Параметр.АдресЗначения);
			УдалитьИзВременногоХранилища(Параметр.АдресЗначения);
		КонецЕсли;
		ОписаниеПараметра.Вставить("Значение", Значение);
		Данные.Вставить(Параметр.Идентификатор, ОписаниеПараметра);
	КонецЦикла;

	КлючНастроек = КлючНастроек("ПараметрыФункции", Истина);
	пбп_Переадресация.ХранилищеОбщихНастроекСохранить(КлючОбъекта(),
		КлючНастроек, Данные);

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

&НаСервере

Функция ПолучитьПараметрыФункции()

	КлючНастроек = КлючНастроек("ПараметрыФункции", Истина);
	Возврат пбп_Переадресация.ХранилищеОбщихНастроекЗагрузить(КлючОбъекта(),
		КлючНастроек, Новый Соответствие);

КонецФункции

&НаСервере

Функция КлючНастроек(Настройка, ИспользоватьУИД = Ложь)

	Если ИспользоватьУИД Тогда
		GUID = Объект.Ссылка.УникальныйИдентификатор();
		Возврат "пбп_ПользовательскиеФункции_" + Настройка + "_" + GUID;
	Иначе
		Возврат "пбп_ПользовательскиеФункции_" + Настройка;
	КонецЕсли;

КонецФункции

&НаСервереБезКонтекста

Функция СоздатьКоллекциюИПоместитьВХранилище(Знач Значение)

	ПустаяКоллекция = Новый(Тип(Значение));
	АдресЗначения = ПоместитьВоВременноеХранилище(ПустаяКоллекция, Новый УникальныйИдентификатор);

	Возврат АдресЗначения;

КонецФункции

#КонецОбласти

#Область Отладка

&НаКлиенте
Асинх Процедура СформироватьОбработкуОтладкиПослеЗаполненияПараметров(
	ПараметрыСохранения, ДополнительныеПараметры = Неопределено) Экспорт

	Если ПараметрыСохранения = Неопределено Тогда
		Возврат;
	КонецЕсли;

	КаталогВременныхФайлов = Ждать КаталогВременныхФайловАсинх();

	Если ЗначениеЗаполнено(КаталогВременныхФайлов) Тогда
		КаталогДляАрхива = ПолучитьИмяФайлаРаспакованногоАрхиваОбработки(КаталогВременныхФайлов);

		ИмяОбработки = "КаркасОтладки";
		ОтносительныйПутьКМодулюФормы = ИмяОбработки + "\Ext\ObjectModule.bsl";
		ПутьКФайлуМодуля = КаталогДляАрхива + ОтносительныйПутьКМодулюФормы;

		СтруктураПараметров = Новый Структура;
		Результат = Ждать ОбработатьМодульОбъектаОбработкиОтладкиЗаполнитьПараметры(ПутьКФайлуМодуля, СтруктураПараметров);
		Если Результат = Неопределено Тогда
			Возврат;
		КонецЕсли;

		АдресОбработкиВХранилище = Ждать ПолучитьПутьКНовойОбработкеОтладки(ПараметрыСохранения,
			КаталогВременныхФайлов, КаталогДляАрхива, ИмяОбработки);
		Если ПараметрыСохранения.Временная Тогда
			УдалитьФайлыНаКлиенте(ПараметрыСохранения.КаталогИнформационнойБазы);
		КонецЕсли;

		Если АдресОбработкиВХранилище <> Неопределено Тогда
			Результат = ВыполнитьОтладкуОбработки(АдресОбработкиВХранилище, СтруктураПараметров, КаталогВременныхФайлов);
		КонецЕсли;
	КонецЕсли;

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

&НаКлиенте


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ПриСозданииНаСервере`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекстСообщения = НСтр("ru = 'Открытие формы прервано, т.к. передан некорректный параметр формы ""Действие""'");

	ДоступныеДействия = ПолучитьДоступныеДействияФормы();
	Если Параметры.Свойство("Действие") И ДоступныеДействия.Найти(Параметры.Действие) <> Неопределено Тогда
		КлючДействия = Параметры.Действие;
	Иначе
		пбп_Переадресация.СообщитьПользователю(ТекстСообщения, , , , Отказ);
		Возврат;
	КонецЕсли;

	УстановитьСвойстваЭлементов(КлючДействия);

	УстановитьПривилегированныйРежим(Истина);
	СтруктураНастроек = пбп_Переадресация.ПрочитатьДанныеИзБезопасногоХранилища(
		ПолучитьВладельцаЗначенияБезопасногоХранилища(),
		ПолучитьКлючДанныхБезопасногоХранилища());
	УстановитьПривилегированныйРежим(Ложь);

	Если СтруктураНастроек <> Неопределено Тогда
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ТекстСообщения = НСтр("ru = 'Открытие формы прервано, т.к. передан некорректный параметр формы ""Действие""'");

	ДоступныеДействия = ПолучитьДоступныеДействияФормы();
	Если Параметры.Свойство("Действие") И ДоступныеДействия.Найти(Параметры.Действие) <> Неопределено Тогда
		КлючДействия = Параметры.Действие;
	Иначе
		пбп_Переадресация.СообщитьПользователю(ТекстСообщения, , , , Отказ);
		Возврат;
	КонецЕсли;

	УстановитьСвойстваЭлементов(КлючДействия);

	УстановитьПривилегированныйРежим(Истина);
	СтруктураНастроек = пбп_Переадресация.ПрочитатьДанныеИзБезопасногоХранилища(
		ПолучитьВладельцаЗначенияБезопасногоХранилища(),
		ПолучитьКлючДанныхБезопасногоХранилища());
	УстановитьПривилегированныйРежим(Ложь);

	Если СтруктураНастроек <> Неопределено Тогда
		ВариантПодключенияКБазе = СтруктураНастроек.СервернаяБаза;
		Если СтруктураНастроек.СервернаяБаза Тогда
			КластерСерверов			= СтруктураНастроек.КластерСерверов;
			ИмяИнформационнойБазы	= СтруктураНастроек.ИмяИнформационнойБазы;
		Иначе
			КаталогИнформационнойБазы = СтруктураНастроек.КаталогИнформационнойБазы;
		КонецЕсли;

		ИмяПользователя	= СтруктураНастроек.ИмяПользователя;
		Пароль			= СтруктураНастроек.Пароль;
	КонецЕсли;

	УстановитьВидимостьЭлементов();

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

&НаКлиенте

Процедура ВариантПодключенияКБазеПриИзменении(Элемент)

	УстановитьВидимостьЭлементов();

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

&НаКлиенте
Асинх Процедура КаталогИнформационнойБазыНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	Диалог.Заголовок			= НСтр("ru = 'Выберите каталог информационной базы'");
	Диалог.МножественныйВыбор	= Ложь;

	Результат = Ждать Диалог.ВыбратьАсинх();

	Если ЗначениеЗаполнено(Результат) Тогда
		ФайлБазы = Новый Файл(Результат[0] + "/1Cv8.1CD");
		ФайлСуществует = Ждать ФайлБазы.СуществуетАсинх();
		Если ФайлСуществует Тогда
			КаталогИнформационнойБазы = Результат[0];
		Иначе
			пбп_ПереадресацияКлиент.СообщитьПользователю(
				НСтр("ru = 'В каталоге отсутствует файл ИБ. Выберите каталог информационной базы 1С'"));
		КонецЕсли;
	КонецЕсли;

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

#КонецОбласти // ОбработчикиСобытийФормы

#Область ОбработчикиКомандФормы

&НаКлиенте

Процедура ВыполнитьДействиеПосле(Команда)

	СохранитьДанныеПриНеобходимости();

#Если ВебКлиент Или МобильноеПриложениеКлиент Или МобильныйКлиент Тогда
	ВызватьИсключение НСтр("ru = 'Создание внешней обработки недоступно в веб-клиенте и мобильном приложении'");
#Иначе
	Если КлючДействия = "ОбработкаЗагрузкиИзФайла" Тогда
		УказатьПутьКФайлуИЗакрытьФорму();
	ИначеЕсли КлючДействия = "ОбработкаОтладкиПользовательскойФункции" Тогда
		Закрыть(ПолучитьПараметрыАутентификацииИзФормы());
	КонецЕсли;
#КонецЕсли

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

&НаКлиенте

Процедура ЗакрытьФорму(Команда)
	Закрыть();
КонецПроцедуры

&НаСервере

Процедура ПоказатьПарольНаСервере(РежимПароля)
	Если РежимПароля Тогда
		Команды.Найти("ПоказатьПароль").Картинка = БиблиотекаКартинок.ПоказатьПароль;
	Иначе
		Команды.Найти("ПоказатьПароль").Картинка = БиблиотекаКартинок.СкрытьПароль;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ПоказатьПароль(Команда)

	РежимПароля = Не Элементы.Пароль.РежимПароля;

	Элементы.Пароль.РежимПароля = РежимПароля;

	ПоказатьПарольНаСервере(РежимПароля);

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

&НаКлиенте
Асинх Процедура СоздатьВременнуюФайловуюБазу(Команда)

	Результат = Ждать КаталогВременныхФайловАсинх();
	Если Результат <> Неопределено Тогда
		ФайловаяБаза = 0;
		КаталогИнформационнойБазы = Результат + "Временная информационная база";

		КомандаСозданияИнформационнойБазы = СтрШаблон("1cv8.exe CREATEINFOBASE File=""%1""", КаталогИнформационнойБазы);

		#Если Не ВебКлиент И Не МобильныйКлиент Тогда
			КаталогПрограммы = КаталогПрограммы();
		#Иначе
			КаталогПрограммы = "";
		#КонецЕсли

		Результат = Ждать ЗапуститьПриложениеАсинх(КомандаСозданияИнформационнойБазы, КаталогПрограммы, Истина);
		Если Результат <> 0 Тогда
			Закрыть(ПолучитьПараметрыАутентификацииИзФормы(Истина));
		Иначе
			Закрыть();
		КонецЕсли;
	КонецЕсли;

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

#КонецОбласти // ОбработчикиКомандФормы

#Область СлужебныеПроцедурыИФункции

&НаСервере

Функция ПолучитьДоступныеДействияФормы()

	Действия = Новый Массив;
	Действия.Добавить("ОбработкаЗагрузкиИзФайла");
	Действия.Добавить("ОбработкаОтладкиПользовательскойФункции");

	Возврат Действия;

КонецФункции

&НаСервере

Процедура УстановитьСвойстваЭлементов(КлючДействия)

	ОбщаяФормулировка = "ru = '%1.
	|Укажите параметры подключения к информационной базе, через которую будет выполнено создание обработки.
	|Важно, чтобы конфигуратор базы был не занят.'";
	Если КлючДействия = "ОбработкаЗагрузкиИзФайла" Тогда
		ЗаголовокТекст = СтрШаблон(ОбщаяФормулировка,
			"Для создания обработки загрузки из файла необходим доступ к конфигуратору");
		Элементы.ДекорацияЗаголовок.Заголовок = НСтр(ЗаголовокТекст, пбп_Переадресация.КодОсновногоЯзыка());

		Элементы.ВыполнитьДействиеПосле.Заголовок = НСтр("ru = 'Выбрать каталог сохранения и создать обработку'");
		Элементы.ВыполнитьДействиеПосле.Картинка = БиблиотекаКартинок.Записать;

		Элементы.ГруппаДопИнформация.Видимость = Ложь;
		Элементы.СоздатьВременнуюФайловуюБазу.Видимость = Ложь;
	Иначе // КлючДействия = ОбработкаОтладкиПользовательскойФункции
		ЗаголовокТекст = СтрШаблон(ОбщаяФормулировка,
			"Для создания внешний обработки, в которой будет размещен код пользовательской функции, необходим доступ к конфигуратору");
		Элементы.ДекорацияЗаголовок.Заголовок = НСтр(ЗаголовокТекст, пбп_Переадресация.КодОсновногоЯзыка());

		Элементы.ВыполнитьДействиеПосле.Заголовок = НСтр("ru = 'Создать обработку через подключение к базе'");
		Элементы.ВыполнитьДействиеПосле.Картинка = БиблиотекаКартинок.Обработка;

		#Если ВебКлиент Или МобильноеПриложениеКлиент Или МобильныйКлиент Тогда
			Элементы.ГруппаДопИнформация.Видимость = Ложь;
			Элементы.СоздатьВременнуюФайловуюБазу.Видимость = Ложь;
		#Иначе
			Элементы.ГруппаДопИнформация.Видимость = Истина;
			Элементы.СоздатьВременнуюФайловуюБазу.Видимость = Истина;
		#КонецЕсли
	КонецЕсли;

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

&НаСервере

Процедура УстановитьВидимостьЭлементов()

	Элементы.КаталогИнформационнойБазы.Видимость = Не ВариантПодключенияКБазе;
	Элементы.КластерСерверов.Видимость = ВариантПодключенияКБазе;
	Элементы.ИмяИнформационнойБазы.Видимость = ВариантПодключенияКБазе;

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

&НаСервере

Процедура СохранитьДанныеПриНеобходимости()

	Если Не ЗапомнитьДанные Тогда
		Возврат;
	КонецЕсли;

	СтруктураПодключения = Новый Структура;
	СтруктураПодключения.Вставить("СервернаяБаза", ВариантПодключенияКБазе = 1);
	Если ВариантПодключенияКБазе Тогда
		СтруктураПодключения.Вставить("КластерСерверов"			, КластерСерверов);
		СтруктураПодключения.Вставить("ИмяИнформационнойБазы"	, ИмяИнформационнойБазы);
	Иначе
		СтруктураПодключения.Вставить("КаталогИнформационнойБазы", КаталогИнформационнойБазы);
	КонецЕсли;

	СтруктураПодключения.Вставить("ИмяПользователя"	, ИмяПользователя);
	СтруктураПодключения.Вставить("Пароль"			, Пароль);

	УстановитьПривилегированныйРежим(Истина);
	пбп_Переадресация.ЗаписатьДанныеВБезопасноеХранилище(
		ПолучитьВладельцаЗначенияБезопасногоХранилища(),
		СтруктураПодключения,
		ПолучитьКлючДанныхБезопасногоХранилища());
	УстановитьПривилегированныйРежим(Ложь);

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

&НаСервереБезКонтекста

Функция ПолучитьВладельцаЗначенияБезопасногоХранилища()

	Если пбп_ОбщегоНазначенияСервер.СуществуетБиблиотекаСтандартныхПодсистем() Тогда
		Владелец = пбп_Переадресация.АвторизованныйПользователь();
	Иначе
		Владелец = "пбп_ОбщегоНазначения";
	КонецЕсли;

	Возврат Владелец;

КонецФункции

&НаСервереБезКонтекста


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало функция `ВалидироватьОбъекты`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Функция ВалидироватьОбъекты(Знач МассивОбъектов, Знач Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы)
Экспорт

	Если МассивОбъектов = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Параметр МассивОбъектов не может быть Неопределено'");
	КонецЕсли;

	Если Спецификация = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Параметр Спецификация не может быть Неопределено'");
	КонецЕсли;

	ИдентификаторыОшибокВалидации = Новый Массив;

	Если МассивСодержитПримитивныеТипы(МассивОбъектов) Тогда
		Если ВалидироватьПримитивныеТипы(МассивОбъектов, Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы) Тогда
			ИдентификаторыОшибокВалидации.Добавить();
		КонецЕсли;
		Возврат ИдентификаторыОшибокВалидации;
	КонецЕсли;

	МассивОбъектов = ПреобразоватьМассивОбъектов(МассивОбъектов);

	Для Каждого ОбъектМассива Из МассивОбъектов Цикл
		РезультатВалидации = пбп_ВалидаторПакетовСлужебный.Валидировать(ОбъектМассива, ИмяСхемы, Спецификация);
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ВалидироватьОбъекты(Знач МассивОбъектов, Знач Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы) Экспорт

	Если МассивОбъектов = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Параметр МассивОбъектов не может быть Неопределено'");
	КонецЕсли;

	Если Спецификация = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Параметр Спецификация не может быть Неопределено'");
	КонецЕсли;

	ИдентификаторыОшибокВалидации = Новый Массив;

	Если МассивСодержитПримитивныеТипы(МассивОбъектов) Тогда
		Если ВалидироватьПримитивныеТипы(МассивОбъектов, Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы) Тогда
			ИдентификаторыОшибокВалидации.Добавить();
		КонецЕсли;
		Возврат ИдентификаторыОшибокВалидации;
	КонецЕсли;

	МассивОбъектов = ПреобразоватьМассивОбъектов(МассивОбъектов);

	Для Каждого ОбъектМассива Из МассивОбъектов Цикл
		РезультатВалидации = пбп_ВалидаторПакетовСлужебный.Валидировать(ОбъектМассива, ИмяСхемы, Спецификация);

		Если Не РезультатВалидации.Результат Тогда
			ТекстСообщения = "";
			Для Каждого Ошибка Из РезультатВалидации.Ошибки Цикл
				ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Ошибка;
			КонецЦикла;

			СтатусОбъекта = пбп_Переадресация.СкопироватьРекурсивно(СтруктураИзСхемыОтвет);
			СтатусОбъекта.Идентификатор = ОбъектМассива.Идентификатор;
			СтатусОбъекта.Статус = ТекстСообщения;

			ОтветДанные.Добавить(СтатусОбъекта);
			ИдентификаторыОшибокВалидации.Добавить(ОбъектМассива.Идентификатор);
		КонецЕсли;
	КонецЦикла;

	Возврат ИдентификаторыОшибокВалидации;

КонецФункции

// Проверяет массив примитивных типов на ошибки валидации, возвращает Ложь, если ошибок нет.
//
// Параметры:
//  ВходящийМассив			 - Массив	 - Массив содержащий примитивные типы.
//  Спецификация			 - Строка	 - Спецификация openAPI
//  СтруктураИзСхемыОтвет	 - Структура - Структура ответа
//  ОтветДанные				 - Массив	- Ответ на запрос
//  ИмяСхемы				 - Строка	 - имя схемы спецификации Open API
//
// Возвращаемое значение:
//  Булево - Ложь, если ошибок нет, иначе истина.
//

Функция ВалидироватьПримитивныеТипы(Знач ВходящийМассив, Знач Спецификация, СтруктураИзСхемыОтвет, ОтветДанные, ИмяСхемы) Экспорт

	Если ВходящийМассив = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Параметр ВходящийМассив не может быть Неопределено'");
	КонецЕсли;

	Если Спецификация = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'Параметр Спецификация не может быть Неопределено'");
	КонецЕсли;

	ИдентификаторыОшибокВалидации = Новый Массив;

	РезультатВалидации = пбп_ВалидаторПакетовСлужебный.Валидировать(ВходящийМассив, ИмяСхемы, Спецификация);

	ОшибкаВалидации = Ложь;
	Если Не РезультатВалидации.Результат Тогда
		ТекстСообщения = "";
		Для Каждого Ошибка Из РезультатВалидации.Ошибки Цикл
			ТекстСообщения = ТекстСообщения + ?(ПустаяСтрока(ТекстСообщения), "", Символы.ПС) + Ошибка;
		КонецЦикла;

		СтатусОбъекта = пбп_Переадресация.СкопироватьРекурсивно(СтруктураИзСхемыОтвет);
		СтатусОбъекта.Статус = ТекстСообщения;

		ОтветДанные.Добавить(СтатусОбъекта);

		ОшибкаВалидации = Истина;
	КонецЕсли;

	Возврат ОшибкаВалидации;

КонецФункции

// Конвертирует передаваемое значение в значение типа JSON
//
// Параметры:
//  ВхЗначение - Произвольный - значение, которое необходимо конвертировать
//
// Возвращаемое значение:
//  Произвольный - конвертирование значение
//

Функция ЗначениеJSON(ВхЗначение) Экспорт

	Преобразованное = Неопределено;

	ТипЗначения = ТипЗнч(ВхЗначение);

	Если СтрНайти(Строка(ТипЗначения), "Перечисление.") > 0 Тогда
		Преобразованное = ПолучитьЗначениеПеречисления(ВхЗначение, ТипЗначения);
	ИначеЕсли ТипЗначения = Тип("Булево") Или ТипЗначения = Тип("Число") Тогда
		Преобразованное = ВхЗначение;
	Иначе
		Преобразованное = XMLСтрока(ВхЗначение);
	КонецЕсли;

	Возврат Преобразованное;

КонецФункции

// Возвращает имя перечисления по его синониму
//
// Параметры:
//  ВхЗначение	 - ПеречислениеСсылка - ссылка на перечисление, имя которого необходимо вывести
//  ТипЗначения	 - Тип - тип перечисления
//
// Возвращаемое значение:
//  Строка - имя перечисления
//

Функция ПолучитьЗначениеПеречисления(ВхЗначение, ТипЗначения = Неопределено) Экспорт

	ЗначениеПеречисления = "";

	Если ТипЗначения = Неопределено Тогда
		ТипЗначения = ТипЗнч(ВхЗначение);
	КонецЕсли;

	МетаданныеПоТипу = Метаданные.НайтиПоТипу(ТипЗначения);
	Для Каждого СтрокаЗначения Из МетаданныеПоТипу.ЗначенияПеречисления Цикл
		Если СтрокаЗначения.Синоним = Строка(ВхЗначение) Тогда
			ЗначениеПеречисления = СтрокаЗначения.Имя;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат ЗначениеПеречисления;

КонецФункции

// Инициализирует структуру объекта из схемы спецификации Open API
//
// Параметры:
//  Схемы		 - Соответствие - см. пбп_ВалидаторПакетовПовтИсп.СхемыДанныхСпецификации
//  ИмяОбъекта	 - Строка - имя объекта спецификации схему которой необходимо инициализировать.
//  Если необходимо получить схему вложенного в другой объект объекта, необходимо указать путь к нему через
//  точку. Например, если необходимо получить схему табличной части товары документа реализация товаров и услуг,
//  то следует передать следующее значение, соответствующее схеме: "РеализацияТоваровУслуг.Товары"
//
// Возвращаемое значение:
//  Структура - инициализированная по типам структура
//

Функция ИнициализироватьСтруктуруОбъектаИзСхемы(Схемы, ИмяОбъекта) Экспорт

	СвойстваОбъекта = ПолучитьСхемуСвойствОбъекта(Схемы, ИмяОбъекта);

	СтруктураОбъекта = Новый Структура;

	Для Каждого КлючИЗначение Из СвойстваОбъекта Цикл
		ТипИзСхемы = КлючИЗначение.Значение.Получить("type");
		Если ТипИзСхемы = "integer" Или ТипИзСхемы = "number" Тогда
			БазовоеЗначение = 0;
		ИначеЕсли ТипИзСхемы = "boolean" Тогда
			БазовоеЗначение = Ложь;
		ИначеЕсли ТипИзСхемы = "object" Тогда
			БазовоеЗначение = Новый Структура;
		ИначеЕсли ТипИзСхемы = "array" Тогда
			БазовоеЗначение = Новый Массив;
		Иначе
			БазовоеЗначение = "";
		КонецЕсли;

		СтруктураОбъекта.Вставить(КлючИЗначение.Ключ, БазовоеЗначение);
	КонецЦикла;

	Возврат СтруктураОбъекта;

КонецФункции

// Заполняет данные по схеме спецификации Open API из выборки результата запроса
// Данные выборки запроса должны иметь такие же наименовая колонок, как и структура схемы
//
// Параметры:
//  СтрокаДанных	 - СтрокаТаблицыЗначений, ВыборкаРезультатаЗапроса - строка, из которой необходимо заполнить строку структуры
//  СтруктураИзСхемы - Структура - см. ИнициализироватьСтруктуруОбъектаИзСхемы
//
// Возвращаемое значение:
//  Структура - заполненная структура данными из запроса
//


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ПриОтправкеДанныхУзлаПодчиненному`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ПриОтправкеДанныхУзлаПодчиненному(Источник, ЭлементДанных, Игнорировать)
Экспорт

	Событие = "ПриОтправкеДанныхУзлаПодчиненному";
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПриОтправкеДанныхУзлаПодчиненному(Источник, ЭлементДанных, Игнорировать) Экспорт

	Событие = "ПриОтправкеДанныхУзлаПодчиненному";
	ИмяМетода = ПолучитьИмяМетода(Источник, Событие);

	ПриОтправкеДанныхУзла(ИмяМетода, Источник, ЭлементДанных, Игнорировать);

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

// При получении данных узла от главного
//
// Параметры:
//  Источник		 - ПланОбменаОбъект	 - источник подписки на событие
//  ЭлементДанных	 - Произвольный		 - элемент данных
//  Игнорировать	 - Булево			 - игнорировать
//

Процедура ПриПолученииДанныхУзлаОтГлавного(Источник, ЭлементДанных, Игнорировать) Экспорт

	Событие = "ПриПолученииДанныхУзлаОтГлавного";
	ИмяМетода = ПолучитьИмяМетода(Источник, Событие);

	ПриОтправкеДанныхУзла(ИмяМетода, Источник, ЭлементДанных, Игнорировать);

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

// При автоматическом создании нового узла
//
// Параметры:
//  Источник - ПланОбменаОбъект	 - источник подписки на событие
//  Отказ	 - Булево			 - отказ
//

Процедура ПриАвтоматическомСозданииНовогоУзла(Источник, Отказ) Экспорт

	Событие = "ПриАвтоматическомСозданииНовогоУзла";
	ИмяМетода = ПолучитьИмяМетода(Источник, Событие);

	ВыполнитьСПараметрамиИсточникИОтказ(ИмяМетода, Источник, Отказ);

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

// Перед созданием начального образа
//
// Параметры:
//  Источник				 - ПланОбменаОбъект		 - источник подписки на событие
//  ТолькоЗарегистрированные - Булево				 - только зарегистрированные
//  ПотокОбменаДанными		 - ПотокОбменаДанными	 - поток обмена данными
//

Процедура ПередСозданиемНачальногоОбраза(Источник, ТолькоЗарегистрированные, ПотокОбменаДанными) Экспорт

	Событие = "ПередСозданиемНачальногоОбраза";
	ИмяМетода = ПолучитьИмяМетода(Источник, Событие);

	Если ЗначениеЗаполнено(ИмяМетода) Тогда
		Попытка
			ПараметрыМетода = Новый Массив;
			ПараметрыМетода.Добавить(Источник);
			ПараметрыМетода.Добавить(ТолькоЗарегистрированные);
			ПараметрыМетода.Добавить(ПотокОбменаДанными);

			пбп_Переадресация.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);

			ТолькоЗарегистрированные	= ПараметрыМетода[1];
			ПотокОбменаДанными			= ПараметрыМетода[2];
		Исключение
			ВызватьИсключение ПолучитьТекстОшибки(ИмяМетода, ОписаниеОшибки());
		КонецПопытки;
	КонецЕсли;

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

// Перед началом отправки данных подчиненному
//
// Параметры:
//  Источник			 - ПланОбменаОбъект		 - источник подписки на событие
//  ПотокОбменаДанными	 - ПотокОбменаДанными	 - поток обмена данными
//

Процедура ПередНачаломОтправкиДанныхПодчиненному(Источник, ПотокОбменаДанными) Экспорт

	Событие = "ПередНачаломОтправкиДанныхПодчиненному";
	ИмяМетода = ПолучитьИмяМетода(Источник, Событие);

	ПередНачаломОтправкиДанных(ИмяМетода, Источник, ПотокОбменаДанными);

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

// Перед началом отправки данных главному
//
// Параметры:
//  Источник			 - ПланОбменаОбъект		 - источник подписки на событие
//  ПотокОбменаДанными	 - ПотокОбменаДанными	 - поток обмена данными
//

Процедура ПередНачаломОтправкиДанныхГлавному(Источник, ПотокОбменаДанными) Экспорт

	Событие = "ПередНачаломОтправкиДанныхГлавному";
	ИмяМетода = ПолучитьИмяМетода(Источник, Событие);

	ПередНачаломОтправкиДанных(ИмяМетода, Источник, ПотокОбменаДанными);

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

#КонецОбласти // ПланыОбмена

#КонецОбласти // ПрограммныйИнтерфейс

#Область СлужебныеПроцедурыИФункции

// Получить функцию соответствия обработчиков
//
// Параметры:
//  Источник	 - Произвольный	 - объект, набор записей или менеджер
//  Событие		 - Строка		 - имя события подписки
//
// Возвращаемое значение:
//  Строка - имя метода, где будет расположено получение соответствия обработчиков событий
//

Функция ПолучитьИмяФункцииСоответствияОбработчиковСобытий(Источник, Событие)

	ТипЗначения = ТипЗнч(Источник);
	ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);

	Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Справочники";
	ИначеЕсли Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Документы";
	ИначеЕсли Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Перечисления";
	ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "ПланыВидовХарактеристик";
	ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "ПланыСчетов";
	ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "ПланыВидовРасчета";
	ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "БизнесПроцессы";
	ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Задачи";
	ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "ПланыОбмена";
	ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "РегистрыСведений";
	ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "РегистрыНакопления";
	ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "РегистрыБухгалтерии";
	ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "РегистрыРасчета";
	ИначеЕсли Метаданные.Константы.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Константы";
	ИначеЕсли Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Обработки";
	ИначеЕсли Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Отчеты";
	ИначеЕсли Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "ЖурналыДокументов";
	ИначеЕсли Метаданные.КритерииОтбора.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "КритерииОтбора";
	ИначеЕсли Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "Последовательности";
	ИначеЕсли Метаданные.ХранилищаНастроек.Содержит(ОбъектМетаданных) Тогда
		ПрефиксМетода = "ХранилищаНастроек";
	Иначе
		Возврат Неопределено;
	КонецЕсли;

	Возврат СтрШаблон("%1%2", ПрефиксМетода, Событие);

КонецФункции

// Получить имя метода
//
// Параметры:
//  Источник	 - Произвольный	 - объект, набор записей или менеджер
//  Событие		 - Строка		 - имя события подписки
//
// Возвращаемое значение:
//  Строка - имя метода, которое должно быть вызвано при возникновении подписки на событие
//

Функция ПолучитьИмяМетода(Источник, Событие)

	МетодСоответствия = ПолучитьИмяФункцииСоответствияОбработчиковСобытий(Источник, Событие);

	Если Не ЗначениеЗаполнено(МетодСоответствия) Тогда
		ВызватьИсключение НСтр("ru = 'Параметр ИмяМетода не может быть пустым'");
	КонецЕсли;

	// BSLLS:ExecuteExternalCodeInCommonModule-off
	ПолноеИмяМетода = СтрШаблон("пбп_ОбработкаСобытийПовтИсп.%1", МетодСоответствия);
	СоответствиеОбработчиков = пбп_Переадресация.ВызватьФункциюКонфигурации(ПолноеИмяМетода);
	// BSLLS:ExecuteExternalCodeInCommonModule-on

	ИмяМетодаОбработчика = СоответствиеОбработчиков.Получить(ТипЗнч(Источник));

	Возврат ИмяМетодаОбработчика;

КонецФункции

// Получить текст ошибки
//
// Параметры:
//  ИмяМетода		 - Строка	 - см. ПолучитьИмяМетода
//  ОписаниеОшибки	 - Строка	 - текст ошибки исключения
//
// Возвращаемое значение:
//  Строка - сформированный текст ошибки мультиязычный
//

Функция ПолучитьТекстОшибки(ИмяМетода, ОписаниеОшибки)

	ТекстОшибки = СтрШаблон("ru = '%1%2 Имя метода: %3';en = '%1%2Method name: %3'",
		ОписаниеОшибки, Символы.ПС, ИмяМетода);

	Возврат НСтр(ТекстОшибки);

КонецФункции


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало процедура `ИсполняемыеСценарии`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Процедура ИсполняемыеСценарии()
Экспорт

	ЮТТесты
		.ДобавитьТестовыйНабор("Получить обработчик ресурса")
			.ДобавитьТест("Тест_ПолучитьОбработчикРесурса")
		.ДобавитьТестовыйНабор("Обработать запрос спецификации")
    // TODO: допиши оставшуюся часть

[Assistant]
#Область ПрограммныйИнтерфейс

Процедура ИсполняемыеСценарии() Экспорт

	ЮТТесты
		.ДобавитьТестовыйНабор("Получить обработчик ресурса")
			.ДобавитьТест("Тест_ПолучитьОбработчикРесурса")
		.ДобавитьТестовыйНабор("Обработать запрос спецификации")
			.ДобавитьТест("Тест_ОбработатьЗапросСпецификации")
		.ДобавитьТестовыйНабор("Получить спецификацию сервиса")
			.ДобавитьТест("Тест_ПолучитьСпецификациюСервиса")
	;

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

Функция Тест_ПолучитьОбработчикРесурса() Экспорт

	Варианты = ЮТест.Варианты("Ресурс, КодСостояния, СодержитОшибку, Вызов")
		.Добавить("/docs/openapi", , Ложь, "Вызов 1")
		.Добавить("/openapi_test", 501, Истина, "Вызов 2")
		.Добавить("/openapi.json", 501, Истина, "Вызов 3")
		.Добавить("/spec/openapi.json", , Ложь, "Вызов 4")
	;

	КодыСостояния = пбп_КоннекторHTTP.КодыСостоянияHTTP();

	КлючДанные = "Данные";
	КлючКодСостояния = "КодСостояния";

	Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
		Результат = пбп_ПостроительСпецификацииOpenAPI.ПолучитьОбработчикРесурса(Вариант.Ресурс, КодыСостояния);

		ЮТест.ОжидаетЧто(Результат, Вариант.Вызов)
			.ИмеетТип("Структура")
				.ИмеетСвойство(КлючДанные)
				.ИмеетСвойство(КлючКодСостояния)
		;

		Если Вариант.СодержитОшибку Тогда
			ЮТест.ОжидаетЧто(Результат.Данные).Равно(Неопределено);
			ЮТест.ОжидаетЧто(Результат.КодСостояния).Равно(Вариант.КодСостояния);
		Иначе
			ЮТест.ОжидаетЧто(Результат.Данные).Заполнено();
			ЮТест.ОжидаетЧто(Результат.КодСостояния).Равно(Неопределено);
		КонецЕсли;

	КонецЦикла;

КонецФункции

Процедура Тест_ОбработатьЗапросСпецификации() Экспорт

	Варианты = ЮТест.Варианты("ОтносительныйURL, ОжидаемыйКод, ОжидаемыйРезультат, СодержитОшибку, Вызов")
		.Добавить("/docs/openapi", 200, "", Ложь, "Вызов 1")
		.Добавить("/openapi_test", 404, пбп_КоннекторHTTP.ПредставлениеКодаСостоянияHTTP(404), Истина, "Вызов 2")
		.Добавить("/openapi.json", 404, пбп_КоннекторHTTP.ПредставлениеКодаСостоянияHTTP(404), Истина, "Вызов 3")
		.Добавить("/spec/openapi.json", 500, пбп_КоннекторHTTP.ПредставлениеКодаСостоянияHTTP(500), Истина, "Вызов 4")
	;

	Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
		Запрос = ЮТест.Данные().HTTPСервисЗапрос();
		Запрос.ОтносительныйURL(Вариант.ОтносительныйURL);
		Ответ = пбп_ПостроительСпецификацииOpenAPI.ОбработатьЗапросСпецификации(Запрос);

		ЮТест.ОжидаетЧто(Ответ.КодСостояния, Вариант.Вызов).Равно(Вариант.ОжидаемыйКод);

		Если Вариант.СодержитОшибку Тогда
			ЮТест.ОжидаетЧто(Ответ.ПолучитьТелоКакСтроку()).Содержит(Вариант.ОжидаемыйРезультат);
		КонецЕсли;
	КонецЦикла;

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

Функция Тест_ПолучитьСпецификациюСервиса() Экспорт

	ИменаМакетов = пбп_ПостроительСпецификацииOpenAPIПереопределяемый.ИменаМакетовСервисов();

	МокПостроитель = Мокито.Обучение(пбп_ПостроительСпецификацииOpenAPI);
	Для Каждого Пара Из ИменаМакетов Цикл
		УсловиеПредикат = ЮТест.Предикат()
			.ИмеетТип("Строка")
			.Равно(Пара.Ключ)
			.Получить()
		;

		МокПостроитель
			.Когда("ПолучитьСпецификациюСервиса", Мокито.МассивПараметров(УсловиеПредикат))
			.Вернуть("Успешно")
		;
	КонецЦикла;
	МокПостроитель.Прогон();

	Варианты = ЮТест.Варианты("ИмяСервиса, СодержитОшибку, Вызов")
		.Добавить("ИмяСервиса", Ложь, "Вызов 1")
		.Добавить("test", Истина, "Вызов 2")
		.Добавить("ИмяСервиса1", Истина, "Вызов 3")
	;

	Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
		Если Вариант.СодержитОшибку Тогда
			Параметры = Новый Массив;
			Параметры.Добавить(Вариант.ИмяСервиса);

			ТекстОшибки = пбп_ПереадресацияКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Не найдена спецификация сервиса %1'"),
				Вариант.ИмяСервиса);

			ЮТест.ОжидаетЧто(пбп_ПостроительСпецификацииOpenAPI, Вариант.Вызов)
				.Метод("ПолучитьСпецификациюСервиса", Параметры)
				.ВыбрасываетИсключение(ТекстОшибки);
		Иначе
			Результат = пбп_ПостроительСпецификацииOpenAPI.ПолучитьСпецификациюСервиса(Вариант.ИмяСервиса);
			ЮТест.ОжидаетЧто(Результат, Вариант.Вызов)
				.ИмеетТип("Строка")
				.Равно("Успешно")
			;
		КонецЕсли;
	КонецЦикла;

КонецФункции

#КонецОбласти // ПрограммныйИнтерфейс


[System] Ты пишешь корректный код на 1С:Enterprise Script и отвечаешь только кодом, если тебя просят дописать код.

[User]
Дополни код на 1С. Ниже начало функция `РазобратьПоток`.
Сохрани стиль и синтаксис, верни только готовый код без пояснений.

Функция РазобратьПоток(Знач Поток)
Экспорт

	ТД = Новый ТекстовыйДокумент;
	ТД.УстановитьТекст(Поток);

	СписокОбъектов = Новый Массив;
	ТекущийОбъект = Неопределено;

	Для Сч = 1 По ТД.КоличествоСтрок() Цикл

		Текст = ТД.ПолучитьСтроку(Сч);
		Если ПустаяСтрока(Текст) или ТекущийОбъект = Неопределено Тогда
			Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда
				Продолжить; // очередная пустая строка подряд
			КонецЕсли;

			ТекущийОбъект = Новый Соответствие;
			СписокОбъектов.Добавить(ТекущийОбъект);
		КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Функция РазобратьПоток(Знач Поток) Экспорт

	ТД = Новый ТекстовыйДокумент;
	ТД.УстановитьТекст(Поток);

	СписокОбъектов = Новый Массив;
	ТекущийОбъект = Неопределено;

	Для Сч = 1 По ТД.КоличествоСтрок() Цикл

		Текст = ТД.ПолучитьСтроку(Сч);
		Если ПустаяСтрока(Текст) или ТекущийОбъект = Неопределено Тогда
			Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда
				Продолжить; // очередная пустая строка подряд
			КонецЕсли;

			ТекущийОбъект = Новый Соответствие;
			СписокОбъектов.Добавить(ТекущийОбъект);
		КонецЕсли;

		СтрокаРазбораИмя      = "";
		СтрокаРазбораЗначение = "";

		Если РазобратьНаКлючИЗначение(Текст, СтрокаРазбораИмя, СтрокаРазбораЗначение) Тогда
			ТекущийОбъект[СтрокаРазбораИмя] = СтрокаРазбораЗначение;
		КонецЕсли;

	КонецЦикла;

	Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда
		СписокОбъектов.Удалить(СписокОбъектов.ВГраница());
	КонецЕсли;

	Возврат СписокОбъектов;

КонецФункции

Функция ПолучитьПутьКRAC(ТекущийПуть, Знач ВерсияПлатформы = "")

	Если НЕ ПустаяСтрока(ТекущийПуть) Тогда
		ФайлУтилиты = Новый Файл(ТекущийПуть);
		Если ФайлУтилиты.Существует() Тогда
			Лог.Отладка("Текущая версия rac " + ФайлУтилиты.ПолноеИмя);
			Возврат ФайлУтилиты.ПолноеИмя;
		КонецЕсли;
	КонецЕсли;

	Если ПустаяСтрока(ВерсияПлатформы) Тогда
		ВерсияПлатформы = "8.3";
	КонецЕсли;

	Конфигуратор = Новый УправлениеКонфигуратором;
	ПутьКПлатформе = Конфигуратор.ПолучитьПутьКВерсииПлатформы(ВерсияПлатформы);
	Лог.Отладка("Используемый путь для поиска rac " + ПутьКПлатформе);
	КаталогУстановки = Новый Файл(ПутьКПлатформе);
	Лог.Отладка(КаталогУстановки.Путь);

	ИмяФайла = ?(ЭтоWindows, "rac.exe", "rac");

	ФайлУтилиты = Новый Файл(ОбъединитьПути(Строка(КаталогУстановки.Путь), ИмяФайла));
	Если ФайлУтилиты.Существует() Тогда
		Лог.Отладка("Текущая версия rac " + ФайлУтилиты.ПолноеИмя);
		Возврат ФайлУтилиты.ПолноеИмя;
	КонецЕсли;

	Возврат ТекущийПуть;

КонецФункции

Функция РазобратьНаКлючИЗначение(Знач СтрокаРазбора, Ключ, Значение)

	ПозицияРазделителя = Найти(СтрокаРазбора, ":");
	Если ПозицияРазделителя = 0 Тогда
		Возврат Ложь;
	КонецЕсли;

	Ключ     = СокрЛП(Лев(СтрокаРазбора, ПозицияРазделителя - 1));
	Значение = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1));

	Возврат Истина;

КонецФункции

Функция ПолучитьСоставляющиеФильтра(СтрокаФильтра)

	Результат = Новый Структура;
	СоставФильтра = СтрРазделить(СтрокаФильтра, "|", Ложь);

	Для Каждого ТекСтр Из СоставФильтра Цикл
		РазобратьСоставляющуюФильтра(Результат, ТекСтр);
	КонецЦикла;

	Возврат Результат;

КонецФункции

Процедура РазобратьСоставляющуюФильтра(РезультатСтруктура, Составляющая)

	ПозРавно = СтрНайти(Составляющая, "=");
	Если ПозРавно=0 Тогда
		Возврат;
	КонецЕсли;

	ИмяФильтра = Лев(Составляющая, ПозРавно - 1);

	Попытка
		ПроверкаИмени = Новый Структура(ИмяФильтра);
	Исключение
		Возврат;
	КонецПопытки;

	СодержаниеСтрока = Сред(Составляющая, ПозРавно + 1);
	Если ПустаяСтрока(СодержаниеСтрока) Тогда
		Возврат;
	КонецЕсли;

	СодержаниеМассив = СтрРазделить(СодержаниеСтрока, ";", Ложь);
	РезультатСтруктура.Вставить(ИмяФильтра, СодержаниеМассив);

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

Функция СеансВФильтре(Сеанс)

	Результат = Истина;

	Если Не ЗначениеЗаполнено(мНастройки.ФильтрСеансов) Тогда
		Возврат Результат;
	КонецЕсли;

	Результат = Результат И ПараметрСеансаВФильтре("appid", Сеанс.Приложение);
	Результат = Результат И ПараметрСеансаВФильтре("name", Сеанс.Пользователь);

	Возврат Результат;

КонецФункции

Функция ПараметрСеансаВФильтре(ИмяФильтра, ПроверяемоеЗначение)

	Если Не ЗначениеЗаполнено(мНастройки.ФильтрСеансов) Или Не мНастройки.ФильтрСеансов.Свойство(ИмяФильтра) Тогда
		Возврат Истина;
	КонецЕсли;

	ЗначенияФильтра = мНастройки.ФильтрСеансов[ИмяФильтра];
	Для Каждого ТекЗначение Из ЗначенияФильтра Цикл
		ВФильтре = ВРег(ТекЗначение)=ВРег(ПроверяемоеЗначение);
		Если ВФильтре Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;

	Возврат Ложь;

КонецФункции

/////////////////////////////////////////////////////////////////////////////////
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
Лог = Логирование.ПолучитьЛог("vanessa.app.deployka");

deployka-master/src/Классы/КомандаУправлениеСеансами.os