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

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

Функция ЛогическаяСтрокаЗаканчиваетсяКомментарием(БлокСтроки)
// Проверяем все токены с конца блока
	Индекс = БлокСтроки.КонИндекс;
	Пока Индекс >= БлокСтроки.НачИндекс Цикл
		Токен = ТаблицаТокенов[Индекс];

		// Пропускаем токены конца строки и другие незначимые токены
		Если Токен.Токен = "ПустаяСтрока" Тогда
			Индекс = Индекс - 1;
			Продолжить;
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ЛогическаяСтрокаЗаканчиваетсяКомментарием(БлокСтроки)
	// Проверяем все токены с конца блока
	Индекс = БлокСтроки.КонИндекс;
	Пока Индекс >= БлокСтроки.НачИндекс Цикл
		Токен = ТаблицаТокенов[Индекс];

		// Пропускаем токены конца строки и другие незначимые токены
		Если Токен.Токен = "ПустаяСтрока" Тогда
			Индекс = Индекс - 1;
			Продолжить;
		КонецЕсли;

		Возврат Токен.Токен = "Комментарий";
	КонецЦикла;

	Возврат Ложь;
КонецФункции

// Возвращает текстовое представление логической строки
//
// Параметры:
//  БлокСтроки - Структура - блок логической строки с индексами токенов
//
// Возвращаемое значение:
//  Строка - текстовое представление логической строки
//

Функция МассивЭлементовТекстаЛогическойСтроки(БлокСтроки)
	МассивТекста = Новый Массив;
	ТекущийОтступСтроки = 1;
	ВложенностьСкобок = 0;
	НомерСтроки = 1;
	ПредыдущаяСтрока = 0;

	Для Индекс = БлокСтроки.НачИндекс По БлокСтроки.КонИндекс Цикл
		Токен = ТаблицаТокенов[Индекс];
		ТокенСтр = Токен.Токен;

		Если ТокенСтр = "ПустаяСтрока" Тогда
			Продолжить;
		КонецЕсли;

		ТекстТекущегоТокена = ТекстТокена(Индекс);

		// Проверяем переход на новую строку
		Если ПредыдущаяСтрока > 0
			И (Токен.НомерСтроки > ПредыдущаяСтрока
				ИЛИ ТокенСтр = "НачалоСтроки")
		Тогда
			НомерСтроки = НомерСтроки + 1;
			МассивТекста.Добавить(Символы.ПС);
			// Добавляем отступ
			Для Счетчик = 1 По ТекущийОтступСтроки Цикл
				МассивТекста.Добавить(БазовыйОтступ);
			КонецЦикла;
		КонецЕсли;

		// Обработка особых случаев форматирования
		Если ТокенСтр = "ЛеваяКруглаяСкобка" Тогда
			МассивТекста.Добавить(ТекстТекущегоТокена);

			ВложенностьСкобок = ВложенностьСкобок + 1;
			Если ВложенностьСкобок > 1 ИЛИ НомерСтроки > 1 Тогда
				ТекущийОтступСтроки = ТекущийОтступСтроки + 1;
			КонецЕсли;
		ИначеЕсли ТокенСтр = "ПраваяКруглаяСкобка" Тогда
			ТекущийОтступСтроки = Макс(1, ТекущийОтступСтроки - 1);
			ВложенностьСкобок = ВложенностьСкобок - 1;

			МассивТекста.Добавить(ТекстТекущегоТокена);
		ИначеЕсли ТокенСтр = "ЗнакРавно"
			ИЛИ ТокенСтр = "ЗнакНеРавно"
			ИЛИ ТокенСтр = "ЗнакМеньше"
			ИЛИ ТокенСтр = "ЗнакБольше"
			ИЛИ ТокенСтр = "ЗнакМеньшеИлиРавно"
			ИЛИ ТокенСтр = "ЗнакБольшеИлиРавно"
			ИЛИ ТокенСтр = "ЗнакСложения"
			ИЛИ ТокенСтр = "ЗнакВычитания"
			ИЛИ ТокенСтр = "ЗнакУмножения"
			ИЛИ ТокенСтр = "ЗнакДеления"
			ИЛИ ТокенСтр = "ЗнакОстатка"
			ИЛИ ТокенСтр = "И"
			ИЛИ ТокенСтр = "Или"
			ИЛИ ТокенСтр = "Не"
		Тогда
			ДобавитьВМассивТекста(МассивТекста, " ");
			ДобавитьВМассивТекста(МассивТекста, ТекстТекущегоТокена);
			ДобавитьВМассивТекста(МассивТекста, " ");

		ИначеЕсли ТокенСтр = "Запятая"
			ИЛИ ТокенСтр = "Перем"
			ИЛИ ТокенСтр = "ДобавитьОбработчик"
			ИЛИ ТокенСтр = "УдалитьОбработчик"
			ИЛИ ТокенСтр = "Новый"
			ИЛИ ТокенСтр = "Выполнить"
			ИЛИ ТокенСтр = "Перейти"
			ИЛИ ТокенСтр = "Ждать"
			ИЛИ ТокенСтр = "_Если" // препроцессор
			ИЛИ ТокенСтр = "_ИначеЕсли"
			ИЛИ ТокенСтр = "_Область"
		Тогда
			ДобавитьВМассивТекста(МассивТекста, ТекстТекущегоТокена);
			ДобавитьВМассивТекста(МассивТекста, " ");
		ИначеЕсли ТокенСтр = "Возврат" ИЛИ ТокенСтр = "ВызватьИсключение" Тогда
			ДобавитьВМассивТекста(МассивТекста, ТекстТекущегоТокена);

			// Добавляем пробел только если текущий токен не последний в блоке
			Если Индекс < БлокСтроки.КонИндекс Тогда
				ДобавитьВМассивТекста(МассивТекста, " ");
			КонецЕсли;
		ИначеЕсли ТокенСтр = "Комментарий"
			ИЛИ ТокенСтр = "Тогда" // для случая в препроцессоре
		Тогда
			ДобавитьВМассивТекста(МассивТекста, " ");
			ДобавитьВМассивТекста(МассивТекста, ТекстТекущегоТокена);
		Иначе
			ДобавитьВМассивТекста(МассивТекста, ТекстТекущегоТокена);
		КонецЕсли;

		ПредыдущаяСтрока = Токен.НомерСтроки;
	КонецЦикла;

	Возврат МассивТекста;
КонецФункции

// Процедура инициализации модуля
//

Процедура Инициализация()
	СимволыТокенов = Новый Соответствие;
	СимволыТокенов.Вставить("ЗнакРавно", "=");
	СимволыТокенов.Вставить("ЗнакНеРавно", "<>");
	СимволыТокенов.Вставить("ЗнакМеньше", "<");
	СимволыТокенов.Вставить("ЗнакБольше", ">");
	СимволыТокенов.Вставить("ЗнакМеньшеИлиРавно", "<=");
	СимволыТокенов.Вставить("ЗнакБольшеИлиРавно", ">=");
	СимволыТокенов.Вставить("ЗнакСложения", "+");
	СимволыТокенов.Вставить("ЗнакВычитания", "-");
	СимволыТокенов.Вставить("ЗнакУмножения", "*");
	СимволыТокенов.Вставить("ЗнакДеления", "/");
	СимволыТокенов.Вставить("ЗнакОстатка", "%");
	СимволыТокенов.Вставить("ЛеваяКруглаяСкобка", "(");
	СимволыТокенов.Вставить("ПраваяКруглаяСкобка", ")");
	СимволыТокенов.Вставить("ЛеваяКвадратнаяСкобка", "[");
	СимволыТокенов.Вставить("ПраваяКвадратнаяСкобка", "]");
	СимволыТокенов.Вставить("ЗнакВопроса", "?");
	СимволыТокенов.Вставить("Запятая", ",");
	СимволыТокенов.Вставить("Точка", ".");
	СимволыТокенов.Вставить("Двоеточие", ":");
	СимволыТокенов.Вставить("ТочкаСЗапятой", ";");

	КлючевыеСлова = КлючевыеСлова();
	Токены = Токены(КлючевыеСлова);

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


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

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

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

	Парсер_Узлы.Вставить("ВыражениеЛитерал", Новый ТаблицаЗначений);
	// Хранит информацию о литерале примитивного типа.
	Поля = Парсер_Узлы.ВыражениеЛитерал.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Вид"); // строка (один из Токены)
	Поля.Добавить("Значение"); // неопределено, строка, число, булево, дата, null
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеПоле", Новый ТаблицаЗначений);
	// Хранит информацию об обращении к полю объекта через точку.
	// В поле Имя содержится имя поля.
	// В поле Аргументы содержатся аргументы вызова (если это вызов).
	// Пример:
	//

	// // обращения через точку заключены в скобки {...}
	// Значение = Объект{.Поле}
	// Значение = Объект{.Добавить(П1, П2)}
	//

	Поля = Парсер_Узлы.ВыражениеПоле.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Имя"); // строка
	Поля.Добавить("Аргументы"); // неопределено, массив (неопределено, один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеИндекс", Новый ТаблицаЗначений);
	// Хранит информацию об обращении к элементу объекта по индексу.
	// Пример:
	//

	// // обращение по индексу заключено в скобки {...}
	// Значение = Объект{[Ключ]}
	//

	Поля = Парсер_Узлы.ВыражениеИндекс.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеИдентификатор", Новый ТаблицаЗначений);
	// Хранит информацию об обращении к идентификатору.
	// В поле Голова содержится объект области видимости соответствующий идентификатору.
	// В поле Хвост содержится последовательность обращений через точку и по индексу.
	// В поле Аргументы содержатся аргументы вызова (если это вызов).
	// Пример:
	//

	// // идентификатор заключен в скобки {...}
	// // поле "Голова" будет содержать объект переменной "Запрос";
	// // поле "Хвост" будет содержать три обращения;
	// // поле "Аргументы" будет равно Неопределено, т.к. обращение к "Запрос" не является вызовом.
	// Возврат {Запрос.Выполнить().Выгрузить()[0]};
	//

	Поля = Парсер_Узлы.ВыражениеИдентификатор.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Голова"); // структура (ЭлементОкружения)
	Поля.Добавить("Хвост"); // массив (ВыражениеПоле, ВыражениеИндекс)
	Поля.Добавить("Аргументы"); // неопределено, массив (неопределено, один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеУнарное", Новый ТаблицаЗначений);
	// Хранит унарное выражение.
	// Пример:
	//

	// // унарные выражения заключены в скобки {...}
	// // поле "Операция.Токен" равно либо Токены.ЗнакСложения, либо Токены.ЗнакВычитания
	// // поле "Операнд" хранит операнд-выражение
	// Значение = {-Сумма} * 2;
	// Значение = {+Сумма};
	// Значение = {-(Сумма1 + Сумма2)} / 2;
	//

	Поля = Парсер_Узлы.ВыражениеУнарное.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Операция"); // один из ТаблицаТокенов
	Поля.Добавить("Операнд"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеБинарное", Новый ТаблицаЗначений);
	// Хранит бинарное выражение.
	// Пример:
	//

	// // бинарные выражения заключены в скобки {...}
	// // поле "Операция.Токен" равно одному из допустимых операторов:
	// // - логических (кроме "Не")
	// // - реляционных
	// // - арифметических
	// // поля "ЛевыйОперанд" и "ПравыйОперанд" содержат операнды-выражения
	// Если {Не Отмена И Продолжить} Тогда
	//     Значение = {Сумма1 + {Сумма2 * Коэффициент}};
	// КонецЕсли;
	//

	Поля = Парсер_Узлы.ВыражениеБинарное.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("ЛевыйОперанд"); // структура (один из #Выражения)
	Поля.Добавить("Операция"); // один из ТаблицаТокенов
	Поля.Добавить("ПравыйОперанд"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеНовый", Новый ТаблицаЗначений);
	// Хранит выражение "Новый".
	// Для совместимости с OneScript поддерживается
	// обращение к конструктору через точку (поле Хвост)
	// Пример:
	//

	// // выражения "Новый" заключены в скобки {...}
	// // в этом варианте поле "Имя" хранит имя типа "Массив",
	// // а поле "Аргументы" хранит массив из одного выражения
	// Параметры = {Новый Массив(1)};
	// Параметры[0] = 10;
	// // в этом варианте поле "Имя" равно Неопределено,
	// // а поле "Аргументы" хранит массив из двух выражений
	// Массив = {Новый (Тип("Массив"), Параметры)};
	//

	// Инвариант: если (ВыражениеНовый.Имя = Неопределено) то (0 < ВыражениеНовый.Аргументы.Количество() <= 2)
	Поля = Парсер_Узлы.ВыражениеНовый.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Имя"); // неопределено, строка
	Поля.Добавить("Аргументы"); // массив (один из #Выражения)
	Поля.Добавить("Хвост"); // массив (ВыражениеПоле, ВыражениеИндекс)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеТернарное", Новый ТаблицаЗначений);
	// Хранит тернарное выражение "?(,,)".
	// Пример:
	//

	// Значение = ?(Ложь,   // поле "Выражение"
	//     Неопределено,    // поле "Тогда"
	//     Новый Массив     // поле "Иначе"
	// ).Количество();      // поле "Хвост"
	//

	Поля = Парсер_Узлы.ВыражениеТернарное.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Тогда"); // структура (один из #Выражения)
	Поля.Добавить("Иначе"); // структура (один из #Выражения)
	Поля.Добавить("Хвост"); // массив (ВыражениеПоле, ВыражениеИндекс)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеСкобочное", Новый ТаблицаЗначений);
	// Хранит скобочное выражение.
	// Пример:
	//

	// // скобочное выражение заключено в скобки {...}
	// Сумма = {(Сумма1 + Сумма2)} * Количество;
	//

	Поля = Парсер_Узлы.ВыражениеСкобочное.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеНе", Новый ТаблицаЗначений);
	// Хранит выражение, к которому применено логическое отрицание "Не".
	// Пример:
	//

	// // выражение-отрицание заключено в скобки {...}
	// НеРавны = {Не Сумма1 = Сумма2};
	//

	Поля = Парсер_Узлы.ВыражениеНе.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеСтроковое", Новый ТаблицаЗначений);
	// Хранит строковое выражение.
	// Поле "Элементы" хранит упорядоченный список частей строки.
	// Пример:
	//

	// Строка1 = "Часть1" "Часть2"; // эта строка состоит из двух частей типа Типы.Строка
	// Строка2 =                    // эта строка состоит из пяти частей типа:
	// "Начало строки               // Типы.НачалоСтроки
	// | продолжение строки         // Типы.ПродолжениеСтроки
	// | еще продолжение строки     // Типы.ПродолжениеСтроки
	// | окончание строки"          // Типы.ОкончаниеСтроки
	// "еще часть";                 // Типы.Строка
	//

	Поля = Парсер_Узлы.ВыражениеСтроковое.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Элементы"); // массив (ВыражениеЛитерал)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ВыражениеЖдать", Новый ТаблицаЗначений);
	// Хранит выражение "Ждать".
	// Пример:
	//

	// Результат = {Ждать ПредупреждениеАсинх(Текст)};
	//

	Поля = Парсер_Узлы.ВыражениеЖдать.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

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

[Assistant] Процедура ИнициализироватьВыражения()


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

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

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

	Парсер_Узлы.Вставить("ОператорПрисваивания", Новый ТаблицаЗначений);
	// Хранит оператор присваивания.
	Поля = Парсер_Узлы.ОператорПрисваивания.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("ЛевыйОперанд"); // структура (ВыражениеИдентификатор)
	Поля.Добавить("ПравыйОперанд"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорВозврат", Новый ТаблицаЗначений);
	// Хранит оператор "Возврат".
	// Поле "Выражение" равно Неопределено если это возврат из процедуры.
	Поля = Парсер_Узлы.ОператорВозврат.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // неопределено, структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорПрервать", Новый ТаблицаЗначений);
	// Хранит оператор "Прервать".
	Поля = Парсер_Узлы.ОператорПрервать.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорПродолжить", Новый ТаблицаЗначений);
	// Хранит оператор "Продолжить".
	Поля = Парсер_Узлы.ОператорПродолжить.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорВызватьИсключение", Новый ТаблицаЗначений);
	// Хранит оператор "ВызватьИсключение".
	// Поле "Аргументы" равно Неопределено если это вариант оператора без выражения и аргументов.
	Поля = Парсер_Узлы.ОператорВызватьИсключение.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Аргументы"); // неопределено, массив (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорВыполнить", Новый ТаблицаЗначений);
	// Хранит оператор "Выполнить".
	Поля = Парсер_Узлы.ОператорВыполнить.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

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

	Парсер_Узлы.Вставить("ОператорЕсли", Новый ТаблицаЗначений);
	// Хранит оператор "Если".
	// Пример:
	//

	// Если Сумма > 0 Тогда // поле "Выражение" хранит условие (выражение)
	//     // поле "Тогда" хранит операторы в этом блоке
	// ИначеЕсли Сумма = 0 Тогда
	//     // поле-массив "ИначеЕсли" хранит последовательность блоков ИначеЕсли
	// Иначе
	//     // поле "Иначе" хранит операторы в этом блоке
	// КонецЕсли
	//

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

	Парсер_Узлы.Вставить("ОператорИначе", Новый ТаблицаЗначений);
	// Хранит блок "Иначе"
	Поля = Парсер_Узлы.ОператорИначе.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Операторы"); // массив (один из #Операторы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорИначеЕсли", Новый ТаблицаЗначений);
	// Хранит блок "ИначеЕсли" оператора "Если".
	// Пример:
	//

	// ...
	// ИначеЕсли Сумма < 0 Тогда // поле "Выражение" хранит условие (выражение)
	//     // поле "Тогда" хранит операторы в этом блоке
	// ...
	//

	Поля = Парсер_Узлы.ОператорИначеЕсли.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Тогда"); // массив (один из #Операторы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорПока", Новый ТаблицаЗначений);
	// Хранит оператор цикла "Пока".
	// Пример:
	//

	// Пока Индекс > 0 Цикл // поле "Выражение" хранит условие (выражение)
	//     // поле "Операторы" хранит операторы в этом блоке
	// КонецЦикла
	//

	Поля = Парсер_Узлы.ОператорПока.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Выражение"); // структура (один из #Выражения)
	Поля.Добавить("Операторы"); // массив (один из #Операторы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорДля", Новый ТаблицаЗначений);
	// Хранит оператор цикла "Для".
	// Пример:
	//

	// Для Индекс = 0      // поля "Идентификатор" и "Старт" хранят переменную и выражение инициализации.
	//   По Длина - 1 Цикл // поле "Финиш" хранит выражение границы
	//     // поле "Операторы" хранит операторы в этом блоке
	// КонецЦикла
	//

	Поля = Парсер_Узлы.ОператорДля.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Идентификатор"); // структура (ВыражениеИдентификатор)
	Поля.Добавить("Старт"); // структура (один из #Выражения)
	Поля.Добавить("Финиш"); // структура (один из #Выражения)
	Поля.Добавить("Операторы"); // массив (один из #Операторы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорДляКаждого", Новый ТаблицаЗначений);
	// Хранит оператор цикла "Для Каждого".
	// Пример:
	//

	// Для Каждого Элемент // поле "Идентификатор" хранит переменную.
	//   Из Список Цикл    // поле "Коллекция" хранит выражение коллекции.
	//     // поле "Операторы" хранит операторы в этом блоке
	// КонецЦикла
	//

	Поля = Парсер_Узлы.ОператорДляКаждого.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Идентификатор"); // структура (ВыражениеИдентификатор)
	Поля.Добавить("Коллекция"); // структура (один из #Выражения)
	Поля.Добавить("Операторы"); // массив (один из #Операторы)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорПопытка", Новый ТаблицаЗначений);
	// Хранит оператор "Попытка"
	// Пример:
	//

	// Попытка
	//     // поле "Попытка" хранит операторы в этом блоке.
	// Исключение
	//     // поле "Исключение" хранит операторы в этом блоке
	// КонецПопытки
	//

	Поля = Парсер_Узлы.ОператорПопытка.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Попытка"); // массив (один из #Операторы)
	Поля.Добавить("Исключение"); // структура (ОператорИсключение)
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

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

	Парсер_Узлы.Вставить("ОператорПерейти", Новый ТаблицаЗначений);
	// Хранит оператор "Перейти"
	Поля = Парсер_Узлы.ОператорПерейти.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Метка"); // строка
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

	Парсер_Узлы.Вставить("ОператорМетка", Новый ТаблицаЗначений);
	// Хранит оператор метки.
	Поля = Парсер_Узлы.ОператорМетка.Колонки;
	Поля.Добавить("Тип"); // строка (один из Типы)
	Поля.Добавить("Метка"); // строка
	Поля.Добавить("Начало"); // один из ТаблицаТокенов
	Поля.Добавить("Конец"); // один из ТаблицаТокенов

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

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

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

[Assistant] Процедура ИнициализироватьОператоры()


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

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

Функция ИмяФункции(Сообщение, Контекст, Настройки) Экспорт
	ЧерезПровайдера = ЭтоЗапросЧерезПровайдера(Настройки);

	Промпт = Неопределено;
	Если ЧерезПровайдера Тогда
		Промпт = ПолучитьПромптДляЧата();
	КонецЕсли;
	Сообщения = СформироватьСообщения(Сообщение, Контекст, Промпт);

	Возврат ОтправитьСообщения(Сообщения, ПолучитьТипыЗапросов().Чат, Настройки);
КонецФункции

&НаКлиенте

Функция ПолучитьВозможныеТипы(Заголовок, Настройки) Экспорт
	ЧерезПровайдера = ЭтоЗапросЧерезПровайдера(Настройки);

	Промпт = Неопределено;
	Если ЧерезПровайдера Тогда
		Промпт = ПолучитьПромптОпределениеТипов();
	КонецЕсли;
	МассивСообщений = СформироватьСообщения(Заголовок, Неопределено, Промпт);

	Возврат ОтправитьСообщения(МассивСообщений, ПолучитьТипыЗапросов().ОпределениеТипов, Настройки);
КонецФункции

&НаКлиенте

Функция ПолучитьНастройки() Экспорт
	Результат = Новый Структура;
	Результат.Вставить("ПровайдерИИ");
	Результат.Вставить("ТокенИИ");
	Результат.Вставить("МодельИИ");
	Возврат Результат;
КонецФункции

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

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

#Область Модули

&НаКлиенте

Функция СлужебныеФункции()
	Возврат ВладелецФормы.СлужебныеФункции();
КонецФункции

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

&НаКлиенте

Функция ПолучитьТаймаутHTTPСоединения() Экспорт
	Возврат 240;
КонецФункции

&НаКлиенте

Функция ПолучитьТипыЗапросов()
	Результат = Новый Структура;
	Результат.Вставить("Чат", "chat");
	Результат.Вставить("ОпределениеТипов", "types_detection");

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

&НаКлиенте

Функция ЭтоЗапросЧерезПровайдера(Настройки)
	Возврат НЕ ПустаяСтрока(Настройки.ПровайдерИИ)
	И НЕ ПустаяСтрока(Настройки.МодельИИ)
	И НЕ ПустаяСтрока(Настройки.ТокенИИ);
КонецФункции

&НаКлиенте

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

	Возврат ОтправитьЧерезСерверНакидки(МассивСообщений, ТипЗапроса);
КонецФункции

&НаКлиенте

Функция ОтправитьЧерезСерверНакидки(МассивСообщений, ТипСообщения)
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("messages", МассивСообщений);
	ПараметрыЗапроса.Вставить("type", ТипСообщения);
	ТелоЗапрос = СлужебныеФункции().СтруктураВJSON(ПараметрыЗапроса);

	ЗаголовкиHTTP = Новый Соответствие;
	ЗаголовкиHTTP.Вставить("Content-Type", "application/json");

	HTTPЗапрос = Новый HTTPЗапрос("", ЗаголовкиHTTP);
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапрос);

	HTTPСоединение = Новый HTTPСоединение("ai.crimsongold.ru", , , , , ПолучитьТаймаутHTTPСоединения(), Новый ЗащищенноеСоединениеOpenSSL);

	HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

	ТелоОтвет = HTTPОтвет.ПолучитьТелоКакСтроку();

	ОтветJSON = СлужебныеФункции().JSONВСтруктуру(ТелоОтвет);

	Результат = Неопределено;
	Если НЕ ОтветJSON.Свойство("content", Результат) Тогда
		Возврат Неопределено;
	КонецЕсли;

	Результат = ОбработатьРезультат(Результат);
	Возврат Результат;
КонецФункции

&НаКлиенте

Функция ОтправитьЧерезПровайдера(МассивСообщений, Настройки)
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("messages", МассивСообщений);
	ПараметрыЗапроса.Вставить("model", Настройки.МодельИИ);
	ПараметрыЗапроса.Вставить("stream", Ложь);
	ТелоЗапрос = СлужебныеФункции().СтруктураВJSON(ПараметрыЗапроса);

	СтруктураАдреса = СлужебныеФункции().РазобратьURL(Настройки.ПровайдерИИ);

	ЗаголовкиHTTP = Новый Соответствие;
	ЗаголовкиHTTP.Вставить("Content-Type", "application/json");
	ЗаголовкиHTTP.Вставить("Authorization", "Bearer " + Настройки.ТокенИИ);

	HTTPЗапрос = Новый HTTPЗапрос(СтруктураАдреса.Адрес, ЗаголовкиHTTP);
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапрос);

	ЗащищенноеСоединение = Неопределено;
	Если СтруктураАдреса.Протокол = "https" Тогда
		ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
	КонецЕсли;

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

	Если ОтветJSON.choices.Количество() = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;

	Результат = ОтветJSON.choices[0].message.content;

	Результат = ОбработатьРезультат(Результат);

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

&НаКлиенте

Функция ОбработатьРезультат(Знач Результат)
	Результат = УбратьМаркерыКода(Результат);

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

&НаКлиенте

Функция УбратьМаркерыКода(Знач Результат)
	Результат = СокрЛП(Результат);

	МаркерКода = "```json";
	НачальнаяПозиция = СтрНайти(Результат, МаркерКода);
	Если НачальнаяПозиция = 0 Тогда
		МаркерКода = "```";
		НачальнаяПозиция = СтрНайти(Результат, МаркерКода);
	КонецЕсли;

	Если НачальнаяПозиция > 0 Тогда
		Результат = Сред(Результат, НачальнаяПозиция + СтрДлина(МаркерКода));
	КонецЕсли;

	КонечнаяПозиция = СтрНайти(Результат, МаркерКода, НаправлениеПоиска.СКонца);
	Если КонечнаяПозиция > 0 Тогда
		Результат = Лев(Результат, КонечнаяПозиция - 1);
	КонецЕсли;

	Возврат СокрЛП(Результат);
КонецФункции

&НаКлиенте

Функция СформироватьСообщения(Знач Сообщение, Контекст, Промпт = Неопределено)
	Сообщения = Новый Массив;

	Если Промпт <> Неопределено Тогда
		Сообщения.Добавить(Новый Структура("role,content", "system", Промпт));
	КонецЕсли;

	Если Контекст <> Неопределено Тогда
		Для Каждого ПредыдущееСообщение Из Контекст Цикл
			Сообщения.Добавить(ПолучитьСообщение(ПредыдущееСообщение.Сообщение, ПредыдущееСообщение.ЭтоВходящее));
		КонецЦикла;
	КонецЕсли;

	Сообщения.Добавить(ПолучитьСообщение(Сообщение, Ложь));

	Возврат Сообщения;
КонецФункции

&НаКлиенте

Функция ПолучитьСообщение(Содержание, ЭтоВходящее)
	Результат = Новый Структура;
	Результат.Вставить("role", ?(ЭтоВходящее, "assistant", "user"));
	Результат.Вставить("content", Содержание);
	Возврат Результат;
КонецФункции

&НаКлиенте

Функция ПолучитьПромптДляЧата()
	Если ПустаяСтрока(мПромптДляЧата) Тогда
		мПромптДляЧата = ПолучитьПромптДляЧатаНаСервере();
	КонецЕсли;

	Возврат мПромптДляЧата;
КонецФункции

&НаКлиенте

Функция ПолучитьПромптОпределениеТипов()
	Если ПустаяСтрока(мПромптОпределениеТипов) Тогда
		мПромптОпределениеТипов = ПолучитьПромптОпределениеТиповСервере();
	КонецЕсли;

	Возврат мПромптОпределениеТипов;
КонецФункции

&НаСервере

Функция ПолучитьПромптДляЧатаНаСервере()
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	Возврат ОбработкаОбъект.ПолучитьМакет("Промпт").ПолучитьТекст();
КонецФункции

&НаСервере

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

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

[Assistant] Функция ОтправитьВЧат(Сообщение, Контекст, Настройки)


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

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

Функция ПолучитьОписаниеКоллекцииСтрокДереваЗначений(КоллекцияСтрок, ИмяПеременной, ПутьКДанным, КешСсылок)
Переменная = ПолучитьКраткуюСтруктуруПеременной(КоллекцияСтрок, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();

	Индекс = 0;

	Для Каждого СтрокаДерева Из КоллекцияСтрок Цикл
		Имя = "Строка " + Индекс;
		ПутьСтроки = ПутьКДанным + "[" + Формат(Индекс, "ЧН=; ЧГ=0") + "]";
		ДанныеСтроки = ПолучитьКраткуюСтруктуруПеременной(СтрокаДерева, Имя, ПутьСтроки, КешСсылок);
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПолучитьОписаниеКоллекцииСтрокДереваЗначений(КоллекцияСтрок, ИмяПеременной, ПутьКДанным, КешСсылок)

	Переменная = ПолучитьКраткуюСтруктуруПеременной(КоллекцияСтрок, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();

	Индекс = 0;

	Для Каждого СтрокаДерева Из КоллекцияСтрок Цикл
		Имя = "Строка " + Индекс;
		ПутьСтроки = ПутьКДанным + "[" + Формат(Индекс, "ЧН=; ЧГ=0") + "]";
		ДанныеСтроки = ПолучитьКраткуюСтруктуруПеременной(СтрокаДерева, Имя, ПутьСтроки, КешСсылок);
		Индекс = Индекс + 1;
		ИдентификаторПеременной = НовыйИдентификаторПеременной();
		ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеСтроки);
	КонецЦикла;

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

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

	Переменная = ПолучитьКраткуюСтруктуруПеременной(Соответствие, ИмяПеременной, ПутьКДанным, КешСсылок);

	ЭтоСоответствие = (ТипЗнч(Соответствие) = Тип("Соответствие"));
	ДанныеПеременной = Новый Структура();

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

		Если ЭтоСоответствие Тогда
			ПутьЗначения = ПутьКДанным + "[&quote;" + Обход.Ключ + "&quote;]";
		Иначе
			ПутьЗначения = ПутьКДанным + "." + Обход.Ключ;
		КонецЕсли;

		ДанныеКолонки = ПолучитьКраткуюСтруктуруПеременной(Обход.Значение, Обход.Ключ, ПутьЗначения, КешСсылок);
		ИдентификаторПеременной = НовыйИдентификаторПеременной();
		ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеКолонки);

	КонецЦикла;

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

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

	Переменная = ПолучитьКраткуюСтруктуруПеременной(Массив, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();
	Индекс = 0;

	Для Каждого Значение Из Массив Цикл
		Имя = Формат(Индекс, "ЧН=; ЧГ=0");
		ПутьЗначения = ПутьКДанным + "[" + Формат(Индекс, "ЧН=; ЧГ=0") + "]";
		ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(Значение, Имя, ПутьЗначения, КешСсылок);
		ИдентификаторПеременной = НовыйИдентификаторПеременной();
		ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);
		Индекс = Индекс + 1;
	КонецЦикла;

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

Функция ПолучитьОписаниеКлючаИЗначения(КлючЗначение, ИмяПеременной, ПутьКДанным, КешСсылок)

	Переменная = ПолучитьКраткуюСтруктуруПеременной(КлючЗначение, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();

	Путь = ПутьКДанным + ".Ключ";
	Имя = "Ключ";
	ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(КлючЗначение.Ключ, Имя, Путь, КешСсылок);
	ИдентификаторПеременной = НовыйИдентификаторПеременной();
	ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);

	Путь = ПутьКДанным + ".Значение";
	Имя = "Значение";
	ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(КлючЗначение.Значение, Имя, Путь, КешСсылок);
	ИдентификаторПеременной = НовыйИдентификаторПеременной();
	ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

Функция ПолучитьОписаниеЭлементаСпискаЗначений(ЭлементСписка, ИмяПеременной, ПутьКДанным, КешСсылок)

	Переменная = ПолучитьКраткуюСтруктуруПеременной(ЭлементСписка, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();

	Путь = ПутьКДанным + ".Значение";
	Имя = "Значение";
	ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(ЭлементСписка.Значение, Имя, Путь, КешСсылок);
	ИдентификаторПеременной = НовыйИдентификаторПеременной();
	ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);

	Путь = ПутьКДанным + ".Пометка";
	Имя = "Пометка";
	ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(ЭлементСписка.Пометка, Имя, Путь, КешСсылок);
	ИдентификаторПеременной = НовыйИдентификаторПеременной();
	ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);

	Путь = ПутьКДанным + ".Представление";
	Имя = "Представление";
	ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(ЭлементСписка.Представление, Имя, Путь, КешСсылок);
	ИдентификаторПеременной = НовыйИдентификаторПеременной();
	ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

Функция ПолучитьОписаниеСпискаЗначений(СписокЗначений, ИмяПеременной, ПутьКДанным, КешСсылок)

	Переменная = ПолучитьКраткуюСтруктуруПеременной(СписокЗначений, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();
	Индекс = 0;

	Для Каждого Обход Из СписокЗначений Цикл
		Имя = Формат(Индекс, "ЧН=; ЧГ=0");
		ПутьЗначения = ПутьКДанным + "[" + Формат(Индекс, "ЧН=; ЧГ=0") + "]";
		ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(Обход.Значение, Имя, ПутьЗначения, КешСсылок);
		ИдентификаторПеременной = НовыйИдентификаторПеременной();
		ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);
		Индекс = Индекс + 1;
	КонецЦикла;

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

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

	Переменная = ПолучитьКраткуюСтруктуруПеременной(Движения, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();
	Индекс = 0;

	Для Каждого Движение Из Движения Цикл
		Имя = Формат(Индекс, "ЧН=; ЧГ=0");
		ПутьЗначения = ПутьКДанным + "[" + Формат(Индекс, "ЧН=; ЧГ=0") + "]";
		ДанныеЗначения = ПолучитьКраткуюСтруктуруПеременной(Движение, Имя, ПутьЗначения, КешСсылок);
		ИдентификаторПеременной = НовыйИдентификаторПеременной();
		ДанныеПеременной.Вставить(ИдентификаторПеременной, ДанныеЗначения);
		Индекс = Индекс + 1;
	КонецЦикла;

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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

Функция ПолучитьОписаниеМенеджераЗаписейРегистра(Запись, ИмяПеременной, ПутьКДанным, КешСсылок)

	Переменная = ПолучитьКраткуюСтруктуруПеременной(Запись, ИмяПеременной, ПутьКДанным, КешСсылок);

	ДанныеПеременной = Новый Структура();

	Реквизиты = ПолучитьРеквизитыНабораЗаписей(Запись);

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

	Переменная.Вставить("children", ДанныеПеременной);

	Возврат Переменная;

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

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


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

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

Процедура СформироватьДиаграммуСерьезностьДефектов_New()
Перем Выборка, Запрос, КоличествоОшибок, КоличествоПровалов, КоличествоПропущенных, КоличествоТестовыхСлучаев, КоличествоУспешных, СерияОшибки, СерияПадения, СерияПропуски, СерияУспешно, ТочкаДиаграммы;

	Диаграмма_СерьезностьДефектов.Очистить();

	Диаграмма_СерьезностьДефектов.ТипДиаграммы=ТипДиаграммы.Гистограмма;

	СерияСерьезность_Блокирующая =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Блокирующая");
	СерияСерьезность_Блокирующая.Цвет = новый Цвет(255,100,100);
	СерияСерьезность_Критическая =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Критическая");
	СерияСерьезность_Критическая.Цвет = новый Цвет(255,100,255);
	СерияСерьезность_Значительная =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Значительная");
	СерияСерьезность_Значительная.Цвет = новый Цвет(255,200,200);
	СерияСерьезность_Незначительная =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Незначительная");
	СерияСерьезность_Незначительная.Цвет = новый Цвет(155,255,255);
	СерияСерьезность_Тривиальная =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Тривиальная");
	СерияСерьезность_Тривиальная.Цвет = новый Цвет(155,255,155);
	СерияСерьезность_Неопределена =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Неопределена");
	СерияСерьезность_Неопределена.Цвет = новый Цвет(205,205,205);

	КоличествоТестовыхСлучаев = 1;

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Т.Проверка,
	|	Т.ТестируемыйКлиент,
	|	Т.Тест,
	|	Т.РезультатВыполнения,
	|	Т.ОписаниеОшибки,
	|	Т.ДатаВыполенения,
	|	Т.НомерПоПорядку,
	|	Т.КоличествоТестовыхСлучаев,
	|	Т.КоличествоПровалов,
	|	Т.КоличествоОшибок,
	|	Т.КоличествоПропущенных,
	|	Т.ВремяВыполнения,
	|	ВЫБОР
	|		КОГДА Т.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.ПустаяСсылка)
	|			ТОГДА Т.Тест.СерьезностьДефекта
	|		ИНАЧЕ Т.СерьезностьДефекта
	|	КОНЕЦ КАК СерьезностьДефекта
	|ПОМЕСТИТЬ ВтПоследниеПроверки
	|ИЗ
	|	РегистрСведений.ПротоколыВыполненияТестов КАК Т
	|ГДЕ
	|	Т.ТестируемыйКлиент = &ТестируемыйКлиент
	|	И Т.Проверка = &Проверка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СУММА(ВтПоследниеПроверки.КоличествоТестовыхСлучаев) КАК КоличествоТестовыхСлучаев,
	|	ВтПоследниеПроверки.СерьезностьДефекта,
	|	ВЫБОР
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Блокирующая)
	|			ТОГДА 5
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Критическая)
	|			ТОГДА 4
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Значительная)
	|			ТОГДА 3
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Незначительная)
	|			ТОГДА 2
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Тривиальная)
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК порядок
	|ПОМЕСТИТЬ ВтДефекты
	|ИЗ
	|	ВтПоследниеПроверки КАК ВтПоследниеПроверки
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтПоследниеПроверки.СерьезностьДефекта
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Блокирующая),
	|	5
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Критическая),
	|	4
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Значительная),
	|	3
	|
	|ОБЪЕДИНИТЬ ВСЕ
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура СформироватьДиаграммуСерьезностьДефектов_New()

	Перем Выборка, Запрос, КоличествоОшибок, КоличествоПровалов, КоличествоПропущенных, КоличествоТестовыхСлучаев, КоличествоУспешных, СерияОшибки, СерияПадения, СерияПропуски, СерияУспешно, ТочкаДиаграммы;

	Диаграмма_СерьезностьДефектов.Очистить();

	Диаграмма_СерьезностьДефектов.ТипДиаграммы=ТипДиаграммы.Гистограмма;

	СерияСерьезность_Блокирующая =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Блокирующая");
	СерияСерьезность_Блокирующая.Цвет = новый Цвет(255,100,100);
	СерияСерьезность_Критическая =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Критическая");
	СерияСерьезность_Критическая.Цвет = новый Цвет(255,100,255);
	СерияСерьезность_Значительная =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Значительная");
	СерияСерьезность_Значительная.Цвет = новый Цвет(255,200,200);
	СерияСерьезность_Незначительная =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Незначительная");
	СерияСерьезность_Незначительная.Цвет = новый Цвет(155,255,255);
	СерияСерьезность_Тривиальная =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Тривиальная");
	СерияСерьезность_Тривиальная.Цвет = новый Цвет(155,255,155);
	СерияСерьезность_Неопределена =  Диаграмма_СерьезностьДефектов.УстановитьСерию("Неопределена");
	СерияСерьезность_Неопределена.Цвет = новый Цвет(205,205,205);

	КоличествоТестовыхСлучаев = 1;

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Т.Проверка,
	|	Т.ТестируемыйКлиент,
	|	Т.Тест,
	|	Т.РезультатВыполнения,
	|	Т.ОписаниеОшибки,
	|	Т.ДатаВыполенения,
	|	Т.НомерПоПорядку,
	|	Т.КоличествоТестовыхСлучаев,
	|	Т.КоличествоПровалов,
	|	Т.КоличествоОшибок,
	|	Т.КоличествоПропущенных,
	|	Т.ВремяВыполнения,
	|	ВЫБОР
	|		КОГДА Т.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.ПустаяСсылка)
	|			ТОГДА Т.Тест.СерьезностьДефекта
	|		ИНАЧЕ Т.СерьезностьДефекта
	|	КОНЕЦ КАК СерьезностьДефекта
	|ПОМЕСТИТЬ ВтПоследниеПроверки
	|ИЗ
	|	РегистрСведений.ПротоколыВыполненияТестов КАК Т
	|ГДЕ
	|	Т.ТестируемыйКлиент = &ТестируемыйКлиент
	|	И Т.Проверка = &Проверка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СУММА(ВтПоследниеПроверки.КоличествоТестовыхСлучаев) КАК КоличествоТестовыхСлучаев,
	|	ВтПоследниеПроверки.СерьезностьДефекта,
	|	ВЫБОР
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Блокирующая)
	|			ТОГДА 5
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Критическая)
	|			ТОГДА 4
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Значительная)
	|			ТОГДА 3
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Незначительная)
	|			ТОГДА 2
	|		КОГДА ВтПоследниеПроверки.СерьезностьДефекта = ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Тривиальная)
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК порядок
	|ПОМЕСТИТЬ ВтДефекты
	|ИЗ
	|	ВтПоследниеПроверки КАК ВтПоследниеПроверки
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтПоследниеПроверки.СерьезностьДефекта
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Блокирующая),
	|	5
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Критическая),
	|	4
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Значительная),
	|	3
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Незначительная),
	|	2
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	0,
	|	ЗНАЧЕНИЕ(Перечисление.ВариантыСерьезностиДефектов.Тривиальная),
	|	1
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СУММА(ВтДефекты.КоличествоТестовыхСлучаев) КАК КоличествоТестовыхСлучаев,
	|	ВтДефекты.СерьезностьДефекта,
	|	ВтДефекты.порядок КАК порядок
	|ИЗ
	|	ВтДефекты КАК ВтДефекты
	|
	|СГРУППИРОВАТЬ ПО
	|	ВтДефекты.СерьезностьДефекта,
	|	ВтДефекты.порядок
	|
	|УПОРЯДОЧИТЬ ПО
	|	порядок УБЫВ";

	Запрос.УстановитьПараметр("ТестируемыйКлиент",Объект.ТестируемыйКлиент);
	Запрос.УстановитьПараметр("Проверка",Объект.Проверка);
	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл

		КоличествоТестовыхСлучаев = Выборка.КоличествоТестовыхСлучаев;
		ТекущаяСерия = Неопределено;
		ТочкаДиаграммы = Неопределено;

		Если Выборка.СерьезностьДефекта=Перечисления.ВариантыСерьезностиДефектов.Блокирующая тогда
			ТекущаяСерия = СерияСерьезность_Блокирующая;
		ИначеЕсли Выборка.СерьезностьДефекта=Перечисления.ВариантыСерьезностиДефектов.Критическая тогда
			ТекущаяСерия = СерияСерьезность_Критическая;
		ИначеЕсли Выборка.СерьезностьДефекта=Перечисления.ВариантыСерьезностиДефектов.Значительная тогда
			ТекущаяСерия = СерияСерьезность_Значительная;
		ИначеЕсли Выборка.СерьезностьДефекта=Перечисления.ВариантыСерьезностиДефектов.Незначительная тогда
			ТекущаяСерия = СерияСерьезность_Незначительная;
		ИначеЕсли Выборка.СерьезностьДефекта=Перечисления.ВариантыСерьезностиДефектов.Тривиальная тогда
			ТекущаяСерия = СерияСерьезность_Тривиальная;
		Иначе
			ТекущаяСерия = СерияСерьезность_Неопределена;
		КонецЕсли;

		Если НЕ ЗначениеЗаполнено(Выборка.СерьезностьДефекта) Тогда
			СерьезностьДефекта = "Неопределена";
		Иначе
			СерьезностьДефекта = Строка(Выборка.СерьезностьДефекта);
		КонецЕсли;

		ТочкаДиаграммы = Диаграмма_СерьезностьДефектов.УстановитьТочку(СерьезностьДефекта);
		Диаграмма_СерьезностьДефектов.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерия, КоличествоТестовыхСлучаев);

	КонецЦикла;

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

&НаСервере


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

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

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

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
	|	Т.Проверка КАК Проверка
	|ИЗ
	|	РегистрСведений.ПротоколыВыполненияТестов КАК Т
	|ГДЕ
	|	Т.ТестируемыйКлиент = &ТестируемыйКлиент
	|   И &Напраление
	|
	|УПОРЯДОЧИТЬ ПО
	|	Т.Проверка.Код УБЫВ";
	Запрос.УстановитьПараметр("ТестируемыйКлиент",ТестируемыйКлиент);
	Запрос.УстановитьПараметр("ТекущаяПроверка",ТекущаяПроверка);

	Если Направление="назад" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Напраление","Т.Проверка<&ТекущаяПроверка");
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Напраление","Т.Проверка>&ТекущаяПроверка");
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"Т.Проверка.Код УБЫВ","Т.Проверка.Код ВОЗР");
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПолучитьПроверкуДляТестируемогоКлиента(Знач ТестируемыйКлиент,Знач ТекущаяПроверка,Знач Направление="назад")

	Проверка = Справочники.Проверки.ПустаяСсылка();

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
	|	Т.Проверка КАК Проверка
	|ИЗ
	|	РегистрСведений.ПротоколыВыполненияТестов КАК Т
	|ГДЕ
	|	Т.ТестируемыйКлиент = &ТестируемыйКлиент
	|   И &Напраление
	|
	|УПОРЯДОЧИТЬ ПО
	|	Т.Проверка.Код УБЫВ";
	Запрос.УстановитьПараметр("ТестируемыйКлиент",ТестируемыйКлиент);
	Запрос.УстановитьПараметр("ТекущаяПроверка",ТекущаяПроверка);

	Если Направление="назад" Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Напраление","Т.Проверка<&ТекущаяПроверка");
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"&Напраление","Т.Проверка>&ТекущаяПроверка");
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"Т.Проверка.Код УБЫВ","Т.Проверка.Код ВОЗР");
	КонецЕсли;

	РезультатЗапроса = Запрос.Выполнить();

	Если НЕ РезультатЗапроса.Пустой() Тогда

		Выборка = РезультатЗапроса.Выбрать();

		Если Выборка.Следующий() Тогда
			Проверка = Выборка.Проверка;
		КонецЕсли;

	КонецЕсли;

	Возврат Проверка;

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

Процедура ПустаяПроверка(Команда)
	Если Элементы.ПустаяПроверка.Пометка=Истина Тогда
		Элементы.ПустаяПроверка.Пометка=Ложь;
		УстановитьОтборыСпискаТестов();
	Иначе
		Элементы.ПустаяПроверка.Пометка=Истина;
		Объект.Проверка = Неопределено;
		УстановитьОтборыСпискаТестов(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте

Процедура ТестируемыйКлиентПриИзменении(Элемент)

	СохранитьНастройкиПользователя();
	УстановитьОтборыСпискаТестов();

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

&НаКлиенте

Процедура УстановитьОтборыСпискаТестов(ИскатьПоследнююПроверку=Истина)

	Если НЕ ЗначениеЗаполнено(ВидСписка_Случаи) Тогда
		ВидСписка_Случаи = "Список";
	КонецЕсли;

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

	Элементы.Падения.ЦветФона = ?(ОтборПадения,новый Цвет(190,190,190),новый Цвет(255,255,255));
	Элементы.Ошибки.ЦветФона = ?(ОтборОшибки,новый Цвет(190,190,190),новый Цвет(255,255,255));
	Элементы.Пропуски.ЦветФона = ?(ОтборПропуски,новый Цвет(190,190,190),новый Цвет(255,255,255));
	Элементы.Успешные.ЦветФона = ?(ОтборУспешные,новый Цвет(190,190,190),новый Цвет(255,255,255));

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

&НаКлиенте

Процедура УстановитьОтборыСпискаСлучаев()

	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("Тест",ТекущийТест);
	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("ТестируемыйКлиент",Объект.ТестируемыйКлиент);
	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("Проверка",Объект.Проверка);
	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("ОтборПадения",ОтборПадения);
	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("ОтборОшибки",ОтборОшибки);
	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("ОтборПропуски",ОтборПропуски);
	СписокСлучаев.Параметры.УстановитьЗначениеПараметра("ОтборУспешные",ОтборУспешные);

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

&НаКлиенте

Процедура УстановитьОтборыСпискаШагов()

	СписокШагов.Параметры.УстановитьЗначениеПараметра("Тест",ТекущийТест);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("ТестовыйСлучай",ТекущийТестовыйСлучай);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("ТестируемыйКлиент",Объект.ТестируемыйКлиент);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("Проверка",Объект.Проверка);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("ОтборПадения",ОтборПадения);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("ОтборОшибки",ОтборОшибки);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("ОтборПропуски",ОтборПропуски);
	СписокШагов.Параметры.УстановитьЗначениеПараметра("ОтборУспешные",ОтборУспешные);

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

&НаСервере

Процедура СохранитьНастройкиПользователя(ИмяНастройки="",ЗначениеНастройки="")

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

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

&НаКлиенте

Процедура СохранитьНастройкиЭлемента(ИмяЭлемента)

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

	СохранитьНастройкиПользователя(ИмяЭлемента,ЭтаФорма[ИмяЭлемента]);

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

&НаКлиенте

Процедура Падения(Команда)
	ОтборПадения=НЕ ОтборПадения;
	УстановитьОтборыСпискаТестов(Ложь);
	УстановитьОтборыСпискаСлучаев();
	УстановитьОтборыСпискаШагов();
	СохранитьНастройкиЭлемента("ОтборПадения");
КонецПроцедуры

&НаКлиенте

Процедура Ошибки(Команда)
	ОтборОшибки=НЕ ОтборОшибки;
	УстановитьОтборыСпискаТестов(Ложь);
	УстановитьОтборыСпискаСлучаев();
	УстановитьОтборыСпискаШагов();
	СохранитьНастройкиЭлемента("ОтборОшибки");
КонецПроцедуры

&НаКлиенте

Процедура Пропуски(Команда)
	ОтборПропуски=НЕ ОтборПропуски;
	УстановитьОтборыСпискаТестов(Ложь);
	УстановитьОтборыСпискаСлучаев();
	УстановитьОтборыСпискаШагов();
	СохранитьНастройкиЭлемента("ОтборПропуски");
КонецПроцедуры

&НаКлиенте

Процедура Успешные(Команда)
	ОтборУспешные=НЕ ОтборУспешные;
	УстановитьОтборыСпискаТестов(Ложь);
	УстановитьОтборыСпискаСлучаев();
	УстановитьОтборыСпискаШагов();
	СохранитьНастройкиЭлемента("ОтборУспешные");
КонецПроцедуры

&НаКлиенте

Процедура СписокТестовПриАктивизацииСтроки(Элемент)
	ТекущиеДанные = Элементы.СписокТестов.ТекущиеДанные;

	Если ТекущиеДанные=Неопределено Тогда
		ТекущийТест = Неопределено;
		//Элементы.ГруппаСлучаи.Видимость = Ложь;
		Возврат;
	КонецЕсли;

	Если ТекущиеДанные.Свойство("Тест") Тогда
		ТекущийТест = ТекущиеДанные.Тест;
	Иначе
		ТекущийТест = ПредопределенноеЗначение("Справочник.Тесты.ПустаяСсылка");
	КонецЕсли;

	УстановитьОтборыСпискаСлучаев();
	УстановитьОтборыСпискаШагов();

	Если НЕ КлючТекущейСтрокиТестов=ПолучитьКлючТекущейСтрокиПоДанным("СписокТестов")
		И Элементы.ГруппаСлучаи.Видимость=Ложь Тогда
		Элементы.ГруппаСлучаи.Видимость = Истина;
		КлючТекущейСтрокиТестов = "";
	КонецЕсли;

	СписокСлучаевПриАктивизацииСтроки(Неопределено);

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

&НаКлиенте

Процедура СкрытьСлучаи(Команда)
	Элементы.ГруппаСлучаи.Видимость = Ложь;
	КлючТекущейСтрокиТестов = ПолучитьКлючТекущейСтрокиПоДанным("СписокТестов");

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

&НаКлиенте

Процедура СкрытьДетализацию(Команда)

	Элементы.ГруппаДетализация.Видимость = Ложь;
	КлючТекущейСтрокиСлучаев = ПолучитьКлючТекущейСтрокиПоДанным("СписокСлучаев");

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

&НаКлиенте


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

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

Функция ИмяФункции(ФорматФайлаОтчета)
	Возврат """%ПутьКИсполняемомуФайлу1С%"" %СтрокаСоединенияМенеджер%
	| /Execute ""%ПутьККаталогуGIT%\PluginsUI\"+?(ФорматФайлаОтчета="Allure","ЗагрузкаЛогаAllureXMLТеста.epf","ЗагрузкаЛогаJUnitXMLТеста.epf")+"""
	| /C""
	| TestLogUI %ПутьККаталогуОтчетовВыполненияТестов%\report-%НомерПроверки%_%Тест%.xml
	| TestNumberUI %НомерПроверки%
	| TestAssemblyUI %НомерСборки%
	| TestClientIdUI %ИдентификаторКлиента%
	| TestCloseUI
	| TestDeleteLogUI
	|"" ";
КонецФункции

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

Функция НайтиШаблонКоманды(Знач ИдентификаторКонструктора,Знач ТекстШаблона="",Знач КлючПоиска="")

	ШаблонСсылка = Справочники.ШаблоныКоманд.ПустаяСсылка();

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Т.Ссылка КАК Ссылка,
	|	0 КАК Порядок
	|ИЗ
	|	РегистрСведений.ПеременныеЗаданий КАК ПеременныеЗаданий
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ШаблоныКоманд КАК Т
	|		ПО ПеременныеЗаданий.Задание = Т.Ссылка
	|			И (ПеременныеЗаданий.НомерАргумента = 0)
	|			И (ПеременныеЗаданий.Ключ = НЕОПРЕДЕЛЕНО)
	|			И (ПеременныеЗаданий.ИмяПеременной = &ИмяПеременной)
	|			И (ПеременныеЗаданий.ЗначениеПеременной = &КлючПоиска)
	|ГДЕ
	|	Т.ИдентификаторКонструктора = &ИдентификаторКонструктора
	|	И Т.ПометкаУдаления = ЛОЖЬ
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Т.Ссылка,
	|	1
	|ИЗ
	|	Справочник.ШаблоныКоманд КАК Т
	|ГДЕ
	|	Т.ПометкаУдаления = ЛОЖЬ
	|	И (ВЫРАЗИТЬ(Т.ТекстШаблона КАК СТРОКА(1000))) = (ВЫРАЗИТЬ(&ТекстШаблона КАК СТРОКА(1000)))
	|
	|УПОРЯДОЧИТЬ ПО
	|	Порядок";
	Запрос.УстановитьПараметр("ИдентификаторКонструктора",ИдентификаторКонструктора);
	Запрос.УстановитьПараметр("ИмяПеременной",Справочники.ИменаПеременных.КлючПоиска);
	Запрос.УстановитьПараметр("КлючПоиска",КлючПоиска);
	Запрос.УстановитьПараметр("ТекстШаблона",ТекстШаблона);

	РезультатЗапроса = Запрос.Выполнить();

	Если НЕ РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Если Выборка.Следующий() Тогда
			ШаблонСсылка = Выборка.Ссылка;
		КонецЕсли;
	КонецЕсли;

	Возврат ШаблонСсылка;
КонецФункции

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

Функция СоздатьШаблонКоманды(Знач ИдентификаторКонструктора, Знач Наименование, Знач КлючПоиска, Знач ТекстШаблона)

	ШаблонСсылка = Справочники.ШаблоныКоманд.ПустаяСсылка();

	ШаблонОбъект = Справочники.ШаблоныКоманд.СоздатьЭлемент();
	ШаблонОбъект.Наименование 				= Наименование;
	ШаблонОбъект.ИдентификаторКонструктора 	= ИдентификаторКонструктора;
	ШаблонОбъект.ТекстШаблона 				= ТекстШаблона;
	ШаблонОбъект.РедактироватьКонструктором = Истина;

	Попытка
		ШаблонОбъект.Записать();
		ШаблонСсылка = ШаблонОбъект.Ссылка;
	Исключение
		ТекстОшибки = ОписаниеОшибки();
		Сообщить(ОписаниеОшибки());
		ЗаписьЖурналаРегистрации("СозатьШаблонКоманды",УровеньЖурналаРегистрации.Ошибка,Неопределено,Неопределено,ТекстОшибки);
	КонецПопытки;

	Возврат ШаблонСсылка;
КонецФункции

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

#Область Навигация

&НаКлиенте

Процедура Вперед(Команда)
	Если Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИнициализация Тогда

		// условие переключения на следующий шаг
		Если НЕ ПроверитьНаличиеПодобноегоЗадания(Наименование,TaskID,Задание) Тогда
			Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаСоставЗадания;
		КонецЕсли;

	ИначеЕсли Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаСоставЗадания Тогда

		ОбобщениеHTML = СформироватьОписаниеСоздаваемогоЗдания();
		Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИтого;

	ИначеЕсли Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИтого Тогда

	КонецЕсли;

	ОтработатьПеремещениеПоСтраницам();
КонецПроцедуры

&НаКлиенте

Процедура Назад(Команда)

	// назад без проверок
	Если Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИнициализация Тогда
	ИначеЕсли Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаСоставЗадания Тогда
		Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИнициализация;
	ИначеЕсли Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИтого Тогда
		Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаСоставЗадания;
	КонецЕсли;

	ОтработатьПеремещениеПоСтраницам();
КонецПроцедуры

&НаКлиенте

Процедура ОтработатьПеремещениеПоСтраницам()

	Если Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИнициализация Тогда
		Элементы.Назад.Видимость = Ложь;
		Элементы.Вперед.Видимость = Истина;
		Элементы.СоздатьНовоеЗадание.Видимость = Ложь;
	ИначеЕсли Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаСоставЗадания Тогда
		Элементы.Назад.Видимость = Истина;
		Элементы.Вперед.Видимость = Истина;
		Элементы.СоздатьНовоеЗадание.Видимость = Ложь;
	ИначеЕсли Элементы.СтраницыОбработки.ТекущаяСтраница=Элементы.СтраницаИтого Тогда
		Элементы.Назад.Видимость = Истина;
		Элементы.Вперед.Видимость = Ложь;
		Элементы.СоздатьНовоеЗадание.Видимость = Истина;
	КонецЕсли;

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

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

#Область СозданиеЗадания

&НаКлиенте

Процедура СоздатьНовоеЗадание(Команда)
	Если СоздатьНовоеЗаданиеНаСервере()=Истина Тогда
		ЭтаФорма.Закрыть();
	КонецЕсли;
КонецПроцедуры

&НаСервере

[Assistant] Функция ПолучитьТекстШаблонаКомандыЗагрузкиОтчетаВыполнени(ФорматФайлаОтчета)


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

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

Процедура ОбработатьФайлПлагинов(Знач ПутьКФайлу)
ЧтениеXML = Новый ЧтениеXML;
	НоваяЗаписьXML = Новый ЗаписьXML;
	НоваяЗаписьXML = Новый ЗаписьXML;
	НовыйЗаписьDOM = Новый ЗаписьDOM;
	НовыйПостроительDOM = Новый ПостроительDOM;

	Попытка

		НоваяЧтениеXML = Новый ЧтениеXML ;
		НоваяЧтениеXML.ОткрытьФайл(сокрЛП(ПутьКФайлу));
		НовыйДокументDOM = НовыйПостроительDOM.Прочитать(НоваяЧтениеXML);
		НоваяЧтениеXML.Закрыть();

		НовыйСписокЭлементовDOM = НовыйДокументDOM.ПолучитьЭлементыПоИмени("plugins");
		Если НовыйСписокЭлементовDOM.Количество()=1 Тогда
			Для каждого Элемент из НовыйСписокЭлементовDOM[0].ДочерниеУзлы Цикл
				Если Элемент.ИмяУзла = "item" Тогда
					стр_н = ТаблицаДанныхПоВнешнимПлагинам.Добавить();
					стр_н.ТипХранения = "";
					Для каждого Атрибут из Элемент.Атрибуты Цикл
						Если Атрибут.ИмяУзла="url" Тогда
							стр_н.АдресИнтернет = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="vers" Тогда
							стр_н.ВерсияВнешняя = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="name" Тогда
							стр_н.Имя = Атрибут.ТекстовоеСодержимое;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ОбработатьФайлПлагинов(Знач ПутьКФайлу)

	ЧтениеXML = Новый ЧтениеXML;
	НоваяЗаписьXML = Новый ЗаписьXML;
	НоваяЗаписьXML = Новый ЗаписьXML;
	НовыйЗаписьDOM = Новый ЗаписьDOM;
	НовыйПостроительDOM = Новый ПостроительDOM;

	Попытка

		НоваяЧтениеXML = Новый ЧтениеXML ;
		НоваяЧтениеXML.ОткрытьФайл(сокрЛП(ПутьКФайлу));
		НовыйДокументDOM = НовыйПостроительDOM.Прочитать(НоваяЧтениеXML);
		НоваяЧтениеXML.Закрыть();

		НовыйСписокЭлементовDOM = НовыйДокументDOM.ПолучитьЭлементыПоИмени("plugins");
		Если НовыйСписокЭлементовDOM.Количество()=1 Тогда
			Для каждого Элемент из НовыйСписокЭлементовDOM[0].ДочерниеУзлы Цикл
				Если Элемент.ИмяУзла = "item" Тогда
					стр_н = ТаблицаДанныхПоВнешнимПлагинам.Добавить();
					стр_н.ТипХранения = "";
					Для каждого Атрибут из Элемент.Атрибуты Цикл
						Если Атрибут.ИмяУзла="url" Тогда
							стр_н.АдресИнтернет = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="vers" Тогда
							стр_н.ВерсияВнешняя = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="name" Тогда
							стр_н.Имя = Атрибут.ТекстовоеСодержимое;
							стр_н.Представление = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="author" Тогда
							стр_н.Автор = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="infourl" Тогда
							стр_н.АдресИнтернетОписание = Атрибут.ТекстовоеСодержимое;
						ИначеЕсли Атрибут.ИмяУзла="date" Тогда
							стр_н.ДатаВнешняя = Атрибут.ТекстовоеСодержимое;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;

			КонецЦикла;
		КонецЕсли;

	Исключение
		Сообщить("Ошибка обработки файла с инфорацией о плагинах! "+ОписаниеОшибки());
	КонецПопытки;

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

&НаКлиенте

Функция ЗагрузитьФайлПоИнтернетАдресу(Знач ПолныйАдресРесурса)

	ПутьКФайлу = "";

	СтруктураURI = СтруктураURI(ПолныйАдресРесурса);

	Если Найти(ПолныйАдресРесурса,"https://") Тогда
		ЗащищенноеСоединение = новый ЗащищенноеСоединениеOpenSSL();
		HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост, СтруктураURI.Порт,,,,,ЗащищенноеСоединение);
	Иначе

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

	Попытка
		Результат =  HTTPСоединение.Получить(HTTPЗапрос,ПутьКФайлу);
	Исключение
		// исключение здесь говорит о том, что запрос не дошел до HTTP-Сервера
		Сообщить("Произошла сетевая ошибка!"+Символы.ПС+ОписаниеОшибки());
		Возврат ПутьКФайлу;
	КонецПопытки;

	// Анализируем фатальные ошибки
	// В большинстве случаев нужно остановить работу и показать пользователю сообщение об ошибке,
	// включив в него HTTP-статус

	// Ошибки 4XX говорят о неправильном запросе - в широком смысле
	// Может быть неправильный адрес, ошибка аутентификации, плохой формат запроса
	// Подробнее смотри http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4
	Если Результат.КодСостояния >= 400 и Результат.КодСостояния < 500  Тогда
		Сообщить("Код статуса больше 4XX, ошибка запроса.  Код статуса: " + Результат.КодСостояния);
	КонецЕсли;

	// Ошибки 5XX говорят о проблемах на сервере (возможно, прокси-сервер)
	// Это может быть программная ошибка, нехватка памяти, ошибка конфигурации и т.д.
	// Подробнее смотри http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5
	Если Результат.КодСостояния >= 500 и Результат.КодСостояния < 600  Тогда
		Сообщить("Код статуса больше 5XX, ошибка сервера. Код статуса: " + Результат.КодСостояния);
	КонецЕсли;

	// Обрабатываем перенаправление
	Если Результат.КодСостояния >= 300 и Результат.КодСостояния < 400  Тогда
		//Сообщить("Код статуса больше 3XX, Перенаправление. Код статуса: " + Результат.КодСостояния);
		Если Результат.КодСостояния = 302 Тогда
			//Сообщить("Код статуса 302, Постоянное перенаправление.");
			АдресРесурса = Результат.Заголовки.Получить("Location");
			Если АдресРесурса <> Неопределено Тогда
				//Сообщить("Выполняю запрос по новому адресу " + АдресРесурса);
				ПутьКФайлу = ЗагрузитьФайлПоИнтернетАдресу(АдресРесурса);
			Иначе
				Сообщить("Сервер не сообщил адрес ресурса!");
			КонецЕсли;
		ИначеЕсли Результат.КодСостояния = 301 Тогда
			//Сообщить("Код статуса 301, Временное перенаправление.");
			АдресРесурса = Результат.Заголовки.Получить("Location");
			Если АдресРесурса <> Неопределено Тогда
				//Сообщить("Выполняю запрос по новому адресу " + АдресРесурса);
				ПутьКФайлу = ЗагрузитьФайлПоИнтернетАдресу(АдресРесурса);
			Иначе
				Сообщить("Сервер не сообщил адрес ресурса!");
			КонецЕсли;

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

	// Статусы 1XX и 2XX считаем хорошими
	Если Результат.КодСостояния < 300 Тогда
	КонецЕсли;

	Возврат ПутьКФайлу;

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

&НаКлиенте

Функция СтруктураURI(Знач СтрокаURI) Экспорт

	СтрокаURI = СокрЛП(СтрокаURI);

	// схема
	Схема = "";
	Позиция = Найти(СтрокаURI, "://");
	Если Позиция > 0 Тогда
		Схема = НРег(Лев(СтрокаURI, Позиция - 1));
		СтрокаURI = Сред(СтрокаURI, Позиция + 3);
	КонецЕсли;

	// строка соединения и путь на сервере
	СтрокаСоединения = СтрокаURI;
	ПутьНаСервере = "";
	Позиция = Найти(СтрокаСоединения, "/");
	Если Позиция > 0 Тогда
		ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
		СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
	КонецЕсли;

	// информация пользователя и имя сервера
	СтрокаАвторизации = "";
	ИмяСервера = СтрокаСоединения;
	Позиция = Найти(СтрокаСоединения, "@");
	Если Позиция > 0 Тогда
		СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
		ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
	КонецЕсли;

	// логин и пароль
	Логин = СтрокаАвторизации;
	Пароль = "";
	Позиция = Найти(СтрокаАвторизации, ":");
	Если Позиция > 0 Тогда
		Логин = Лев(СтрокаАвторизации, Позиция - 1);
		Пароль = Сред(СтрокаАвторизации, Позиция + 1);
	КонецЕсли;

	// хост и порт
	Хост = ИмяСервера;
	Порт = "";
	Позиция = Найти(ИмяСервера, ":");
	Если Позиция > 0 Тогда
		Хост = Лев(ИмяСервера, Позиция - 1);
		Порт = Сред(ИмяСервера, Позиция + 1);
	КонецЕсли;

	Результат = Новый Структура;
	Результат.Вставить("Схема", Схема);
	Результат.Вставить("Логин", Логин);
	Результат.Вставить("Пароль", Пароль);
	Результат.Вставить("ИмяСервера", ИмяСервера);
	Результат.Вставить("Хост", Хост);
	Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
	Результат.Вставить("ПутьНаСервере", ПутьНаСервере);

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

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

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

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

	МассивСтруктураИсточников = новый Массив;

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ИсточникиПлагинов.ИмяИсточника,
	|	ИсточникиПлагинов.Порядок КАК Порядок,
	|	ИсточникиПлагинов.ТипИсточника,
	|	ИсточникиПлагинов.ПутьКаталог,
	|	ИсточникиПлагинов.АдресИнтернет,
	|	ИсточникиПлагинов.ИмяФайла,
	|	ИсточникиПлагинов.Отключить
	|ИЗ
	|	РегистрСведений.ИсточникиПлагинов КАК ИсточникиПлагинов
	|ГДЕ
	|	НЕ ИсточникиПлагинов.Отключить = ИСТИНА
	|
	|УПОРЯДОЧИТЬ ПО
	|	Порядок";
	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл

		Структура = новый Структура("ИмяИсточника,ПутьКаталог,АдресИнтернет,ИмяФайла,ТипИсточника");
		ЗаполнитьЗначенияСвойств(Структура,Выборка);
		МассивСтруктураИсточников.Добавить(Структура);

	КонецЦикла;

	Возврат МассивСтруктураИсточников;

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

&НаКлиенте


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

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

Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

Процедура ПередЗаписью(Отказ)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	ЭтоНовыйОбъект = ЭтоНовый();

	ДополнительныеСвойства.Вставить("ЭтоНовыйОбъект", ЭтоНовыйОбъект);

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

Процедура ПриЗаписи(Отказ)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	// Вставить содержимое обработчика.
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)

	ID = "";

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

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

#КонецЕсли


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

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

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

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

	ХранилищеОбработки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ХранилищеОбработки");

	Возврат ПоместитьВоВременноеХранилище(ХранилищеОбработки.Получить(), ИдентификаторФормы);
КонецФункции

&НаКлиенте

Процедура ВыгрузитьФайлВыборФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы <> Неопределено Тогда
		ПолноеИмяФайла = ВыбранныеФайлы[0];
		ПолучаемыеФайлы = Новый Массив;
		ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, ДополнительныеПараметры.Адрес));

		Обработчик = Новый ОписаниеОповещения("ВыгрузитьФайлПолучениеФайла", ЭтотОбъект);
		НачатьПолучениеФайлов(Обработчик, ПолучаемыеФайлы, ПолноеИмяФайла, Ложь);
	КонецЕсли;

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

// Обработчик результата работы процедуры ВыгрузитьВФайл.
&НаКлиенте

Процедура ВыгрузитьФайлПолучениеФайла(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
	// Обработка результата не требуется.
КонецПроцедуры

&НаСервере

Процедура ЗаполнитьВиртуальныеРазделы()

	ВиртуальныеРазделы.Очистить();

	Запрос = новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ИдентификаторыОбъектовМетаданных.Ссылка как Раздел,
	|	ВЫБОР
	|		КОГДА НЕ ДополнительныеОтчетыИОбработкиРазделы.Ссылка ЕСТЬ NULL
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК Выбран
	|ИЗ
	|	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДополнительныеОтчетыИОбработки.Разделы КАК ДополнительныеОтчетыИОбработкиРазделы
	|		ПО ДополнительныеОтчетыИОбработкиРазделы.Раздел = ИдентификаторыОбъектовМетаданных.Ссылка
	|			И (ДополнительныеОтчетыИОбработкиРазделы.Ссылка = &Ссылка)
	|ГДЕ
	|	ИдентификаторыОбъектовМетаданных.Ссылка В ИЕРАРХИИ(&Подсистемы)";
	Запрос.УстановитьПараметр("Ссылка",Объект.Ссылка);
	Запрос.УстановитьПараметр("Подсистемы",Справочники.ИдентификаторыОбъектовМетаданных.ИдентификаторОбъектаМетаданныхПоПолномуИмени("Подсистемы"));

	ВиртуальныеРазделы.Загрузить(Запрос.Выполнить().Выгрузить());

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

&НаКлиенте

Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)

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

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

&НаСервере

Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ЗаполнитьВиртуальныеРазделы();
КонецПроцедуры


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

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

Функция ИмяФункции(ПолноеИмяОбъектаМетаданных) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	ДоступныИдентификаторыОбъектовРасширений = Ложь;

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ПолноеИмя", ПолноеИмяОбъектаМетаданных);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Идентификаторы.Ссылка КАК Ссылка,
	|	Идентификаторы.КлючОбъектаМетаданных,
	|	Идентификаторы.ПолноеИмя
	|ИЗ
	|	Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
	|ГДЕ
	|	Идентификаторы.ПолноеИмя = &ПолноеИмя
	|	И НЕ Идентификаторы.ПометкаУдаления";

	Выгрузка = Запрос.Выполнить().Выгрузить();
	ЗаголовокОшибки = НСтр("ru = 'Ошибка при выполнении функции ОбщегоНазначения.ИдентификаторОбъектаМетаданных().'");

	Если Выгрузка.Количество() = 0 Тогда
		// Если идентификатор не найден по полному имени, возможно что полное имя задано с ошибкой.
		ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных);
		Если ОбъектМетаданных = Неопределено Тогда
			ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Объект метаданных не найден по полному имени:
				           |""%1"".'"),
				ПолноеИмяОбъектаМетаданных);
			ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки;
		КонецЕсли;

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

			ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Объект метаданных не поддерживается:
				           |""%1"".
				           |
				           |Допустимы только типы объектов метаданных перечисленные в комментарии к функции.'"),
				ПолноеИмяОбъектаМетаданных);
			ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ОписаниеОшибки;
		КонецЕсли;

		ШаблонОшибки = ?(ДоступныИдентификаторыОбъектовРасширений,
			НСтр("ru = 'Для объекта метаданных ""%1""
			           |не найден идентификатор в справочнике ""Идентификаторы объектов метаданных"" и
			           |регистре сведений ""Идентификаторы объектов версий расширений"".'"),
			НСтр("ru = 'Для объекта метаданных ""%1""
			           |не найден идентификатор в справочнике ""Идентификаторы объектов метаданных"".'"));
		ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ПолноеИмяОбъектаМетаданных)
			;

	ИначеЕсли Выгрузка.Количество() > 1 Тогда
		ШаблонОшибки = ?(ДоступныИдентификаторыОбъектовРасширений,
			НСтр("ru = 'Для объекта метаданных ""%1""
			           |найдено несколько идентификаторов в справочнике ""Идентификаторы объектов метаданных"" и
			           |регистре сведений ""Идентификаторы объектов версий расширений"".'"),
			НСтр("ru = 'Для объекта метаданных ""%1""
			           |найдено несколько идентификаторов в справочнике ""Идентификаторы объектов метаданных"".'"));
		ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки, ПолноеИмяОбъектаМетаданных)	;
	КонецЕсли;

	// Проверка соответствия ключа объекта метаданных полному имени объекта метаданных.
	РезультатПроверки = КлючОбъектаМетаданныхСоответствуетПолномуИмени(Выгрузка[0]);
	Если РезультатПроверки.НеСоответствует Тогда
		НазваниеСправочника = НазваниеСправочника(Ложь);

		Если РезультатПроверки.ОбъектМетаданных = Неопределено Тогда
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Для объекта метаданных ""%1""
				           |найден идентификатор в справочнике ""%2"",
				           |которому соответствует удаленный объект метаданных.'"),
				ПолноеИмяОбъектаМетаданных, НазваниеСправочника);
		Иначе
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Для объекта метаданных ""%1""
				           |найден идентификатор в справочнике ""%2"",
				           |который соответствует другому объекту метаданных ""%3"".'"),
				ПолноеИмяОбъектаМетаданных, НазваниеСправочника, РезультатПроверки.ОбъектМетаданных);
		КонецЕсли;

		ВызватьИсключение ЗаголовокОшибки + Символы.ПС + Символы.ПС + ТекстОшибки;
	КонецЕсли;

	Возврат Выгрузка[0].Ссылка;

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

Функция ЭтоПодсистема(ОбъектМетаданных, КоллекцияПодсистем = Неопределено)

	Если КоллекцияПодсистем = Неопределено Тогда
		КоллекцияПодсистем = Метаданные.Подсистемы;
	КонецЕсли;

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

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

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

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

Функция НазваниеСправочника(ОбъектыРасширений)

	Если ОбъектыРасширений Тогда
		НазваниеСправочника = НСтр("ru = 'Идентификаторы объектов расширений'");
	Иначе
		НазваниеСправочника = НСтр("ru = 'Идентификаторы объектов метаданных'");
	КонецЕсли;

	Возврат НазваниеСправочника;

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

Функция КлючОбъектаМетаданныхСоответствуетПолномуИмени(СвойстваИдентификатора)

	РезультатПроверки = Новый Структура;
	РезультатПроверки.Вставить("НеСоответствует", Истина);
	РезультатПроверки.Вставить("КлючОбъектаМетаданных", Неопределено);

	КлючОбъектаМетаданных = СвойстваИдентификатора.КлючОбъектаМетаданных.Получить();
	ОбъектыРасширений = ЭтоОбъектРасширений(СвойстваИдентификатора.Ссылка);

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

			Строка = СтандартныеПодсистемыПовтИсп.СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений).Найти(
				СвойстваИдентификатора.Ссылка.УникальныйИдентификатор(), "Идентификатор");

			Если Строка <> Неопределено Тогда
				ОбъектМетаданных = Метаданные[Строка.Имя];
				РезультатПроверки.НеСоответствует = Строка.Имя <> СвойстваИдентификатора.ПолноеИмя;
			КонецЕсли;
		Иначе
			РезультатПроверки.НеСоответствует = Ложь;
		КонецЕсли;
	КонецЕсли;

	РезультатПроверки.Вставить("ОбъектМетаданных", ОбъектМетаданных);

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

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

Функция ЭтоОбъектРасширений(ОбъектИлиСсылка)

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

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

Функция ОбъектМетаданныхПоКлючу(КлючОбъектаМетаданных)

	ОбъектМетаданных = Неопределено;

	Если ТипЗнч(КлючОбъектаМетаданных) = Тип("Тип") Тогда
		ОбъектМетаданных = Метаданные.НайтиПоТипу(КлючОбъектаМетаданных);
	КонецЕсли;

	Возврат ОбъектМетаданных;

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

[Assistant] Функция ИдентификаторОбъектаМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных)


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

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

Функция ИмяФункции(ОбъектыРасширений = Ложь) Экспорт

	СвойстваКоллекцийОбъектовМетаданных = Новый ТаблицаЗначений;
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("Имя",                       Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("ИмяВЕдЧисле",               Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("Синоним",                   Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(255)));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("СинонимВЕдЧисле",           Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(255)));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("ПорядокКоллекции",          Новый ОписаниеТипов("Число"));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("БезДанных",                 Новый ОписаниеТипов("Булево"));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("БезКлючаОбъектаМетаданных", Новый ОписаниеТипов("Булево"));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("Идентификатор",             Новый ОписаниеТипов("УникальныйИдентификатор"));
	СвойстваКоллекцийОбъектовМетаданных.Колонки.Добавить("ОбъектыРасширений",         Новый ОписаниеТипов("Булево"));

	// Константы
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("627a6fb8-872a-11e3-bb87-005056c00008");
	Строка.Имя             = "Константы";
	Строка.Синоним         = НСтр("ru = 'Константы'");
	Строка.ИмяВЕдЧисле     = "Константа";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Константа'");

	// Подсистемы
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("cdf5ac50-08e8-46af-9a80-4e63fd4a88ff");
	Строка.Имя             = "Подсистемы";
	Строка.Синоним         = НСтр("ru = 'Подсистемы'");
	Строка.ИмяВЕдЧисле     = "Подсистема";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Подсистема'");
	Строка.БезДанных       = Истина;
	Строка.БезКлючаОбъектаМетаданных = Истина;
	Строка.ОбъектыРасширений = Истина;

	// Роли
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("115c4f55-9c20-4e86-a6d0-d0167ec053a1");
	Строка.Имя             = "Роли";
	Строка.Синоним         = НСтр("ru = 'Роли'");
	Строка.ИмяВЕдЧисле     = "Роль";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Роль'");
	Строка.БезДанных       = Истина;
	Строка.БезКлючаОбъектаМетаданных = Истина;

	// ПланыОбмена
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("269651e0-4b06-4f9d-aaab-a8d2b6bc6077");
	Строка.Имя             = "ПланыОбмена";
	Строка.Синоним         = НСтр("ru = 'Планы обмена'");
	Строка.ИмяВЕдЧисле     = "ПланОбмена";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'План обмена'");

	// Справочники
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("ede89702-30f5-4a2a-8e81-c3a823b7e161");
	Строка.Имя             = "Справочники";
	Строка.Синоним         = НСтр("ru = 'Справочники'");
	Строка.ИмяВЕдЧисле     = "Справочник";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Справочник'");

	// Документы
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("96c6ab56-0375-40d5-99a2-b83efa3dac8b");
	Строка.Имя             = "Документы";
	Строка.Синоним         = НСтр("ru = 'Документы'");
	Строка.ИмяВЕдЧисле     = "Документ";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Документ'");

	// ЖурналыДокументов
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("07938234-e29b-4cff-961a-9af07a4c6185");
	Строка.Имя             = "ЖурналыДокументов";
	Строка.Синоним         = НСтр("ru = 'Журналы документов'");
	Строка.ИмяВЕдЧисле     = "ЖурналДокументов";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Журнал документов'");
	Строка.БезДанных       = Истина;

	// Отчеты
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("706cf832-0ae5-45b5-8a4a-1f251d054f3b");
	Строка.Имя             = "Отчеты";
	Строка.Синоним         = НСтр("ru = 'Отчеты'");
	Строка.ИмяВЕдЧисле     = "Отчет";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Отчет'");
	Строка.БезДанных       = Истина;
	Строка.ОбъектыРасширений = Истина;

	// Обработки
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("ae480426-487e-40b2-98ba-d207777449f3");
	Строка.Имя             = "Обработки";
	Строка.Синоним         = НСтр("ru = 'Обработки'");
	Строка.ИмяВЕдЧисле     = "Обработка";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Обработка'");
	Строка.БезДанных       = Истина;
	Строка.ОбъектыРасширений = Истина;

	// ПланыВидовХарактеристик
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("8b5649b9-cdd1-4698-9aac-12ba146835c4");
	Строка.Имя             = "ПланыВидовХарактеристик";
	Строка.Синоним         = НСтр("ru = 'Планы видов характеристик'");
	Строка.ИмяВЕдЧисле     = "ПланВидовХарактеристик";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'План видов характеристик'");

	// ПланыСчетов
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("4295af27-543f-4373-bcfc-c0ace9b7620c");
	Строка.Имя             = "ПланыСчетов";
	Строка.Синоним         = НСтр("ru = 'Планы счетов'");
	Строка.ИмяВЕдЧисле     = "ПланСчетов";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'План счетов'");

	// ПланыВидовРасчета
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("fca3e7e1-1bf1-49c8-9921-aafb4e787c75");
	Строка.Имя             = "ПланыВидовРасчета";
	Строка.Синоним         = НСтр("ru = 'Планы видов расчета'");
	Строка.ИмяВЕдЧисле     = "ПланВидовРасчета";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'План видов расчета'");

	// РегистрыСведений
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("d7ecc1e9-c068-44dd-83c2-1323ec52dbbb");
	Строка.Имя             = "РегистрыСведений";
	Строка.Синоним         = НСтр("ru = 'Регистры сведений'");
	Строка.ИмяВЕдЧисле     = "РегистрСведений";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Регистр сведений'");

	// РегистрыНакопления
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("74083488-b01e-4441-84a6-c386ce88cdb5");
	Строка.Имя             = "РегистрыНакопления";
	Строка.Синоним         = НСтр("ru = 'Регистры накопления'");
	Строка.ИмяВЕдЧисле     = "РегистрНакопления";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Регистр накопления'");

	// РегистрыБухгалтерии
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("9a0d75ff-0eda-454e-b2b7-d2412ffdff18");
	Строка.Имя             = "РегистрыБухгалтерии";
	Строка.Синоним         = НСтр("ru = 'Регистры бухгалтерии'");
	Строка.ИмяВЕдЧисле     = "РегистрБухгалтерии";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Регистр бухгалтерии'");

	// РегистрыРасчета
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("f330686a-0acf-4e26-9cda-108f1404687d");
	Строка.Имя             = "РегистрыРасчета";
	Строка.Синоним         = НСтр("ru = 'Регистры расчета'");
	Строка.ИмяВЕдЧисле     = "РегистрРасчета";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Регистр расчета'");

	// БизнесПроцессы
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("a8cdd0e0-c27f-4bf0-9718-10ec054dc468");
	Строка.Имя             = "БизнесПроцессы";
	Строка.Синоним         = НСтр("ru = 'Бизнес-процессы'");
	Строка.ИмяВЕдЧисле     = "БизнесПроцесс";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Бизнес-процесс'");

	// Задачи
	Строка = СвойстваКоллекцийОбъектовМетаданных.Добавить();
	Строка.Идентификатор   = Новый УникальныйИдентификатор("8d9153ad-7cea-4e25-9542-a557ee59fd16");
	Строка.Имя             = "Задачи";
	Строка.Синоним         = НСтр("ru = 'Задачи'");
	Строка.ИмяВЕдЧисле     = "Задача";
	Строка.СинонимВЕдЧисле = НСтр("ru = 'Задача'");

	Для каждого Строка Из СвойстваКоллекцийОбъектовМетаданных Цикл
		Строка.ПорядокКоллекции = СвойстваКоллекцийОбъектовМетаданных.Индекс(Строка);
	КонецЦикла;

	Если ОбъектыРасширений Тогда
		СвойстваКоллекцийОбъектовМетаданных = СвойстваКоллекцийОбъектовМетаданных.Скопировать(
			Новый Структура("ОбъектыРасширений", Истина));
	КонецЕсли;

	СвойстваКоллекцийОбъектовМетаданных.Индексы.Добавить("Идентификатор");

	Возврат СвойстваКоллекцийОбъектовМетаданных;

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

// Предотвращает недопустимое изменение идентификаторов объектов метаданных.
// Выполняет обработку дублей подчиненного узла распределенной информационной базы.
//

[Assistant] Функция СвойстваКоллекцийОбъектовМетаданных(ОбъектыРасширений = Ложь)


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

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

Функция ИмяФункции(ПолноеИмя)

	ПозицияТочки = СтрНайти(ПолноеИмя, ".");

	КлассОМ = Лев( ПолноеИмя, ПозицияТочки-1);
	ИмяОМ   = Сред(ПолноеИмя, ПозицияТочки+1);

	Если ВРег(КлассОМ) = ВРег("ПланОбмена") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("Константа") Тогда
		Возврат ТипЗнч(ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмя));

	ИначеЕсли ВРег(КлассОМ) = ВРег("Справочник") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("Документ") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

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

	ИначеЕсли ВРег(КлассОМ) = ВРег("Отчет") Тогда
		Возврат Тип(КлассОМ + "Объект." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("Обработка") Тогда
		Возврат Тип(КлассОМ + "Объект." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("ПланВидовХарактеристик") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("ПланСчетов") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("ПланВидовРасчета") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("РегистрСведений") Тогда
		Возврат Тип(КлассОМ + "КлючЗаписи." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("РегистрНакопления") Тогда
		Возврат Тип(КлассОМ + "КлючЗаписи." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("РегистрБухгалтерии") Тогда
		Возврат Тип(КлассОМ + "КлючЗаписи." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("РегистрРасчета") Тогда
		Возврат Тип(КлассОМ + "КлючЗаписи." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("БизнесПроцесс") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);

	ИначеЕсли ВРег(КлассОМ) = ВРег("Задача") Тогда
		Возврат Тип(КлассОМ + "Ссылка." + ИмяОМ);
	Иначе
		// Без ключа объекта метаданных.
		Возврат Тип("Неопределено");
	КонецЕсли;

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

// Для процедуры ПриСозданииНаСервереФормыСписка.

Процедура УпорядочитьИОформитьСписок(Форма)

	// Порядок.
	Порядок = Форма.Список.КомпоновщикНастроек.Настройки.Порядок;
	Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок";

	Порядок.Элементы.Очистить();

	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("ПометкаУдаления");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ЭлементПорядка.Использование = Истина;

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

	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Родитель");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ЭлементПорядка.Использование = Истина;

	ЭлементПорядка = Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
	ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Синоним");
	ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
	ЭлементПорядка.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ЭлементПорядка.Использование = Истина;

	// Оформление.
	ЭлементУсловногоОформления = Форма.УсловноеОформление.Элементы.Добавить();

	//ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor");
	//ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение;
	//ЭлементЦветаОформления.Использование = Истина;

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

	ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Синоним");
	ЭлементОформляемогоПоля.Использование = Истина;

	ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ПолноеИмя");
	ЭлементОформляемогоПоля.Использование = Истина;

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

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

#КонецЕсли

[Assistant] Функция КлючОбъектаМетаданных(ПолноеИмя)