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

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

Function ИмяФункции(Val SecretKey, Val Payload = Undefined, Val ExtraHeaders = Undefined) Export

	If Payload = Undefined Then
		Payload = New Structure;
	EndIf;

	header = New Structure;
	header.Insert("typ", "JWT");
	header.Insert("alg", "HS256");
	If ExtraHeaders <> Undefined Then
		For Each eh In ExtraHeaders Do
			header.Insert(eh.Key, eh.Value);
		EndDo;
	EndIf;

	headerBytes = GetBinaryDataFromString(ComposeJSON(header));
	payloadBytes = GetBinaryDataFromString(ComposeJSON(Payload));

	segments = New Array;
	segments.Add(Base64UrlEncode(headerBytes));
	segments.Add(Base64UrlEncode(payloadBytes));

	stringToSign = StrConcat(segments, ".");

	signature = Cryptography.HMAC(
		GetBinaryDataFromString(SecretKey),
		GetBinaryDataFromString(stringToSign),
		HashFunction.SHA256);

	segments.Add(Base64UrlEncode(signature));

	res = StrConcat(segments, ".");

	Return res;

EndFunction

Function Decode(Val Token, Val SecretKey, Val Verify = True) Export

	parts = StrSplit(Token, ".");
	If parts.Count() <> 3 Then
		Raise "JWT.Decode: Token must consist from 3 delimited by dot parts";
	EndIf;

	header = parts[0];
	payload = parts[1];
	crypto = Base64UrlDecode(parts[2]);

	headerJson = GetStringFromBinaryData(Base64UrlDecode(header));
	payloadJson = GetStringFromBinaryData(Base64UrlDecode(payload));

	headerData = ParseJSON(headerJson);
	payloadData = ParseJSON(payloadJson);

	If Verify Then
		If headerData.Property("alg") Then
			If headerData.alg <> "HS256" Then
				Raise "JWT.Decode: unsopported algorithm: " + headerData.alg;
			EndIf;
		Else
			Raise "JWT.Decode: header doesn't contain field 'alg'";
		EndIf;

		signature = Cryptography.HMAC(
			GetBinaryDataFromString(SecretKey),
			GetBinaryDataFromString(header + "." + payload),
			HashFunction.SHA256);

		If Base64String(crypto) <> Base64String(signature) Then
			Raise "JWT.Decode: Invalid signature";
		EndIf;

	EndIf;

	Return payloadData;

EndFunction

Function Base64UrlEncode(Val input)

	output = Base64String(input);
	output = StrSplit(output, "=")[0]; // Remove any trailing '='s
	output = StrReplace(output, Chars.CR + Chars.LF, "");
	output = StrReplace(output, "+", "-"); // 62nd char of encoding
	output = StrReplace(output, "/", "_"); // 63rd char of encoding
	Return output;

EndFunction

Function Base64UrlDecode(Val input)

	res = input;
	res = StrReplace(input, "-", "+"); // 62nd char of encoding
	res = StrReplace(res, "_", "/"); // 63rd char of encoding
	m = StrLen(res) % 4;
	If m = 1 Then
		Raise "JWT.Base64UrlDecode: Illegal base64url string: " + input;
	ElsIf m = 2 Then
		res = res + "=="; // Two pad chars
	ElsIf m = 3 Then
		res = res + "="; // One pad char
	EndIf;
	return Base64Value(res);

EndFunction

Function ComposeJSON(Obj, LineBreak = Undefined) Export

	If Not ValueIsFilled(Obj) Then
		Return "";
	EndIf;

	If LineBreak = Undefined Then
		LineBreak = JSONLineBreak.None;
	EndIf;

	JSONWriter = New JSONWriter;
	Settings = New JSONWriterSettings(LineBreak);
	JSONWriter.SetString(Settings);
	WriteJSON(JSONWriter, Obj);
	Return JSONWriter.Close();

EndFunction

Function ParseJSON(Json) Export

	If Not ValueIsFilled(Json) Then
		Return Undefined;
	EndIf;

	JSONReader = New JSONReader;
	JSONReader.SetString(Json);
	Return ReadJSON(JSONReader, False);

EndFunction

Procedure Test() Export

	SecretKey = "secret";
	Payload = New Structure;
	Payload.Insert("sub", "1234567890");
	Payload.Insert("name", "John Doe");
	Payload.Insert("admin", True);

	Token = Encode(SecretKey, Payload);

	DecodedPayload = Decode(Token, SecretKey);

EndProcedure

[Assistant] Function Encode(Val SecretKey, Val Payload = Undefined, Val ExtraHeaders = Undefined)


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

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

#Region Private

Procedure ИмяФункции(CopiedObject)
	For Each Row In Rights Do
		NewID = New UUID;
		FindRestrictions = RestrictionByCondition.FindRows(New Structure("RowID", Row.RowID));
		For Each Restriction In FindRestrictions Do
			Restriction.RowID = NewID;
		EndDo;
		Row.RowID = NewID;
		ConfigRoles = False;
	EndDo;

	FindConfigRole = Rights.FindRows(New Structure("ObjectType", Enums.Roles_MetadataTypes.Configuration));
	For Each Row In FindConfigRole Do
		Rights.Delete(Row);
	EndDo;
EndProcedure

Procedure BeforeWrite(Cancel)

	If DataExchange.Load Then
		Return;
	EndIf;

	If ConfigRoles And Not AdditionalProperties.Property("Update") Then
		Cancel = True;
	EndIf;

	If Not SetSeparateRightToStandardAttributes And Not ConfigRoles Then

		FindRowsWithStandardAttribures = Rights.FindRows(New Structure("ObjectSubtype", Enums.Roles_MetadataSubtype.StandardAttribute));
		For Each Row In FindRowsWithStandardAttribures Do
			Rights.Delete(Row);
		EndDo;

		FindFirstLvlType = Rights.FindRows(New Structure("ObjectSubtype, RightName", Enums.Roles_MetadataSubtype.EmptyRef(), Enums.Roles_Rights.View));
		FillStandardAttributes(FindFirstLvlType);

		FindFirstLvlType = Rights.FindRows(New Structure("ObjectSubtype, RightName", Enums.Roles_MetadataSubtype.EmptyRef(), Enums.Roles_Rights.Edit));
		FillStandardAttributes(FindFirstLvlType);
	EndIf;
EndProcedure

Procedure FillStandardAttributes(Val FindFirstLvlType)
	For Each Row In FindFirstLvlType Do
		If Roles_Settings.hasStandardAttributes(Row.ObjectType) Then
			For Each StAttribute In Metadata.FindByFullName(Row.ObjectPath).StandardAttributes Do
				NewRow = Rights.Add();
				FillPropertyValues(NewRow, Row);
				NewRow.ObjectSubtype = Enums.Roles_MetadataSubtype.StandardAttribute;
				NewRow.ObjectPath = NewRow.ObjectPath + ".StandardAttribute." + Roles_SettingsReUse.TranslationList(StAttribute.Name)
			EndDo;
		EndIf;
	EndDo;
EndProcedure

#EndRegion

[Assistant] Procedure OnCopy(CopiedObject)


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

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

Procedure ConvertToBSLCodeRecursion(Rows, Array, FunctionMap, AdditionalParamsStructure, Query)
For Each Row In Rows Do

		If IsBlankString(Row.ConditionText) Then
			If Row.Condition = "endif" Then
				Row.Condition = Row.Condition + ";";
			EndIf;
			Array.Add(Row.Condition);
		Else
			CodeTypeOrData = CodeTypeOrData(Row.ConditionText, AdditionalParamsStructure, Query);

			If TypeOf(CodeTypeOrData) = Type("Boolean") Then
				Array.Add(Row.Condition + " " + Row.ConditionText + " Then");
			Else
				Array.Add(Row.Condition + " " + "QueryFunction" + Format(FunctionMap.Count()) + "(Query) Then");

				TmpArray = New Array;
				TmpArray.Add("Function " + "QueryFunction" + Format(FunctionMap.Count()) + "(Query)");
    // TODO: допиши оставшуюся часть

[Assistant]
Procedure ConvertToBSLCodeRecursion(Rows, Array, FunctionMap, AdditionalParamsStructure, Query)
	For Each Row In Rows Do

		If IsBlankString(Row.ConditionText) Then
			If Row.Condition = "endif" Then
				Row.Condition = Row.Condition + ";";
			EndIf;
			Array.Add(Row.Condition);
		Else
			CodeTypeOrData = CodeTypeOrData(Row.ConditionText, AdditionalParamsStructure, Query);

			If TypeOf(CodeTypeOrData) = Type("Boolean") Then
				Array.Add(Row.Condition + " " + Row.ConditionText + " Then");
			Else
				Array.Add(Row.Condition + " " + "QueryFunction" + Format(FunctionMap.Count()) + "(Query) Then");

				TmpArray = New Array;
				TmpArray.Add("Function " + "QueryFunction" + Format(FunctionMap.Count()) + "(Query)");
				TmpArray.Add("Query.Text = """ + CodeTypeOrData + """;");
				TmpArray.Add("Return Query.Execute().Unload()[0].Result;");
				TmpArray.Add("EndFunction");
				FunctionMap.Insert("QueryFunction" + Format(FunctionMap.Count()), TmpArray);
			EndIf;
		EndIf;

		Text = PrepareQueryText(Row.Code);
		Array.Add("ArrayText.Add(""" + Text + """);");

		ConvertToBSLCodeRecursion(Row.GetItems(), Array, FunctionMap, AdditionalParamsStructure, Query);
	EndDo;
EndProcedure

#EndRegion

#Region ConvertToInternalBSLCode

&AtServer

Procedure ConvertToInternalBSLCodeAtServer()
	ArrayBSLCode = New Array;
	ArrayBSLCode.Add("ArrayText = New Array;");

	ArrayBSLCode.Add("Query = New Query;
	|
	|	AdditionalParamsStructure = New Structure;
	|For Each Param In SessionParametersTable Do
	|	Query.SetParameter(Param.Name, Param.Value);
	|	AdditionalParamsStructure.Insert(Param.Name, Param.Value);
	|EndDo;");

	Query = New Query;

	AdditionalParamsStructure = New Structure;
	For Each Param In SessionParametersTable Do
		Query.SetParameter(Param.Name, Param.Value);
		AdditionalParamsStructure.Insert(Param.Name, Param.Value);
	EndDo;

	ConvertToInternalBSLCodeRecursion(DebugTree.GetItems()[0].GetItems(), ArrayBSLCode,  AdditionalParamsStructure, Query);

	BSLCode = StrConcat(ArrayBSLCode, Chars.LF);
EndProcedure

&AtServer

Procedure ConvertToInternalBSLCodeRecursion(Rows, Array,  AdditionalParamsStructure, Query)
	For Each Row In Rows Do

		If IsBlankString(Row.ConditionText) Then
			If Row.Condition = "endif" Then
				Row.Condition = Row.Condition + ";";
			EndIf;
			Array.Add(Row.Condition);
		Else
			CodeTypeOrData = CodeTypeOrData(Row.ConditionText, AdditionalParamsStructure, Query);

			If TypeOf(CodeTypeOrData) = Type("Boolean") Then
				Array.Add(Row.Condition + " " + Row.ConditionText + " Then");
			Else
				Array.Add("Query.Text = """ + CodeTypeOrData + """;");
				Array.Add(Row.Condition + " Query.Execute().Unload()[0].Result Then");
			EndIf;
		EndIf;

		Text = PrepareQueryText(Row.Code);
		Array.Add("ArrayText.Add(""" + Text + """);");

		ConvertToInternalBSLCodeRecursion(Row.GetItems(), Array, AdditionalParamsStructure, Query);
	EndDo;
EndProcedure

#EndRegion

&AtServer

Function CodeTypeOrData(Val Code, AdditionalParamsStructure, Query)
	//@skip-warning
	Result = Undefined;
	ErrorList = New Array;
	Try
		Execute("Result = " + Code);
		Return False;
	Except
		ErrorList.Add(DetailErrorDescription(ErrorInfo()));
	EndTry;

	// try to create query
	Code = StrReplace(Code, "AdditionalParamsStructure.", "&");
	Query.Text =
	"SELECT TOP 1
	|	CASE
	|		WHEN (" + Code + ")
	|			THEN TRUE
	|		ELSE FALSE
	|	END AS Result";

	Try
		Query.Execute();
		Text = Query.Text;
		Text = PrepareQueryText(Text);

		Return Text;
	Except
		ErrorList.Add(DetailErrorDescription(ErrorInfo()));
	EndTry;

	For Each Row In ErrorList Do
		Roles_CommonFunctionsClientServer.ShowUsersMessage(Row);
	EndDo;

	Return ErrorList;
EndFunction

&AtServer

Procedure RunBSLCodeAtServer()
	ArrayText = New Array;
	Execute(BSLCode);
	BSLResult = StrConcat(ArrayText, Chars.LF);
EndProcedure

&AtServer

Procedure RunReportAtServer()
	DCSTemplate = GetCommonTemplate("Roles_DCS");

	For Each ParamStr In SessionParametersTable Do
		NewParam = DCSTemplate.Parameters.Add();
		NewParam.Name = ParamStr.Name;
		NewParam.Value = ParamStr.Value;
		NewParam.Use = DataCompositionParameterUse.Always;
	EndDo;

	QueryText = StrReplace(QueryText, FindStringIntoQuery, ReplaceStringWith);

	DataSet = DCSTemplate.DataSets[0];
	DataSet.Query = (QueryText);

	Address = PutToTempStorage(DCSTemplate, UUID);
	SettingsComposer.Initialize(New DataCompositionAvailableSettingsSource(Address));

	SettingsComposer.LoadSettings(DCSTemplate.DefaultSettings);
	SettingsComposer.Settings.Selection.Items.Clear();
	For Each Field In SettingsComposer.Settings.Selection.SelectionAvailableFields.Items Do
		If Field.Folder Then
			Continue;
		EndIf;
		Selection = SettingsComposer.Settings.Selection.Items.Add(Type("DataCompositionSelectedField"));
		Selection.Use = True;
		Selection.Field = Field.Field;
	EndDo;

	Settings = SettingsComposer.GetSettings();
	DataCompositionSchema = GetFromTempStorage(Address);
	Composer = New DataCompositionTemplateComposer();
	Template = Composer.Execute(DataCompositionSchema, Settings);
	TabDoc.Clear();
	DataCompositionProcessor = New DataCompositionProcessor;
	DataCompositionProcessor.Initialize(Template);

	OutputProcessor = New DataCompositionResultSpreadsheetDocumentOutputProcessor;
	OutputProcessor.SetDocument(TabDoc);
	OutputProcessor.Output(DataCompositionProcessor);

EndProcedure

&AtClient

Procedure AfterQueryChange(Text, AddInfo) Export
    If Not IsBlankString(QueryText) Then
        QueryText = Text;
    EndIf;
EndProcedure

&AtClient

Procedure FillSessionParametersTable(Val RLSParamStructure)
	If Not UseSessionParametersFromTable Or
			UseSessionParametersFromTable And Not SessionParametersTable.Count() Then
		AdditionalParamsStructure = AdditionalParamsStructure(RLSParamStructure);
		FillAdditionalParam(AdditionalParamsStructure);

		SessionParametersTable.Clear();
		For Each Param In AdditionalParamsStructure Do
			NewSP = SessionParametersTable.Add();
			NewSP.Name = Param.Key;
			NewSP.Value = Param.Value;
		EndDo;
	Else
		AdditionalParamsStructure = New Structure;
		For Each Param In SessionParametersTable Do
			AdditionalParamsStructure.Insert(Param.Name, Param.Value);
		EndDo;
	EndIf;
EndProcedure
#EndRegion


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

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

Function GenerateRoleMatrix(RoleTree, ObjectData, OnlyReport, OnlyFilled = True)
Export

	RightsMap = CurrentRights(ObjectData);
	PictureLibData = Roles_SettingsReUse.PictureList();

	ParamStructure = New Structure;
	ParamStructure.Insert("PictureLibData", PictureLibData);
	ParamStructure.Insert("RightsMap", RightsMap);
	ParamStructure.Insert("ObjectData", ObjectData);
	ParamStructure.Insert("OnlyFilled", OnlyFilled);
	ParamStructure.Insert("OnlyReport", OnlyReport);
	For Each Meta In Enums.Roles_MetadataTypes Do
		SkipMeta =  Meta = Enums.Roles_MetadataTypes.IntegrationService // wait 8.3.17
			OR Meta = Enums.Roles_MetadataTypes.Role
			OR Meta = Enums.Roles_MetadataTypes.Enum
			OR Meta = Enums.Roles_MetadataTypes.Language;
		If SkipMeta Then
			Continue;
		EndIf;

		If OnlyFilled Then
			If NOT ObjectData.RightTable.FindRows(New Structure("ObjectType, Disable", Meta, False)).Count() Then
				Continue;
			EndIf;
		EndIf;

		MetaRow = RoleTree.Rows.Add();
		MetaRow.ObjectType = Meta;
		MetaRow.ObjectFullName = Meta;
		MetaRow.ObjectPath = Roles_Settings.MetaName(Meta);
		Picture = PictureLibData["Roles_" + Roles_Settings.MetaName(Meta)];
		MetaRow.Picture = Picture;

		SetCurrentRights(MetaRow, ParamStructure);
		EmptyData = True;
		If Meta = Enums.Roles_MetadataTypes.Configuration Then
			MetaRow.ObjectFullName = Metadata.Name;
			MetaRow.ObjectPath = MetaRow.ObjectPath + "." + Metadata.Name;
			SetCurrentRights(MetaRow, ParamStructure);
			Continue;
		EndIf;

		ParamStructure.Insert("Meta", Meta);

		For Each MetaItem In Metadata[Roles_Settings.MetaDataObjectNames().Get(Meta)] Do
			If NOT isNative(MetaItem) Then
				Continue;
			EndIf;

			If OnlyFilled Then
				If NOT ObjectData.RightTable.FindRows(New Structure("ObjectName, Disable", MetaItem.Name, False)).Count() Then
					Continue;
				EndIf;
			EndIf;

			EmptyData = False;

			Meta = MetaRow.ObjectType;

			MetaItemRow = MetaRow.Rows.Add();
			MetaItemRow.ObjectType = Meta;
			MetaItemRow.ObjectName = MetaItem.Name;
    // TODO: допиши оставшуюся часть

[Assistant]
Function GenerateRoleMatrix(RoleTree, ObjectData, OnlyReport, OnlyFilled = True) Export

	RightsMap = CurrentRights(ObjectData);
	PictureLibData = Roles_SettingsReUse.PictureList();

	ParamStructure = New Structure;
	ParamStructure.Insert("PictureLibData", PictureLibData);
	ParamStructure.Insert("RightsMap", RightsMap);
	ParamStructure.Insert("ObjectData", ObjectData);
	ParamStructure.Insert("OnlyFilled", OnlyFilled);
	ParamStructure.Insert("OnlyReport", OnlyReport);
	For Each Meta In Enums.Roles_MetadataTypes Do
		SkipMeta =  Meta = Enums.Roles_MetadataTypes.IntegrationService // wait 8.3.17
			OR Meta = Enums.Roles_MetadataTypes.Role
			OR Meta = Enums.Roles_MetadataTypes.Enum
			OR Meta = Enums.Roles_MetadataTypes.Language;
		If SkipMeta Then
			Continue;
		EndIf;

		If OnlyFilled Then
			If NOT ObjectData.RightTable.FindRows(New Structure("ObjectType, Disable", Meta, False)).Count() Then
				Continue;
			EndIf;
		EndIf;

		MetaRow = RoleTree.Rows.Add();
		MetaRow.ObjectType = Meta;
		MetaRow.ObjectFullName = Meta;
		MetaRow.ObjectPath = Roles_Settings.MetaName(Meta);
		Picture = PictureLibData["Roles_" + Roles_Settings.MetaName(Meta)];
		MetaRow.Picture = Picture;

		SetCurrentRights(MetaRow, ParamStructure);
		EmptyData = True;
		If Meta = Enums.Roles_MetadataTypes.Configuration Then
			MetaRow.ObjectFullName = Metadata.Name;
			MetaRow.ObjectPath = MetaRow.ObjectPath + "." + Metadata.Name;
			SetCurrentRights(MetaRow, ParamStructure);
			Continue;
		EndIf;

		ParamStructure.Insert("Meta", Meta);

		For Each MetaItem In Metadata[Roles_Settings.MetaDataObjectNames().Get(Meta)] Do
			If NOT isNative(MetaItem) Then
				Continue;
			EndIf;

			If OnlyFilled Then
				If NOT ObjectData.RightTable.FindRows(New Structure("ObjectName, Disable", MetaItem.Name, False)).Count() Then
					Continue;
				EndIf;
			EndIf;

			EmptyData = False;

			Meta = MetaRow.ObjectType;

			MetaItemRow = MetaRow.Rows.Add();
			MetaItemRow.ObjectType = Meta;
			MetaItemRow.ObjectName = MetaItem.Name;
			MetaItemRow.ObjectFullName = MetaItem.Name;
			MetaItemRow.Picture = MetaRow.Picture;
			MetaItemRow.ObjectPath = MetaRow.ObjectPath + "." + MetaItemRow.ObjectFullName;

			addSubtypeRow(MetaItem, MetaItemRow, ParamStructure);

		EndDo;
		If EmptyData Then
			RoleTree.Rows.Delete(MetaRow);
		Else
			CulculateTopLvlStatus(MetaRow);
		EndIf;

	EndDo;

	RoleTree.Rows.Sort("ObjectPath", True);

	TabDoc = New SpreadsheetDocument;
	TabDoc.ShowRowGroupLevel(1);
	HeadTemplate = Roles_ServiceServer.HeadTemplate();
	For Each Roles_Right In Metadata.Enums.Roles_Rights.EnumValues Do
		HeadTemplate.Parameters[Roles_Right.Name] = Enums.Roles_Rights[Roles_Right.Name];
	EndDo;
	TabDoc.Put(HeadTemplate);
	FillTabDoc(TabDoc, RoleTree, ParamStructure);
	TabDoc.ShowHeaders = True;
	TabDoc.Put(Roles_ServiceServer.FooterTemplate());

	ReplaceTextInTabDoc(TabDoc, 1, "✔", New Color(0, 255, 0));
	ReplaceTextInTabDoc(TabDoc, 2, "❌", New Color(255, 0, 0));
	ReplaceTextInTabDoc(TabDoc, 3, "✔", New Color(255, 255, 0));

	ReplaceTextInTabDoc(TabDoc, 11, "✅", New Color(0, 255, 0));
	ReplaceTextInTabDoc(TabDoc, 22, "❎", New Color(255, 0, 0));
	ReplaceTextInTabDoc(TabDoc, 33, "✅", New Color(255, 255, 0));

	If OnlyReport Then
		RoleTree.Rows.Clear();
	EndIf;
	TabDoc.FixedLeft = 2;
	TabDoc.FixedTop = 1;
	Return TabDoc;
EndFunction
#EndRegion

#Region Private

Procedure CulculateTopLvlStatus(Val MetaRow)

	Var Right, SetFalse, SetTrue;

	For Each Right In Metadata.Enums.Roles_Rights.EnumValues Do
		If Not MetaRow.Rows.Total(Right.Name) Then
			Continue;
		EndIf;

		SetTrue = MetaRow.Rows.FindRows(New Structure(Right.Name, 1)).Count();
		SetFalse = MetaRow.Rows.FindRows(New Structure(Right.Name, 2)).Count();

		If SetTrue = MetaRow.Rows.Count() Then
			MetaRow[Right.Name] = 1;
		ElsIf SetFalse = MetaRow.Rows.Count() Then
			MetaRow[Right.Name] = 2;
		Else
			MetaRow[Right.Name] = 3;
		EndIf;

	EndDo;

EndProcedure

Procedure addSubtypeRow(Val MetaItem, Val MetaItemRow, Val ParamStructure)

	Meta = MetaItemRow.ObjectType;

	SetCurrentRights(MetaItemRow, ParamStructure);

	If Roles_Settings.hasAttributes(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Attributes", ParamStructure);
	EndIf;
	If Roles_Settings.hasDimensions(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Dimensions", ParamStructure);
	EndIf;
	If Roles_Settings.hasResources(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Resources", ParamStructure);
	EndIf;
	If Roles_Settings.hasStandardAttributes(Meta) And ParamStructure.ObjectData.Property("SetSeparateRightToStandardAttributes") And ParamStructure.ObjectData.SetSeparateRightToStandardAttributes Then
		AddChild(MetaItem, MetaItemRow, "StandardAttributes", ParamStructure);
	EndIf;
	If Roles_Settings.hasCommands(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Commands", ParamStructure);
	EndIf;
	If Roles_Settings.hasRecalculations(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Recalculations", ParamStructure);
	EndIf;
	If Roles_Settings.hasAccountingFlags(Meta) Then
		AddChild(MetaItem, MetaItemRow, "AccountingFlags", ParamStructure);
	EndIf;
	If Roles_Settings.hasExtDimensionAccountingFlags(Meta) Then
		AddChild(MetaItem, MetaItemRow, "ExtDimensionAccountingFlags", ParamStructure);
	EndIf;
	If Roles_Settings.hasAddressingAttributes(Meta) Then
		AddChild(MetaItem, MetaItemRow, "AddressingAttributes", ParamStructure);
	EndIf;
	If Roles_Settings.hasTabularSections(Meta) Then
		AddChildTab(MetaItem, MetaItemRow, "TabularSections", ParamStructure);
	EndIf;
	If Roles_Settings.hasStandardTabularSections(Meta) And ParamStructure.ObjectData.SetSeparateRightToStandardAttributes Then
		AddChildStandardTab(MetaItem, MetaItemRow, "StandardTabularSections", ParamStructure);
	EndIf;
	If Roles_Settings.isSubsystem(Meta) Then
		AddChildSubsystem(MetaItem, MetaItemRow, "Subsystems", ParamStructure);
	EndIf;
	If Roles_Settings.hasOperations(Meta) Then
		AddChildOperations(MetaItem, MetaItemRow, "Operations", ParamStructure);
	EndIf;
	If Roles_Settings.hasURLTemplates(Meta) Then
		AddChildURLTemplates(MetaItem, MetaItemRow, "URLTemplates", ParamStructure);
	EndIf;
	If Roles_Settings.hasTables(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Tables", ParamStructure);
	EndIf;
	If Roles_Settings.hasCubes(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Cubes", ParamStructure);
	EndIf;
	If Roles_Settings.hasFields(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Fields", ParamStructure);
	EndIf;
	If Roles_Settings.hasFunctions(Meta) Then
		AddChild(MetaItem, MetaItemRow, "Functions", ParamStructure);
	EndIf;
	If Roles_Settings.hasDimensionTables(Meta) Then
		AddChild(MetaItem, MetaItemRow, "DimensionTables", ParamStructure);
	EndIf;
EndProcedure

Procedure ReplaceTextInTabDoc(TabDoc, Find, Replace, Color)
	Var AreaToReplace;
	AreaToReplace = TabDoc.FindText(Find, , , , True);
	While NOT AreaToReplace = Undefined Do
		AreaToReplace.Text = Replace;
		AreaToReplace.BackColor = Color;
		AreaToReplace = TabDoc.FindText(Find, AreaToReplace, , , True);
	EndDo;
EndProcedure


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

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

Функция ТипыMIME()
Экспорт
	Возврат Новый ФиксированнаяСтруктура(
		"application, audio, image, message, model, multipart, text, video, vnd, x, x_pkcs",
		Новый ФиксированнаяСтруктура( // application - внутренний формат прикладной программы
			"atom_xml, directory, EDI_X12, EDIFACT, json, javascript, octet_stream, ogg, pdf, postscript, soap_xml, font_woff, xhtml_xml, xml_dtd, xop_xml, zip, gzip, x_bittorrent, x_tex, xml",
			"application/atom+xml",     // Atom
			"application/directory",    // directory
			"application/EDI-X12",      // EDI X12 (RFC 1767)
			"application/EDIFACT",      // EDI EDIFACT (RFC 1767)
			"application/json",         // JavaScript Object Notation JSON (RFC 4627)
			"application/javascript",   // JavaScript (RFC 4329)
			"application/octet-stream", // двоичный файл без указания формата (RFC 2046)
			"application/ogg",          // Ogg (RFC 5334)
			"application/pdf",          // Portable Document Format, PDF (RFC 3778)
			"application/postscript",   // PostScript (RFC 2046)
			"application/soap+xml",     // SOAP (RFC 3902)
			"application/font-woff",    // Web Open Font Format
			"application/xhtml+xml",    // XHTML (RFC 3236)
			"application/xml-dtd",      // DTD (RFC 3023)
			"application/xop+xml",      // XOP
			"application/zip",          // ZIP
			"application/gzip",         // Gzip
			"application/x-bittorrent", // BitTorrent
			"application/x-tex",        // TeX
			"application/xml"           // XML
		),
		Новый ФиксированнаяСтруктура( // audio - аудио
			"basic, L24, mp4, aac, mpeg, ogg, vorbis, x_ms_wma, x_ms_wax, vnd_rn_realaudio, vnd_wave, webm",
			"audio/basic",            // mulaw аудио, 8 кГц, 1 канал (RFC 2046)
			"audio/L24",              // 24bit Linear PCM аудио, 8-48 кГц, 1-N каналов (RFC 3190)
			"audio/mp4",              // MP4
			"audio/aac",              // AAC
			"audio/mpeg",             // MP3 или др. MPEG (RFC 3003)
			"audio/ogg",              // Ogg Vorbis, Speex, Flac или др. аудио (RFC 5334)
			"audio/vorbis",           // Vorbis (RFC 5215)
			"audio/x-ms-wma",         // Windows Media Audio
			"audio/x-ms-wax",         // Windows Media Audio перенаправление
			"audio/vnd.rn-realaudio", // RealAudio
			"audio/vnd.wave",         // WAV(RFC 2361)
			"audio/webm"              // WebM
		),
		Новый ФиксированнаяСтруктура( // image - изображение
			"gif, jpeg, pjpeg, png, svg_xml, tiff, vnd_microsoft_icon, vnd_wap_wbmp, webp, bmp",
			"image/gif",                // GIF(RFC 2045 и RFC 2046)
			"image/jpeg",               // JPEG (RFC 2045 и RFC 2046)
			"image/pjpeg",              // JPEG
			"image/png",                // Portable Network Graphics (RFC 2083)
			"image/svg+xml",            // SVG
			"image/tiff",               // TIFF(RFC 3302)
			"image/vnd.microsoft.icon", // ICO
			"image/vnd.wap.wbmp",       // WBMP
			"image/webp",               // WebP
			"image/bmp"                 // BMP
		),
		Новый ФиксированнаяСтруктура( // message - сообщение
			"http, imdn_xml, partial, rfc822",
			"message/http",     // (RFC 2616)
			"message/imdn+xml", // IMDN (RFC 5438)
			"message/partial",  // E-mail (RFC 2045 и RFC 2046)
			"message/rfc822"    // E-mail; EML-файлы, MIME-файлы, MHT-файлы, MHTML-файлы (RFC 2045 и RFC 2046)
		),
		Новый ФиксированнаяСтруктура( // model - для 3D-моделей
			"example, iges, mesh, vrml, x3d_binary, x3d_vrml, x3d_xml",
			"model/example",    // (RFC 4735)
			"model/iges",       // IGS файлы, IGES файлы (RFC 2077)
			"model/mesh",       // MSH файлы, MESH файлы (RFC 2077), SILO файлы
			"model/vrml",       // WRL файлы, VRML файлы (RFC 2077)
			"model/x3d+binary", // X3D ISO стандарт для 3D компьютерной графики, X3DB файлы
			"model/x3d+vrml",   // X3D ISO стандарт для 3D компьютерной графики, X3DV VRML файлы
			"model/x3d+xml"     // X3D ISO стандарт для 3D компьютерной графики, X3D XML файлы
		),
		Новый ФиксированнаяСтруктура( // multipart - составные
			"mixed, alternative, related, form_data, signed, encrypted",
			"multipart/mixed",       // MIME E-mail (RFC 2045 и RFC 2046)
			"multipart/alternative", // MIME E-mail (RFC 2045 и RFC 2046)
			"multipart/related",     // MIME E-mail (RFC 2387 и используемое MHTML (HTML mail))
			"multipart/form-data",   // MIME Webform (RFC 2388)
			"multipart/signed",      // (RFC 1847)
			"multipart/encrypted"    // (RFC 1847)
		),
		Новый ФиксированнаяСтруктура( // text - текст
			"cmd, css, csv, html, javascript, plain, php, xml, markdown, cache_manifest",
			"text/cmd",           // команды
			"text/css",           // Cascading Style Sheets (RFC 2318)
			"text/csv",           // CSV (RFC 4180)
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ТипыMIME() Экспорт
	Возврат Новый ФиксированнаяСтруктура(
		"application, audio, image, message, model, multipart, text, video, vnd, x, x_pkcs",
		Новый ФиксированнаяСтруктура( // application - внутренний формат прикладной программы
			"atom_xml, directory, EDI_X12, EDIFACT, json, javascript, octet_stream, ogg, pdf, postscript, soap_xml, font_woff, xhtml_xml, xml_dtd, xop_xml, zip, gzip, x_bittorrent, x_tex, xml",
			"application/atom+xml",     // Atom
			"application/directory",    // directory
			"application/EDI-X12",      // EDI X12 (RFC 1767)
			"application/EDIFACT",      // EDI EDIFACT (RFC 1767)
			"application/json",         // JavaScript Object Notation JSON (RFC 4627)
			"application/javascript",   // JavaScript (RFC 4329)
			"application/octet-stream", // двоичный файл без указания формата (RFC 2046)
			"application/ogg",          // Ogg (RFC 5334)
			"application/pdf",          // Portable Document Format, PDF (RFC 3778)
			"application/postscript",   // PostScript (RFC 2046)
			"application/soap+xml",     // SOAP (RFC 3902)
			"application/font-woff",    // Web Open Font Format
			"application/xhtml+xml",    // XHTML (RFC 3236)
			"application/xml-dtd",      // DTD (RFC 3023)
			"application/xop+xml",      // XOP
			"application/zip",          // ZIP
			"application/gzip",         // Gzip
			"application/x-bittorrent", // BitTorrent
			"application/x-tex",        // TeX
			"application/xml"           // XML
		),
		Новый ФиксированнаяСтруктура( // audio - аудио
			"basic, L24, mp4, aac, mpeg, ogg, vorbis, x_ms_wma, x_ms_wax, vnd_rn_realaudio, vnd_wave, webm",
			"audio/basic",            // mulaw аудио, 8 кГц, 1 канал (RFC 2046)
			"audio/L24",              // 24bit Linear PCM аудио, 8-48 кГц, 1-N каналов (RFC 3190)
			"audio/mp4",              // MP4
			"audio/aac",              // AAC
			"audio/mpeg",             // MP3 или др. MPEG (RFC 3003)
			"audio/ogg",              // Ogg Vorbis, Speex, Flac или др. аудио (RFC 5334)
			"audio/vorbis",           // Vorbis (RFC 5215)
			"audio/x-ms-wma",         // Windows Media Audio
			"audio/x-ms-wax",         // Windows Media Audio перенаправление
			"audio/vnd.rn-realaudio", // RealAudio
			"audio/vnd.wave",         // WAV(RFC 2361)
			"audio/webm"              // WebM
		),
		Новый ФиксированнаяСтруктура( // image - изображение
			"gif, jpeg, pjpeg, png, svg_xml, tiff, vnd_microsoft_icon, vnd_wap_wbmp, webp, bmp",
			"image/gif",                // GIF(RFC 2045 и RFC 2046)
			"image/jpeg",               // JPEG (RFC 2045 и RFC 2046)
			"image/pjpeg",              // JPEG
			"image/png",                // Portable Network Graphics (RFC 2083)
			"image/svg+xml",            // SVG
			"image/tiff",               // TIFF(RFC 3302)
			"image/vnd.microsoft.icon", // ICO
			"image/vnd.wap.wbmp",       // WBMP
			"image/webp",               // WebP
			"image/bmp"                 // BMP
		),
		Новый ФиксированнаяСтруктура( // message - сообщение
			"http, imdn_xml, partial, rfc822",
			"message/http",     // (RFC 2616)
			"message/imdn+xml", // IMDN (RFC 5438)
			"message/partial",  // E-mail (RFC 2045 и RFC 2046)
			"message/rfc822"    // E-mail; EML-файлы, MIME-файлы, MHT-файлы, MHTML-файлы (RFC 2045 и RFC 2046)
		),
		Новый ФиксированнаяСтруктура( // model - для 3D-моделей
			"example, iges, mesh, vrml, x3d_binary, x3d_vrml, x3d_xml",
			"model/example",    // (RFC 4735)
			"model/iges",       // IGS файлы, IGES файлы (RFC 2077)
			"model/mesh",       // MSH файлы, MESH файлы (RFC 2077), SILO файлы
			"model/vrml",       // WRL файлы, VRML файлы (RFC 2077)
			"model/x3d+binary", // X3D ISO стандарт для 3D компьютерной графики, X3DB файлы
			"model/x3d+vrml",   // X3D ISO стандарт для 3D компьютерной графики, X3DV VRML файлы
			"model/x3d+xml"     // X3D ISO стандарт для 3D компьютерной графики, X3D XML файлы
		),
		Новый ФиксированнаяСтруктура( // multipart - составные
			"mixed, alternative, related, form_data, signed, encrypted",
			"multipart/mixed",       // MIME E-mail (RFC 2045 и RFC 2046)
			"multipart/alternative", // MIME E-mail (RFC 2045 и RFC 2046)
			"multipart/related",     // MIME E-mail (RFC 2387 и используемое MHTML (HTML mail))
			"multipart/form-data",   // MIME Webform (RFC 2388)
			"multipart/signed",      // (RFC 1847)
			"multipart/encrypted"    // (RFC 1847)
		),
		Новый ФиксированнаяСтруктура( // text - текст
			"cmd, css, csv, html, javascript, plain, php, xml, markdown, cache_manifest",
			"text/cmd",           // команды
			"text/css",           // Cascading Style Sheets (RFC 2318)
			"text/csv",           // CSV (RFC 4180)
			"text/html",          // HTML (RFC 2854)
			"text/javascript",    // (Obsolete): JavaScript (RFC 4329)
			"text/plain",         // текстовые данные (RFC 2046 и RFC 3676)
			"text/php",           // Скрипт языка PHP
			"text/xml",           // Extensible Markup Language (RFC 3023)
			"text/markdown",      // файл языка разметки Markdown (RFC 7763)
			"text/cache-manifest" // файл манифеста(RFC 2046)
		),
		Новый ФиксированнаяСтруктура( // video - видео
			"mpeg, mp4, ogg, quicktime, webm, x_ms_wmv, x_flv, _3gpp, _3gpp2",
			"video/mpeg",      // MPEG-1 (RFC 2045 и RFC 2046)
			"video/mp4",       // MP4 (RFC 4337)
			"video/ogg",       // Ogg Theora или другое видео (RFC 5334)
			"video/quicktime", // QuickTime
			"video/webm",      // WebM
			"video/x-ms-wmv",  // Windows Media Video
			"video/x-flv",     // FLV
			"video/3gpp",      // 3gpp .3gp
			"video/3gpp2"      // 3gpp2 .3g2
		),
		Новый ФиксированнаяСтруктура( // vnd - вендорные файлы
			"oot, oos, oop, oog, ms_excel, ms_excel_2007, ms_powerpoint, ms_powerpoint_2007, ms_word, ms_word_2007, mozilla_xul_xml, google_earth_kml_xml",
			"application/vnd.oasis.opendocument.text",                                   // OpenDocument
			"application/vnd.oasis.opendocument.spreadsheet",                            // OpenDocument
			"application/vnd.oasis.opendocument.presentation",                           // OpenDocument
			"application/vnd.oasis.opendocument.graphics",                               // OpenDocument
			"application/vnd.ms-excel",                                                  // Microsoft Excel файлы
			"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",         // Microsoft Excel 2007 файлы
			"application/vnd.ms-powerpoint",                                             // Microsoft Powerpoint файлы
			"application/vnd.openxmlformats-officedocument.presentationml.presentation", // Microsoft Powerpoint 2007 файлы
			"application/msword",                                                        // Microsoft Word файлы
			"application/vnd.openxmlformats-officedocument.wordprocessingml.document",   // Microsoft Word 2007 файлы
			"application/vnd.mozilla.xul+xml",                                           // Mozilla XUL файлы
			"application/vnd.google-earth.kml+xml"                                       // KML файлы (например, для Google Earth)
		),
		Новый ФиксированнаяСтруктура( // x - нестандартные файлы
			"www_form_urlencoded, dvi, latex, font_ttf, shockwave_flash, stuffit, zip_compressed, rar_compressed, tar, jquery_tmpl, javascript",
			"application/x-www-form-urlencoded", // Form Encoded Data
			"application/x-dvi",                 // DVI
			"application/x-latex",               // LaTeX файлы
			"application/x-font-ttf",            // TrueType (не зарегистрированный MIME-тип, но наиболее часто используемый)
			"application/x-shockwave-flash",     // Adobe Flash
			"application/x-stuffit",             // StuffIt
			"application/x-zip-compressed",      // ZIP
			"application/x-rar-compressed",      // RAR
			"application/x-tar",                 // Tarball
			"text/x-jquery-tmpl",                // jQuery
			"application/x-javascript"           // javascript
		),
		Новый ФиксированнаяСтруктура( // x_pkcs - Public Key Cryptography Standards
			"pkcs12, pkcs7_certificates, pkcs7_certreqresp, pkcs7_mime, pkcs7_signature",
			"application/x-pkcs12",             // p12 и pfx файлы
			"application/x-pkcs7-certificates", // p7b и spc файлы
			"application/x-pkcs7-certreqresp",  // p7r файлы
			"application/x-pkcs7-mime",         // p7c и p7m файлы
			"application/x-pkcs7-signature"     // p7s файлы
		)
	);
КонецФункции

#Область ТИПЫ_MIME
// Возвращает MIME-тип application/json
//
// Возвращаемое значение:
//  Строка - MIME-тип
//


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

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

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

	КлиентHTTPКлиентСервер.УстановитьТипMIME(ДополнительныеПараметры, КлиентHTTPПовтИсп.ТипMIMEXWWWFormUrlEncoded());

	Данные = КлиентHTTPВызовСервера.ЗакодированныеПоляФормыHTML(Данные);
	ИндексПоследнегоПоля = Данные.ВГраница();
	Поток = Новый ПотокВПамяти;
	Запись = Новый ЗаписьДанных(Поток, КлиентHTTPКлиентСервер.КодировкаИзДопПараметров(ДополнительныеПараметры), , "");

	Для я = 0 По ИндексПоследнегоПоля Цикл
		ПолеФормы = Данные[я];
		ЕстьЗначениеПоля = (ПолеФормы.Значение <> "");
		РазделительВнешний = ?(я = ИндексПоследнегоПоля, "", "&");
		РазделительВнутренний = ?(ЕстьЗначениеПоля, "=", РазделительВнешний);

		Запись.ЗаписатьСтроку(ПолеФормы.Ключ, , РазделительВнутренний);
		Если ЕстьЗначениеПоля Тогда
			Запись.ЗаписатьСтроку(ПолеФормы.Значение, , РазделительВнешний);
		КонецЕсли;
	КонецЦикла;

	Возврат КлиентHTTPКлиентСервер.ОтправитьДвоичныеДанные(ИдентификаторРесурса, Поток.ЗакрытьИПолучитьДвоичныеДанные(), ДополнительныеПараметры, ПараметрыЗапроса);
КонецФункции

// Реализация POST типа multipart/form-data. При отсутствии файла генерируется исключение
//
// Параметры:
//  ИдентификаторРесурса	 - Строка, Структура - URI сервиса либо объект идентификатора ресурса
//  Данные					 - Массив			 - тело запроса. Элементы - Структура с ключами:
//  * Ключ - Строка - имя поля
//  * Значение - Строка, Файл - значение поля
//  * ТипMIME - Строка - тип значения поля
//  * Файл - Структура, ключи:
//    ** Имя		 - Строка - имя файла,
//    ** ТипMIME	 - Строка - MIME-тип содержимого файла,
//    ** Кодировка	 - Строка - кодировка файла
//  ДополнительныеПараметры	 - Структура    - конфигурация выполнения запроса
//  ПараметрыЗапроса		 - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
//  ФиксированнаяСтруктура - объект ответа:
//  * КодСостояния - Число - код состояния (ответа) HTTP-сервера,
//  * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
//  * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
//  * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
//

Функция ОтправитьДанныеФормы(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
	КонецЕсли;

	Разделитель = ?(ДополнительныеПараметры.Свойство("Разделитель"), ДополнительныеПараметры.Разделитель, XMLСтрока(Новый УникальныйИдентификатор));
	_Разделитель = "--" + Разделитель;

	КлиентHTTPКлиентСервер.УстановитьТипMIME(ДополнительныеПараметры, КлиентHTTPПовтИсп.ТипMIMEMultipartFromData());

	Поток = Новый ПотокВПамяти;
	Запись = Новый ЗаписьДанных(Поток, КлиентHTTPКлиентСервер.КодировкаИзДопПараметров(ДополнительныеПараметры));

	Для Каждого ПолеФормы Из Данные Цикл
		Запись.ЗаписатьСтроку(_Разделитель);

		Если ПолеФормы.Свойство("Файл") Тогда
			ДобавитьДанныеФормыФайл(ПолеФормы, Запись);
		Иначе
			ДобавитьДанныеФормыТекст(ПолеФормы, Запись);
		КонецЕсли;
	КонецЦикла;

	Запись.ЗаписатьСтроку(_Разделитель + "--");

	Возврат КлиентHTTPКлиентСервер.ОтправитьДвоичныеДанные(ИдентификаторРесурса, Поток.ЗакрытьИПолучитьДвоичныеДанные(), ДополнительныеПараметры, ПараметрыЗапроса);
КонецФункции

// Парсит значение заголовка ответа Set-Cookie и сохраняет результат в базу Cookie сессии
//
// Параметры:
//  Сессия			 - Структура - данные HTTP-сессии
//  ОписаниеПеченья	 - Строка	 - значение заголовка ответа Set-Cookie
//  СерверURI		 - Строка	 - адрес сервера из разобранного URI
//

Процедура ПринятьПеченье(Сессия, Знач ОписаниеПеченья, Знач СерверURI) Экспорт
	Перем Печенье;

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

	Для Каждого Печенько Из ВыпеченныеПеченьки(ОписаниеПеченья) Цикл
		Получатель = Неопределено;

		Для Каждого Атрибут Из Печенько.Атрибуты Цикл
			Если Атрибут.Имя = "domain" Тогда
				Получатель = СокрЛП(Атрибут.Значение);
				Прервать;
			КонецЕсли;
		КонецЦикла;

		Получатель = КлиентHTTPСлужебный.НормализованныйАдресСервера(
			?(ЗначениеЗаполнено(Получатель), Получатель, СерверURI)
		);

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

		ПеченьеПолучателя.Вставить(
			НРег(СокрЛП(Печенько.Имя)),
			СвойстваПеченьки(Печенько.Имя, Печенько.Значение, Печенько.Атрибуты)
		);
	КонецЦикла;
КонецПроцедуры

// Возвращает текущую универсальную дату сервера
//
// Возвращаемое значение:
//  Дата - текущая универсальная дата сервера
//

Функция ТекущаяУниверсальнаяДатаНаСервере() Экспорт
	Возврат ТекущаяУниверсальнаяДата();
КонецФункции

// Возвращает текущий Unix Timestamp
//
// Возвращаемое значение:
//  Число - количество секунд, прошедших с 01.01.1970 по текущее время UTC
//

Функция ВременнаяМеткаUnix() Экспорт
	Возврат ТекущаяУниверсальнаяДата() - КлиентHTTPПовтИсп.ЭпохаUnix();
КонецФункции

// Возвращает раскодированный URI в URL кодировке
//
// Параметры:
//  ИдентификаторРесурса - Строка	 - URI
//
// Возвращаемое значение:
//  Строка - раскодированная строка идентификатора ресурса
//

Функция РаскодированныйИдентификаторРесурса(Знач ИдентификаторРесурса) Экспорт
	Возврат РаскодироватьСтроку(ИдентификаторРесурса, СпособКодированияСтроки.URLВКодировкеURL);
КонецФункции

// Возвращает значение заголовка Digest-аутентификации
//
// Параметры:
//  Конфигурация				 - Структура - конфигурация выполнения запроса
//  КонтекстВыполненияАдресВХ	 - Строка	 - адрес контекста выполнения запроса во временном хранилище
//
// Возвращаемое значение:
//  Строка - значение заголовка Digest-аутентификации
//

[Assistant] Функция ОтправитьДанныеHTMLФормы(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено)


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

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

Функция ИмяФункции(Знач ЗначениеЗаголовка)
	фРезультат = Новый Структура("Подпись, ПодписьТела, Дополнение", "", "", "");

	ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " mac=""");
	ПозицияОкончания = 0;
	Если ПозицияНачала > 0 Тогда
		ПозицияНачала = ПозицияНачала + 6;
		ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
		Если ПозицияОкончания > 0 Тогда
			фРезультат.Подпись = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
		КонецЕсли;
	КонецЕсли;

	ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " hash=""");
	ПозицияОкончания = 0;
	Если ПозицияНачала > 0 Тогда
		ПозицияНачала = ПозицияНачала + 7;
		ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
		Если ПозицияОкончания > 0 Тогда
			фРезультат.ПодписьТела = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
		КонецЕсли;
	КонецЕсли;

	ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " ext=""");
	ПозицияОкончания = 0;
	Если ПозицияНачала > 0 Тогда
		ПозицияНачала = ПозицияНачала + 6;
		ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
		Если ПозицияОкончания > 0 Тогда
			фРезультат.Дополнение = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
		КонецЕсли;
	КонецЕсли;

	Возврат фРезультат;
КонецФункции
#КонецОбласти

[Assistant] Функция ДанныеЗаголовкаОтветаHawk(Знач ЗначениеЗаголовка)


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

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

Процедура ЗаполнитьТаймаутCurlКоманды(ЧастиКоманды)
Если Таймаут = 0 Тогда
		Возврат;
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ЗаполнитьТаймаутCurlКоманды(ЧастиКоманды)
	Если Таймаут = 0 Тогда
		Возврат;
	КонецЕсли;

	ЧастиКоманды.Добавить("--connect-timeout");
	ЧастиКоманды.Добавить(XMLСтрока(Таймаут));
КонецПроцедуры

&НаКлиенте

Процедура ЗаполнитьПроксиCurlКоманды(ЧастиКоманды)
	Если НЕ (ИспользоватьПрокси И ЗначениеЗаполнено(СерверПрокси)) Тогда
		Возврат;
	КонецЕсли;

	ЧастиПрокси = Новый Массив;

	Если ЗначениеЗаполнено(ПользовательПрокси) Тогда
		ЧастиПрокси.Добавить(ПользовательПрокси);
		ЧастиПрокси.Добавить(ОтображениеСекрета(ПарольПрокси, Элементы.ПарольПрокси));

		ЧастиКоманды.Добавить(?(ИспользоватьАутентификациюОСПрокси, "--proxy-ntlm", "--proxy-basic"));
		ЧастиКоманды.Добавить("--proxy-user");
		ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрЗаменить(СтрСоединить(ЧастиПрокси, ":"), "'", "'\''")));
	КонецЕсли;

	ЧастиПрокси.Очистить();
	ЧастиПрокси.Добавить(ПротоколПрокси);
	ЧастиПрокси.Добавить("://");
	ЧастиПрокси.Добавить(СерверПрокси);

	Если ЗначениеЗаполнено(ПортПрокси) Тогда
		ЧастиПрокси.Добавить(":");
		ЧастиПрокси.Добавить(ПортПрокси);
	КонецЕсли;

	ЧастиКоманды.Добавить("-x");
	ЧастиКоманды.Добавить(СтрСоединить(ЧастиПрокси, ""));
КонецПроцедуры

&НаКлиенте

Процедура ЗаполнитьСессиюCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции)
	Если НЕ ИспользоватьСессию Тогда
		Возврат;
	КонецЕсли;

	Если ЗначениеЗаполнено(ПорогПеренаправлений) Тогда
		ЧастиКоманды.Добавить("--max-redirs");
		ЧастиКоманды.Добавить(ПорогПеренаправлений);
	КонецЕсли;

	ЧастиСложнойОпции.Добавить("L");

	Если ПоддержкаCookie Тогда
		ЗначениеCookie = КлиентHTTPКлиентСервер.ЗначениеЗаголовкаCookieРесурса(ИдентификаторРесурса, Дополнительно);
		Если ЗначениеЗаполнено(ЗначениеCookie) Тогда
			ЧастиКоманды.Добавить("-b");
			ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ЗначениеCookie)));
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ЗаполнитьСжатиеCurlКоманды(ЧастиКоманды)
	Если ПоддержкаСжатогоОтвета Тогда
		ЧастиКоманды.Добавить("--compressed");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ЗаполнитьЗаголовкиCurlКоманды(ЧастиКоманды, Знач ПредопределенныеЗаголовки)
	Для Каждого Стр Из ПредопределенныеЗаголовки Цикл
		ЧастиКоманды.Добавить("-H");
		ЧастиКоманды.Добавить(
			СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
		);
	КонецЦикла;

	Для Каждого Стр Из ЗаголовкиЗапроса Цикл
		Если НЕ Стр.Активно Тогда
			Продолжить;
		КонецЕсли;

		ЧастиКоманды.Добавить("-H");
		ЧастиКоманды.Добавить(
			СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
		);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте

Процедура ЗаполнитьСхемуЗапросаCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции, Знач ОтобразитьPOST)
	СхемаСписокВыбора = Элементы.Схема.СписокВыбора;
	Если Схема = СхемаСписокВыбора[0].Значение И НЕ ОтобразитьPOST Тогда // GET
		ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
	ИначеЕсли Схема = СхемаСписокВыбора[1].Значение И ОтобразитьPOST Тогда // POST
		ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
	ИначеЕсли Схема = СхемаСписокВыбора[4].Значение Тогда // HEAD
		ЧастиСложнойОпции.Добавить("I");
	ИначеЕсли Схема = СхемаСписокВыбора[2].Значение // PUT
			ИЛИ Схема = СхемаСписокВыбора[3].Значение // DELETE
			ИЛИ Схема = СхемаСписокВыбора[5].Значение // PATCH
		Тогда
		ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, Знач РазделКоманды)
	Для Каждого Часть Из РазделКоманды Цикл
		ЧастиКоманды.Добавить(Часть);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте

Функция КомандаCurlЗапросаКонсоли()
	ЧастиСложнойОпции = Новый Массив;
	ПредопределенныеЗаголовки = Новый Массив;
	ОтобразитьPOST = Ложь;

	РазделыКоманды = Новый Структура(
		"ПовторноеВыполнение, Аутентификация, КлиентскийСертификат, Тело, Таймаут, СохранениеОтветаВФайл, Прокси, Сессия, Сжатие, Заголовки, Схема",
	);
	Для Каждого КЗ Из РазделыКоманды Цикл
		РазделыКоманды[КЗ.Ключ] = Новый Массив;
	КонецЦикла;

	ЗаполнитьПовторноеВыполнениеCurlКоманды(РазделыКоманды.ПовторноеВыполнение);
	ЗаполнитьАутентификациюCurlКоманды(РазделыКоманды.Аутентификация);
	ЗаполнитьКлиентскийСертификатCurlКоманды(РазделыКоманды.КлиентскийСертификат);
	ЗаполнитьТелоЗапросаCurlКоманды(РазделыКоманды.Тело, ОтобразитьPOST, ПредопределенныеЗаголовки);
	ЗаполнитьФайлОтветаCurlКоманды(РазделыКоманды.СохранениеОтветаВФайл);
	ЗаполнитьТаймаутCurlКоманды(РазделыКоманды.Таймаут);
	ЗаполнитьПроксиCurlКоманды(РазделыКоманды.Прокси);
	ЗаполнитьСессиюCurlКоманды(РазделыКоманды.Сессия, ЧастиСложнойОпции);
	ЗаполнитьСжатиеCurlКоманды(РазделыКоманды.Сжатие);
	ЗаполнитьЗаголовкиCurlКоманды(РазделыКоманды.Заголовки, ПредопределенныеЗаголовки);
	ЗаполнитьСхемуЗапросаCurlКоманды(РазделыКоманды.Схема, ЧастиСложнойОпции, ОтобразитьPOST);

	ЧастиКоманды = Новый Массив;
	ЧастиКоманды.Добавить("curl");

	Если ЧастиСложнойОпции.Количество() > 0 Тогда
		ЧастиСложнойОпции.Вставить(0, "-");
		ЧастиКоманды.Добавить(СтрСоединить(ЧастиСложнойОпции, ""));
	КонецЕсли;

	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Схема);

	ЧастиКоманды.Добавить(КодированныйURIВURL(ИдентификаторРесурса));

	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Аутентификация);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.КлиентскийСертификат);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Заголовки);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Тело);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Прокси);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Таймаут);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.СохранениеОтветаВФайл);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сжатие);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сессия);
	ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.ПовторноеВыполнение);

	Возврат СтрСоединить(ЧастиКоманды, " ");
КонецФункции
#КонецОбласти

#Область ИмпортPostman
&НаКлиенте
Асинх Процедура ПрочитатьФайлИмпорта(ИмяФайлаИмпорта)
	Отказ = Ложь;
	ОписаниеОшибки = "";
	НачалоТекстаСообщения = "Не удалось прочитать файл импорта по причине: ";

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

	ОбъектИмпорта = Ждать ОбъектФайлаИмпорта(ФайлИмпорта);
	Если ОбъектИмпорта.Отказ Тогда
		СообщитьПользователю(НачалоТекстаСообщения + ОбъектИмпорта.ОписаниеОшибки);
		Возврат;
	КонецЕсли;

	ВалидацияОбъектаИмпорта(ОбъектИмпорта.Данные, Отказ, ОписаниеОшибки);
	Если Отказ Тогда
		СообщитьПользователю(НачалоТекстаСообщения + ОписаниеОшибки);
		Возврат;
	КонецЕсли;

	ИмпортироватьДанныеPostman(ОбъектИмпорта.Данные);
КонецПроцедуры

&НаКлиенте
Асинх Функция ТекстФайлаИмпорта(ФайлИмпорта)
	Перем фРезультат;

#Если НЕ МобильноеПриложениеКлиент Тогда
	Чтение = Новый ТекстовыйДокумент;
	Ждать Чтение.ПрочитатьАсинх(ФайлИмпорта.ПолноеИмя, "UTF-8");

	фРезультат = Чтение.ПолучитьТекст();
#КонецЕсли

	Возврат фРезультат
КонецФункции

&НаКлиенте
Асинх Функция ОбъектФайлаИмпорта(ФайлИмпорта)
	фРезультат = Новый Структура("Данные, Отказ, ОписаниеОшибки", Неопределено, Ложь, "");

	ТекстJSON = Ждать ТекстФайлаИмпорта(ФайлИмпорта);
	Чтение = Новый ЧтениеJSON;
	Чтение.УстановитьСтроку(ТекстJSON);

	Попытка
		фРезультат.Данные = ПрочитатьJSON(Чтение, Истина);
		Чтение.Закрыть();
	Исключение
		фРезультат.Отказ = Истина;
		фРезультат.ОписаниеОшибки = ОписаниеОшибки();
	КонецПопытки;

	Возврат фРезультат;
КонецФункции

&НаКлиенте