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

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

Процедура Инициализация()
ВремяНачала=ТекущаяДата();
	Лог.УстановитьУровень(УровниЛога.Отладка);

	Конфигуратор = Новый УправлениеКонфигуратором();
	Конфигуратор.УстановитьКонтекст("/FD:\Cloud\Dev\Tasks\Base","Иванов Антон Борисович", "");
	//Конфигуратор.ВыгрузитьКонфигурациюВФайлы("d:\Cloud\Dev\GitRep\Tasks\src\cf\")

	//Версия = "1.0.1.012";
	НоваяВерсия = АргументыКоманднойСтроки[0];

	СоздатьФайлыПоставкиДляРелиза();
    // TODO: допиши оставшуюся часть

[Assistant]
#Использовать v8runner
#Использовать logos

Перем Лог;
Перем Конфигуратор;
Перем НоваяВерсия;

Процедура Инициализация()
	ВремяНачала=ТекущаяДата();
	Лог.УстановитьУровень(УровниЛога.Отладка);

	Конфигуратор = Новый УправлениеКонфигуратором();
	Конфигуратор.УстановитьКонтекст("/FD:\Cloud\Dev\Tasks\Base","Иванов Антон Борисович", "");
	//Конфигуратор.ВыгрузитьКонфигурациюВФайлы("d:\Cloud\Dev\GitRep\Tasks\src\cf\")

	//Версия = "1.0.1.012";
	НоваяВерсия = АргументыКоманднойСтроки[0];

	СоздатьФайлыПоставкиДляРелиза();

	//СоздатьФайлыКомплектаДляРелиза();
	ВремяКонца=ТекущаяДата();

	Лог.Отладка("------------------------------------------------------------------");
	Лог.Отладка("ВремяНачала -"+ВремяНачала);
	Лог.Отладка("ВремяКонца  -"+ВремяКонца);
	Лог.Отладка("Общее время выполнения - "+ОКР(((ВремяКонца-ВремяНачала)/60),2) +" мин.");
	Лог.Отладка("------------------------------------------------------------------");

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

Процедура СоздатьФайлыКомплектаДляРелиза()
	КаталогСозданияФайловКомплектовПоставки = "d:\Cloud\Dev\Tasks\_Rel\distribute\"+НоваяВерсия+"\";

	ИмяФайлаОписанияКомплектаПоставки = "d:\Cloud\Dev\Tasks\_Rel\releases\ОписаниеПоставки.edf";
	Лог.Отладка("ИмяФайлаОписанияКомплектаПоставки "+ ИмяФайлаОписанияКомплектаПоставки);
	Конфигуратор.СоздатьФайлыКомплекта(КаталогСозданияФайловКомплектовПоставки,ИмяФайлаОписанияКомплектаПоставки);
КонецПроцедуры

Процедура СоздатьФайлыПоставкиДляРелиза()
	КаталогРелизов = "d:\Cloud\Dev\Tasks\_Rel\releases\";
	ПутьФайлаПолнойПоставки = КаталогРелизов + ""+НоваяВерсия+"\1Cv8.cf";
	ПутьФайлаПоставкиОбновления = КаталогРелизов + ""+НоваяВерсия+"\1Cv8.cfu";
	//Сообщить("ПутьФайлаПолнойПоставки "+ ПутьФайлаПолнойПоставки);
	//Сообщить("ПутьФайлаПоставкиОбновления "+ ПутьФайлаПоставкиОбновления);

	МассивДистрибутивовДляОбновления = Новый Массив();
	НайденныеФайлы = НайтиФайлы(КаталогРелизов,"*");
	Для каждого пФайл Из НайденныеФайлы Цикл
		Если пФайл.ЭтоКаталог()
			И пФайл.Имя <> НоваяВерсия Тогда
			ПутьДистрибутиваДляОбновления = пФайл.ПолноеИмя + "\1Cv8.cf";
			МассивДистрибутивовДляОбновления.Добавить(ПутьДистрибутиваДляОбновления);
			Лог.Отладка("ПутьДистрибутиваДляОбновления "+ ПутьДистрибутиваДляОбновления);
		КонецЕсли;
	КонецЦикла;

	Конфигуратор.СоздатьФайлыПоставки(ПутьФайлаПолнойПоставки,ПутьФайлаПоставкиОбновления,МассивДистрибутивовДляОбновления);
КонецПроцедуры

//////////////////////////////////////////////////////////////////////////////////////
// Инициализация
Лог = Логирование.ПолучитьЛог("СоздатьРелиз");
Инициализация();


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

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

Процедура ИмяФункции(Дерево,Тип,ПредставлениеТеста,ОписаниеШага,ИмяФайла,ТаблицаПеревода,СтрТаблицаИзвестныхStepDefinition)

	//Если ТаблицаПеревода <> Неопределено Тогда
	//	Тип = ПреобразоватьТипПеревод(Тип,ТаблицаПеревода);
	//КонецЕсли;

	НайденныеСтрокиДерева = Дерево.Строки.НайтиСтроки(Новый Структура("ПолныйТипШага",Тип),Истина);
	Если НайденныеСтрокиДерева.Количество() = 0 Тогда
		ВызватьИсключение("Не найден тип шага <" + Тип + ">");
	КонецЕсли;

	СтрокаДерева = НайденныеСтрокиДерева[0];
	СтрокаШага   = СтрокаДерева.Строки.Добавить();
	СтрокаШага.ПредставлениеТеста = ПредставлениеТеста;
	СтрокаШага.ОписаниеШага       = ОписаниеШага;
	Если СтрТаблицаИзвестныхStepDefinition <> Неопределено Тогда
		СтрокаШага.ОписаниеШагаОригинал = СтрТаблицаИзвестныхStepDefinition.ОписаниеШагаОригинал;
		СтрокаШага.ПредставлениеТестаОригинал = СтрТаблицаИзвестныхStepDefinition.ПредставлениеТестаОригинал;
	КонецЕсли;
	СтрокаШага.ИмяФайла           =  СтрЗаменить(ИмяФайла,"/","\");
	СтрокаШага.Язык               = "ru";

	Если ТаблицаПеревода <> Неопределено Тогда
		СтрокаПоиска = СтрТаблицаИзвестныхStepDefinition.СтрокаДляПоиска;

		СтрокаТаблицаПеревода = ТаблицаПеревода.Найти(СтрокаПоиска,"СтрокаДляПоискаРусский");
		Если СтрокаТаблицаПеревода <> Неопределено Тогда
			СтрокаШага.Язык               = ЯзыкГенератораGherkin;
			Если ЗначениеЗаполнено(СтрокаТаблицаПеревода.ТекстПереводаШаг) Тогда
				СтрокаШага.ПредставлениеТеста = УбратьСлужебныеСимволыИзПредставления(СтрокаТаблицаПеревода.ТекстПереводаШаг);
			КонецЕсли;
			Если ЗначениеЗаполнено(СтрокаТаблицаПеревода.ТекстПереводаОписание) Тогда
				СтрокаШага.ОписаниеШага       = СтрокаТаблицаПеревода.ТекстПереводаОписание;
			КонецЕсли;
		Иначе
			Сообщить("Не найден перевод для шага <" + ПредставлениеТеста + ">");
		КонецЕсли;
	КонецЕсли;

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

Функция УбратьСлужебныеСимволыИзПредставления(Знач Стр)
	Стр = СтрЗаменить(Стр,"%1 ","");
	Стр = СтрЗаменить(Стр,"%2 ","");
	Стр = СтрЗаменить(Стр,"%3 ","");
	Стр = СтрЗаменить(Стр,"%4 ","");
	Стр = СтрЗаменить(Стр,"%5 ","");
	Стр = СтрЗаменить(Стр,"%6 ","");
	Стр = СтрЗаменить(Стр,"%7 ","");

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

Процедура СделатьСортировкуДерева(Дерево)
	Дерево.Строки.Сортировать("ТипШага,ОписаниеШага",Истина);
КонецПроцедуры

Процедура ПоказыватьСлужебныеШагиПриИзменении(Элемент)
	ДвДанныеvbFeatureReader = ПолучитьДДFeatureReader();
	ЗаполнитьДеревоИзвестныхШаговНаСервере(ДвДанныеvbFeatureReader);
КонецПроцедуры

Процедура ФильтрДереваШаговПриИзменении(Элемент)
	ТекстШага = ПолучитьТекстШагаТекущейСтроки();

	ОбновитьДеревоШагов();

	Если Не ЗначениеЗаполнено(ФильтрДереваШагов) Тогда
		Если ЗначениеЗаполнено(ТекстШага) Тогда
			АктивизироватьСтрокуДереваСНужнымШагом(ТекстШага);
		КонецЕсли;

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

	ДеревоФормыСтроки = ДеревоШагов.Строки;
	РазвернутьСтрокиДерева(ДеревоФормыСтроки);
КонецПроцедуры

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

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

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

Процедура РазвернутьСтрокуДерева(Строка)
	//ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
	//ЭлементыФормы.ДеревоШагов.Развернуть(ИдентификаторСтроки);
	ЭлементыФормы.ДеревоШагов.Развернуть(Строка);
КонецПроцедуры

Процедура АктивизироватьСтрокуДереваСНужнымШагом(ТекСтрока)
	Нашли = Ложь;
	АктивизироватьСтрокуДереваСНужнымШагомРекурсивно(ТекСтрока,ДеревоШагов,Нашли);
КонецПроцедуры

Процедура АктивизироватьСтрокуДереваСНужнымШагомРекурсивно(ПредставлениеТеста,Дерево,Нашли)
	Если Нашли Тогда
		Возврат;
	КонецЕсли;

	ЭлементыДерева = Дерево.Строки;
	Для Каждого СтрокаДерева Из ЭлементыДерева Цикл
		Если СтрокаДерева.ПредставлениеТеста = ПредставлениеТеста Тогда
			ЭлементыФормы.ДеревоШагов.ТекущаяСтрока = СтрокаДерева;//.ПолучитьИдентификатор();
			Нашли = Истина;
			Возврат;
		КонецЕсли;

		АктивизироватьСтрокуДереваСНужнымШагомРекурсивно(ПредставлениеТеста,СтрокаДерева,Нашли);
	КонецЦикла;
КонецПроцедуры

[Assistant] Процедура ДобавитьШаги(Дерево,Тип,ПредставлениеТеста,ОписаниеШага,ИмяФайла,ТаблицаПеревода,СтрТаблицаИзвестныхStepDefinition)


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

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

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

	ПутьИзКонтейнера = КонтейнерДереваТестов.Путь;

	ВывестиСообщениеВЛогФайл("");
	ВывестиСообщениеВЛогФайл(".  ==>> набор тестов " + КонтейнерДереваТестов.Имя);

	Если ПутьИзКонтейнера <> "" Тогда
		КонтекстВыполненияДляКонтейнера = Загрузчик.ПолучитьКонтекстПоПути(ЭтотОбъект, ПутьИзКонтейнера);
	КонецЕсли;

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

	Для каждого ДочернийУзел Из СтрокиКонтейнера Цикл
		ДочернийРезультатТестирования = Неопределено;
		Если ДочернийУзел.Тип = ЭтотОбъект.ТипыУзловДереваТестов.Контейнер Тогда

			ДочернийРезультатТестирования = ВыполнитьТесты(Загрузчик, ДочернийУзел, ФильтрДляДочернихУзлов, Подписчик);

		ИначеЕсли ДочернийУзел.Тип = ЭтотОбъект.ТипыУзловДереваТестов.Элемент Тогда

			МожноВыполнять = УзелДереваТестовУдовлетворяетФильтру(ДочернийУзел, ФильтрДляДочернихУзлов);
			Если ДочернийУзел.ПропуститьТест Тогда
				МожноВыполнять = Ложь;
				ВывестиСообщениеВЛогФайл(".    -->> пропускаю тест " + ДочернийУзел.Представление);

				ДочернийРезультатТестирования = СоздатьЭлементРезультатовТестирования(ДочернийУзел);
				ДочернийРезультатТестирования.Состояние = СостоянияТестов.НеРеализован;

			КонецЕсли;
			Если МожноВыполнять Тогда

				ВывестиСообщениеВЛогФайл(".    -->> тест " + ДочернийУзел.Представление);

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

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

[Assistant]
Функция ВыполнитьТесты(Знач Загрузчик, Знач КонтейнерДереваТестов, Знач Фильтр = Неопределено, Знач Подписчик = Неопределено) Экспорт
	РезультатТестирования = СоздатьКонтейнерРезультатовТестирования(КонтейнерДереваТестов);
	ФильтрДляДочернихУзлов = Неопределено;
	Если Не УзелДереваТестовУдовлетворяетФильтру(КонтейнерДереваТестов, Фильтр) Тогда
		ФильтрДляДочернихУзлов = Фильтр;
	КонецЕсли;

	ПутьИзКонтейнера = КонтейнерДереваТестов.Путь;

	ВывестиСообщениеВЛогФайл("");
	ВывестиСообщениеВЛогФайл(".  ==>> набор тестов " + КонтейнерДереваТестов.Имя);

	Если ПутьИзКонтейнера <> "" Тогда
		КонтекстВыполненияДляКонтейнера = Загрузчик.ПолучитьКонтекстПоПути(ЭтотОбъект, ПутьИзКонтейнера);
	КонецЕсли;

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

	Для каждого ДочернийУзел Из СтрокиКонтейнера Цикл
		ДочернийРезультатТестирования = Неопределено;
		Если ДочернийУзел.Тип = ЭтотОбъект.ТипыУзловДереваТестов.Контейнер Тогда

			ДочернийРезультатТестирования = ВыполнитьТесты(Загрузчик, ДочернийУзел, ФильтрДляДочернихУзлов, Подписчик);

		ИначеЕсли ДочернийУзел.Тип = ЭтотОбъект.ТипыУзловДереваТестов.Элемент Тогда

			МожноВыполнять = УзелДереваТестовУдовлетворяетФильтру(ДочернийУзел, ФильтрДляДочернихУзлов);
			Если ДочернийУзел.ПропуститьТест Тогда
				МожноВыполнять = Ложь;
				ВывестиСообщениеВЛогФайл(".    -->> пропускаю тест " + ДочернийУзел.Представление);

				ДочернийРезультатТестирования = СоздатьЭлементРезультатовТестирования(ДочернийУзел);
				ДочернийРезультатТестирования.Состояние = СостоянияТестов.НеРеализован;

			КонецЕсли;
			Если МожноВыполнять Тогда

				ВывестиСообщениеВЛогФайл(".    -->> тест " + ДочернийУзел.Представление);

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

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

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

		Если Не КонтейнерДереваТестов.СлучайныйПорядокВыполнения И ПутьИзКонтейнера <> "" И РезультатТестирования.Состояние <> ЭтотОбъект.СостоянияТестов.Пройден Тогда
			ЭлементДеструктор = КонтейнерДереваТестов.ЭлементДеструктор;

			Если ЭлементДеструктор <> Неопределено И Строка(ДочернийРезультатТестирования.Ключ) <> Строка(ЭлементДеструктор.Ключ) Тогда

				НовыйДочернийРезультатТестирования = СоздатьЭлементРезультатовТестирования(ЭлементДеструктор);
				НовыйДочернийРезультатТестирования.Состояние = СостоянияТестов.Пройден;

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

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

				РезультатТестирования.Строки.Добавить(НовыйДочернийРезультатТестирования);
				РезультатТестирования.Состояние = ВыбратьХудшееСостояниеВыполненияТестов(РезультатТестирования.Состояние, ДочернийРезультатТестирования.Состояние);
				ЗаполнитьДанныеСтатистики(РезультатТестирования, ДочернийРезультатТестирования);
			КонецЕсли;

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

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

Функция УзелДереваТестовУдовлетворяетФильтру(Знач УзелДереваТестов, Знач Фильтр)
	Возврат (Фильтр = Неопределено) Или (Фильтр.Найти(УзелДереваТестов.Ключ) <> Неопределено);
КонецФункции

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

	ИначеЕсли ДочернийРезультатТестирования.Тип = ЭтотОбъект.ТипыУзловДереваТестов.Элемент Тогда
		РезультатТестирования.КоличествоТестов = РезультатТестирования.КоличествоТестов + 1;
		Если ДочернийРезультатТестирования.Состояние = СостоянияТестов.Сломан Тогда
			РезультатТестирования.КоличествоСломанныхТестов = РезультатТестирования.КоличествоСломанныхТестов + 1;
		ИначеЕсли ДочернийРезультатТестирования.Состояние = СостоянияТестов.НеРеализован Тогда
			РезультатТестирования.КоличествоНеРеализованныхТестов = РезультатТестирования.КоличествоНеРеализованныхТестов + 1;
		ИначеЕсли ДочернийРезультатТестирования.Состояние = СостоянияТестов.НеизвестнаяОшибка Тогда
			РезультатТестирования.КоличествоОшибочныхТестов = РезультатТестирования.КоличествоОшибочныхТестов + 1;
		КонецЕсли;
	КонецЕсли;
	РезультатТестирования.ВремяВыполнения = РезультатТестирования.ВремяВыполнения + ДочернийРезультатТестирования.ВремяВыполнения;
КонецПроцедуры

Функция ВыбратьХудшееСостояниеВыполненияТестов(Знач Состояние1, Знач Состояние2)
	Возврат Макс(Состояние1, Состояние2);
КонецФункции


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

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

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

	ВсеТесты = Новый Массив;
    // TODO: допиши оставшуюся часть

[Assistant]
//начало текста модуля

///////////////////////////////////////////////////
//Служебная часть
///////////////////////////////////////////////////

&НаКлиенте
// контекст фреймворка Vanessa-ADD
Перем Ванесса;

&НаКлиенте
// Структура, в которой хранится состояние сценария между выполнением шагов. Очищается перед выполнением каждого сценария.
Перем Контекст Экспорт;

&НаКлиенте
// Структура, в которой можно хранить служебные данные между запусками сценариев. Существует, пока открыта форма Vanessa-ADD.
Перем КонтекстСохраняемый Экспорт;

&НаКлиенте
// Функция экспортирует список шагов, которые реализованы в данной внешней обработке.
Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	//пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,Снипет,ИмяПроцедуры,ПредставлениеТеста,Транзакция,Параметр);

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

&НаСервере
// Служебная функция.
Функция ПолучитьМакетСервер(ИмяМакета)
	ОбъектСервер = РеквизитФормыВЗначение("Объект");
	Возврат ОбъектСервер.ПолучитьМакет(ИмяМакета);
КонецФункции

&НаКлиенте
// Служебная функция для подключения библиотеки создания fixtures.
Функция ПолучитьМакетОбработки(ИмяМакета) Экспорт
	Возврат ПолучитьМакетСервер(ИмяМакета);
КонецФункции

///////////////////////////////////////////////////
//Работа со сценариями
///////////////////////////////////////////////////

&НаКлиенте
// Процедура выполняется перед началом каждого сценария
Процедура ПередНачаломСценария() Экспорт
	Ванесса.Плагин("ЗапросыИзБД").УдалитьВсеЭлементыСправочника("Справочник2");
КонецПроцедуры

&НаКлиенте
// Процедура выполняется перед окончанием каждого сценария
Процедура ПередОкончаниемСценария() Экспорт

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

///////////////////////////////////////////////////
//Реализация шагов
///////////////////////////////////////////////////

//окончание текста модуля


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

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

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

	ВсеТесты = Новый Массив;

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

[Assistant]
///////////////////////////////////////////////////
//Служебные функции и процедуры
///////////////////////////////////////////////////

// контекст фреймворка Vanessa-ADD
Перем Ванесса;

// Функция экспортирует список шагов, которые реализованы в данной внешней обработке.
Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	// пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты, Снипет, ИмяПроцедуры, ПредставлениеТеста, ОписаниеШага, ТипШагаДляОписания, ТипШагаВДереве);

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЭтотШагПринимаетНаВходТаблицу(ТабПарам)","ЭтотШагПринимаетНаВходТаблицу","Когда этот шаг принимает на вход таблицу:","","");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ВСвоёмМетодеЯВызовуСлужебныйШагСВызовомТаблицы()","ВСвоёмМетодеЯВызовуСлужебныйШагСВызовомТаблицы","Когда в своём методе я вызову служебный шаг с вызовом таблицы","","");

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

// Служебная функция для подключения библиотеки создания fixtures.
Функция ПолучитьМакетОбработки(ИмяМакета) Экспорт
	Возврат ПолучитьМакет(ИмяМакета);
КонецФункции

///////////////////////////////////////////////////
//Работа со сценариями
///////////////////////////////////////////////////

// Процедура выполняется перед началом каждого сценария
Процедура ПередНачаломСценария() Экспорт

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

// Процедура выполняется перед окончанием каждого сценария
Процедура ПередОкончаниемСценария() Экспорт

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

///////////////////////////////////////////////////
//Реализация шагов
///////////////////////////////////////////////////

//Когда этот шаг принимает на вход таблицу:
//@ЭтотШагПринимаетНаВходТаблицу(ТабПарам)
Процедура ЭтотШагПринимаетНаВходТаблицу(ТабПарам) Экспорт
	Если ТабПарам[0].Количество() <> 2 Тогда
		ВызватьИсключение "Должно было быть 2 колонки у таблицы.";
	КонецЕсли;
КонецПроцедуры

//Когда в своём методе я вызову служебный шаг с вызовом таблицы
//@ВСвоёмМетодеЯВызовуСлужебныйШагСВызовомТаблицы()
Процедура ВСвоёмМетодеЯВызовуСлужебныйШагСВызовомТаблицы() Экспорт
	Стр = "
	|Когда этот шаг принимает на вход таблицу:
	|| Колонка1  | Колонка2  |
	|| Значение1 | Значение2 |
	|";
	Ванесса.Шаг(Стр);
КонецПроцедуры


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

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

//начало текста модуля

///////////////////////////////////////////////////
//Служебные функции и процедуры
///////////////////////////////////////////////////

&НаКлиенте
// контекст фреймворка Vanessa-ADD
Перем Ванесса;

&НаКлиенте
// Структура, в которой хранится состояние сценария между выполнением шагов. Очищается перед выполнением каждого сценария.
Перем Контекст Экспорт;

&НаКлиенте
// Структура, в которой можно хранить служебные данные между запусками сценариев. Существует, пока открыта форма Vanessa-ADD.
Перем КонтекстСохраняемый Экспорт;

&НаКлиенте
// Функция экспортирует список шагов, которые реализованы в данной внешней обработке.
Функция ИмяФункции(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	//пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,Снипет,ИмяПроцедуры,ПредставлениеТеста,Транзакция,Параметр);

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

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

&НаСервере
// Служебная функция.
Функция ПолучитьМакетСервер(ИмяМакета)
	ОбъектСервер = РеквизитФормыВЗначение("Объект");
	Возврат ОбъектСервер.ПолучитьМакет(ИмяМакета);
КонецФункции

&НаКлиенте
// Служебная функция для подключения библиотеки создания fixtures.
Функция ПолучитьМакетОбработки(ИмяМакета) Экспорт
	Возврат ПолучитьМакетСервер(ИмяМакета);
КонецФункции

///////////////////////////////////////////////////
//Работа со сценариями
///////////////////////////////////////////////////

&НаКлиенте
// Процедура выполняется перед началом каждого сценария
Процедура ПередНачаломСценария() Экспорт

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

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

///////////////////////////////////////////////////
//Реализация шагов
///////////////////////////////////////////////////

&НаКлиенте
//И в переменную Контекст я добавляю "СлужебноеЗначение"
//@ВПеременнуюКонтекстЯДобавляю(Парам01)
Процедура ВПеременнуюКонтекстЯДобавляю(Зн) Экспорт
	Контекст.Вставить(Зн,Зн);
КонецПроцедуры

//окончание текста модуля

[Assistant] Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD)


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

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

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

	ВсеТесты = Новый Массив;

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

[Assistant]
//начало текста модуля

///////////////////////////////////////////////////
//Служебные функции и процедуры
///////////////////////////////////////////////////

&НаКлиенте
// контекст фреймворка Vanessa-ADD
Перем Ванесса;

&НаКлиенте
// Структура, в которой хранится состояние сценария между выполнением шагов. Очищается перед выполнением каждого сценария.
Перем Контекст Экспорт;

&НаКлиенте
// Структура, в которой можно хранить служебные данные между запусками сценариев. Существует, пока открыта форма Vanessa-ADD.
Перем КонтекстСохраняемый Экспорт;

&НаКлиенте
// Функция экспортирует список шагов, которые реализованы в данной внешней обработке.
Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	// пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты, Снипет, ИмяПроцедуры, ПредставлениеТеста, ОписаниеШага, ТипШагаДляОписания, ТипШагаВДереве);

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯВыполняюШагКоторыйБудетПриниматьТриТаблицыВВидеПараметров(ТабПарам1,ТабПарам2,ТабПарам3)","ЯВыполняюШагКоторыйБудетПриниматьТриТаблицыВВидеПараметров","Когда я выполняю шаг, который будет принимать три таблицы в виде параметров:","","");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ВПеременнойКонтекстБудeтТриПереданныхТаблицы()","ВПеременнойКонтекстБудeтТриПереданныхТаблицы","Тогда в переменной контекст будeт три переданных таблицы","","");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ВТаблицеНомерБудетКолонки(Парам01,Парам02)","ВТаблицеНомерБудетКолонки","И     в таблице номер 1 будет 2 колонки","","");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ВТаблицеНомерБудетСтроки(Парам01,Парам02)","ВТаблицеНомерБудетСтроки","И     в таблице номер 1 будет 2 строки","","");

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

&НаСервере
// Служебная функция.
Функция ПолучитьМакетСервер(ИмяМакета)
	ОбъектСервер = РеквизитФормыВЗначение("Объект");
	Возврат ОбъектСервер.ПолучитьМакет(ИмяМакета);
КонецФункции

&НаКлиенте
// Служебная функция для подключения библиотеки создания fixtures.
Функция ПолучитьМакетОбработки(ИмяМакета) Экспорт
	Возврат ПолучитьМакетСервер(ИмяМакета);
КонецФункции

///////////////////////////////////////////////////
//Работа со сценариями
///////////////////////////////////////////////////

&НаКлиенте
// Процедура выполняется перед началом каждого сценария
Процедура ПередНачаломСценария() Экспорт

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

&НаКлиенте
// Процедура выполняется перед окончанием каждого сценария
Процедура ПередОкончаниемСценария() Экспорт

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

&НаКлиенте
Функция ПолучитьКоличествоКолонокТаблицы(Структура)
	Возврат Структура.Количество();
КонецФункции

///////////////////////////////////////////////////
//Реализация шагов
///////////////////////////////////////////////////

&НаКлиенте
//Когда я выполняю шаг, который будет принимать три таблицы в виде параметров:
//@ЯВыполняюШагКоторыйБудетПриниматьТриТаблицыВВидеПараметров(ТабПарам1,ТабПарам2,ТабПарам3)
Процедура ЯВыполняюШагКоторыйБудетПриниматьТриТаблицыВВидеПараметров(ТабПарам1,ТабПарам2,ТабПарам3) Экспорт
	Массив = Новый Массив;
	Массив.Добавить(ТабПарам1);
	Массив.Добавить(ТабПарам2);
	Массив.Добавить(ТабПарам3);

	Контекст.Вставить("МассивТаблиц",Массив);
КонецПроцедуры

&НаКлиенте
//Тогда в переменной контекст будeт три переданных таблицы
//@ВПеременнойКонтекстБудeтТриПереданныхТаблицы()
Процедура ВПеременнойКонтекстБудeтТриПереданныхТаблицы() Экспорт
	Если Контекст.МассивТаблиц.Количество() <> 3 Тогда
		ВызватьИсключение "Ожидали получить 3 таблицы в массиве. А получили " + Контекст.МассивТаблиц.Количество() + " таблиц.";
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
//И     в таблице номер 1 будет 2 колонки
//@ВТаблицеНомерБудетКолонки(Парам01,Парам02)
Процедура ВТаблицеНомерБудетКолонки(НомерТаблицы,КоличествоКолонок) Экспорт
	КоличествоКолонокТаблицы = ПолучитьКоличествоКолонокТаблицы(Контекст.МассивТаблиц[НомерТаблицы-1][0]);
	Если КоличествоКолонокТаблицы <> КоличествоКолонок Тогда
		ВызватьИсключение "Ожидали в таблице №" + НомерТаблицы + " получить " + КоличествоКолонок + " колонок. А получили " + КоличествоКолонокТаблицы;
	КонецЕсли;
КонецПроцедуры

//окончание текста модуля

&НаКлиенте
//И     в таблице номер 1 будет 2 строки
//@ВТаблицеНомерБудетСтроки(Парам01,Парам02)
Процедура ВТаблицеНомерБудетСтроки(НомерТаблицы,КоличествоСтрок) Экспорт
	Если Контекст.МассивТаблиц[НомерТаблицы-1].Количество() <> КоличествоСтрок Тогда
		ВызватьИсключение "Ожидали в таблице №" + НомерТаблицы + " получить " + КоличествоСтрок + " строк. А получили " + Контекст.МассивТаблиц[НомерТаблицы-1].Количество();
	КонецЕсли;
КонецПроцедуры


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

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

//начало текста модуля

///////////////////////////////////////////////////
//Служебные функции и процедуры
///////////////////////////////////////////////////

&НаКлиенте
// контекст фреймворка Vanessa-ADD
Перем Ванесса;

&НаКлиенте
// Структура, в которой хранится состояние сценария между выполнением шагов. Очищается перед выполнением каждого сценария.
Перем Контекст Экспорт;

&НаКлиенте
// Структура, в которой можно хранить служебные данные между запусками сценариев. Существует, пока открыта форма Vanessa-ADD.
Перем КонтекстСохраняемый Экспорт;

&НаКлиенте
// Функция экспортирует список шагов, которые реализованы в данной внешней обработке.
Функция ИмяФункции(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	// пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты, Снипет, ИмяПроцедуры, ПредставлениеТеста, ОписаниеШага, ТипШагаДляОписания, ТипШагаВДереве);

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯВызываюСлужебныйШагДляПроверкиЗагрузкиСнипетовМетодаШаг()","ЯВызываюСлужебныйШагДляПроверкиЗагрузкиСнипетовМетодаШаг","Когда я вызываю служебный шаг для проверки загрузки снипетов метода шаг","","");

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

&НаСервере
// Служебная функция.
Функция ПолучитьМакетСервер(ИмяМакета)
	ОбъектСервер = РеквизитФормыВЗначение("Объект");
	Возврат ОбъектСервер.ПолучитьМакет(ИмяМакета);
КонецФункции

&НаКлиенте
// Служебная функция для подключения библиотеки создания fixtures.
Функция ПолучитьМакетОбработки(ИмяМакета) Экспорт
	Возврат ПолучитьМакетСервер(ИмяМакета);
КонецФункции

///////////////////////////////////////////////////
//Работа со сценариями
///////////////////////////////////////////////////

&НаКлиенте
// Процедура выполняется перед началом каждого сценария
Процедура ПередНачаломСценария() Экспорт

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

&НаКлиенте
// Процедура выполняется перед окончанием каждого сценария
Процедура ПередОкончаниемСценария() Экспорт

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

///////////////////////////////////////////////////
//Реализация шагов
///////////////////////////////////////////////////

&НаКлиенте
//Когда я вызываю служебный шаг для проверки загрузки снипетов метода шаг
//@ЯВызываюСлужебныйШагДляПроверкиЗагрузкиСнипетовМетодаШаг()
Процедура ЯВызываюСлужебныйШагДляПроверкиЗагрузкиСнипетовМетодаШаг() Экспорт

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

//окончание текста модуля

[Assistant] Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD)


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

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

Перем Ванесса;

Функция ИмяФункции(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	//пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,Снипет,ИмяПроцедуры,ПредставлениеТеста,Транзакция,Параметр);

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯПерешелНаЗакладкуГенераторEPF()","ЯПерешелНаЗакладкуГенераторEPF","И я перешел на закладку генератор EPF");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЕслиОжидаемыйФайлEpfУжеСуществуетТоОнБудетУдален()","ЕслиОжидаемыйФайлEpfУжеСуществуетТоОнБудетУдален","И если ожидаемый файл epf уже существует, то он будет удален");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯНажалНаКнопку(Парам01)","ЯНажалНаКнопку","И я нажал на кнопку ""СоздатьШаблоныОбработок""");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯПолучилСгенерированныйEpfФайлВОжидаемомКаталоге()","ЯПолучилСгенерированныйEpfФайлВОжидаемомКаталоге","Тогда я получил сгенерированный epf файл в ожидаемом каталоге");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"СгенерированныйEpfПрошелПроверкуНаКорректность()","СгенерированныйEpfПрошелПроверкуНаКорректность","И сгенерированный epf прошел проверку на корректность");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"СгенерированныйEpfЗнакМинусВСценарииПрошелПроверкуНаКорректность()","СгенерированныйEpfЗнакМинусВСценарииПрошелПроверкуНаКорректность","И сгенерированный epf ЗнакМинусВСценарии прошел проверку на корректность");

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

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

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

	Если Контекст.Свойство("ОткрытаяФормаVanessaADD") Тогда
		Если Контекст.ОткрытаяФормаVanessaADD.Открыта() Тогда
			Контекст.ОткрытаяФормаVanessaADD.Закрыть();
		КонецЕсли;

	КонецЕсли;

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

//я перешел на закладку генератор EPF
//@ЯПерешелНаЗакладкуГенераторEPF()
Процедура ЯПерешелНаЗакладкуГенераторEPF() Экспорт
	ОткрытаяФормаVanessaADD = Контекст.ОткрытаяФормаVanessaADD;
	ОткрытаяФормаVanessaADD.ЭлементыФормы.пЗапускСценариев.ТекущаяСтраница = ОткрытаяФормаVanessaADD.ЭлементыФормы.пЗапускСценариев.Страницы.СтраницаГенераторEPF;
КонецПроцедуры

//ожидаемый файл epf уже существует, то он будет удален
//@ЕслиОжидаемыйФайлEpfУжеСуществуетТоОнБудетУдален()
Процедура ЕслиОжидаемыйФайлEpfУжеСуществуетТоОнБудетУдален() Экспорт
	ИмяОжидаемогоФайла = Контекст.ОткрытаяФормаVanessaADD.КаталогИнструментов + "\features\Support\Templates\step_definitions\" + Контекст.ИмяТестовойФичи + ".epf";
	Контекст.Вставить("ИмяОжидаемогоФайла",ИмяОжидаемогоФайла);

	ИмяОжидаемогоФайла = Контекст.ИмяОжидаемогоФайла;
	Файл = Новый Файл(ИмяОжидаемогоФайла);
	Если Файл.Существует() Тогда
		Сообщить("Удаляю файл " + ИмяОжидаемогоФайла);
		УдалитьФайлы(ИмяОжидаемогоФайла);
	КонецЕсли;

	Контекст.Вставить("ИмяОжидаемогоФайла",ИмяОжидаемогоФайла);

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

//я нажал на кнопку "СоздатьШаблоныОбработок"
//@ЯНажалНаКнопку(Парам01Строка)
Процедура ЯНажалНаКнопку(ИмяКнопки) Экспорт
	ОткрытаяФормаVanessaADD = Контекст.ОткрытаяФормаVanessaADD;

	Если ИмяКнопки = "СоздатьШаблоныОбработок" Тогда
		ОткрытаяФормаVanessaADD.СоздатьШаблоныОбработок();
	Иначе
		ВызватьИсключение "Не смог обработать нажатие кнопки: " + ИмяКнопки;
	КонецЕсли;

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

//я получил сгенерированный epf файл в ожидаемом каталоге
//@ЯПолучилСгенерированныйEpfФайлВОжидаемомКаталоге()
Процедура ЯПолучилСгенерированныйEpfФайлВОжидаемомКаталоге() Экспорт
	ИмяОжидаемогоФайла = Контекст.ИмяОжидаемогоФайла;
	Файл = Новый Файл(ИмяОжидаемогоФайла);
	Ванесса.ПроверитьРавенство(Файл.Существует(),Истина,"Был создан epf в нужном каталоге");

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

//сгенерированный epf прошел проверку на корректность
//@СгенерированныйEpfПрошелПроверкуНаКорректность()
Процедура СгенерированныйEpfПрошелПроверкуНаКорректность() Экспорт
	ИмяОжидаемогоФайла = Контекст.ИмяОжидаемогоФайла;
	СозданнаяОбработка = ВнешниеОбработки.Создать(ИмяОжидаемогоФайла);

	//должна быть эта процедура, и она должна быть без параметров
	Попытка
		СозданнаяОбработка.ФичаСодержитСтрокуСТочкойВКонце();
	Исключение
		ОписаниеОшибки = ОписаниеОшибки();
		Если Найти(ОписаниеОшибки,"Не реализовано.") = 0 Тогда
			ВызватьИсключение "Не верно сгенерировалась epf! ФичаСодержитСтрокуСТочкойВКонце." + Символы.ПС + ОписаниеОшибки;
		КонецЕсли;
	КонецПопытки;

	Попытка
		СозданнаяОбработка.ФичаСодержитЧислоИЗапятуюПослеНего(10);
	Исключение
		ОписаниеОшибки = ОписаниеОшибки();
		Если Найти(ОписаниеОшибки,"Не реализовано.") = 0 Тогда
			ВызватьИсключение "Не верно сгенерировалась epf! ФичаСодержитЧислоИЗапятуюПослеНего()." + Символы.ПС + ОписаниеОшибки;
		КонецЕсли;
	КонецПопытки;

	Попытка
		СозданнаяОбработка.УстанавливаетсяПустойМок_ВСистемуТестирования();
	Исключение
		ОписаниеОшибки = ОписаниеОшибки();
		Если Найти(ОписаниеОшибки,"Не реализовано.") = 0 Тогда
			ВызватьИсключение "Не верно сгенерировалась epf! УстанавливаетсяПустойМок_ВСистемуТестирования()" + Символы.ПС + ОписаниеОшибки;
		КонецЕсли;
	КонецПопытки;

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

//И сгенерированный epf ЗнакМинусВСценарии прошел проверку на корректность
//@СгенерированныйEpfЗнакМинусВСценарииПрошелПроверкуНаКорректность()
Процедура СгенерированныйEpfЗнакМинусВСценарииПрошелПроверкуНаКорректность() Экспорт
	ИмяОжидаемогоФайла = Контекст.ИмяОжидаемогоФайла;
	СозданнаяОбработка = ВнешниеОбработки.Создать(ИмяОжидаемогоФайла);
КонецПроцедуры

[Assistant] Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD)


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

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

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

	ВсеТесты = Новый Массив;

	// описание шагов
    // TODO: допиши оставшуюся часть

[Assistant]
//начало текста модуля
&НаКлиенте
Перем Ванесса;

&НаКлиенте
Перем Контекст Экспорт;

&НаКлиенте
Перем КонтекстСохраняемый Экспорт;

&НаКлиенте
Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	//пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,Снипет,ИмяПроцедуры,ПредставлениеТеста,Транзакция,Параметр);

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

&НаКлиенте
Процедура ПередНачаломСценария() Экспорт

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

&НаКлиенте
Процедура ПередОкончаниемСценария() Экспорт

	//безусловное закрытие формы если она осталась
	Попытка
	    ОткрытаяФормаVanessaADD = Контекст.ОткрытаяФормаVanessaADD;
		ОткрытаяФормаVanessaADD.Закрыть();
	Исключение

	КонецПопытки;
КонецПроцедуры

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

//окончание текста модуля

add-develop/features/StepsRunner/step_definitions/ОбработкаПередОкончаниемСценария/ОбработкаПередОкончаниемСценария/Forms/Форма/Ext/Form/Module.bsl


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

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

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

	ВсеТесты = Новый Массив;

	// описание шагов
	//пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,Снипет,ИмяПроцедуры,ПредставлениеТеста,Транзакция,Параметр);

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯРаботаюВСеансеЗапущенногоСКлючомTESTMANAGER()","ЯРаботаюВСеансеЗапущенногоСКлючомTESTMANAGER","Я работаю в сеансе, запущенного с ключом TESTMANAGER");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯЗапускаюСеанс1ССКлючомTESTCLIENTСЛогиномИПаролем()","ЯЗапускаюСеанс1ССКлючомTESTCLIENTСЛогиномИПаролем","Я запускаю сеанс 1С с ключом TESTCLIENT");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ВПеременнойКонтекстПоявилосьЗначениеГлавноеОкноТестируемого()","ВПеременнойКонтекстПоявилосьЗначениеГлавноеОкноТестируемого","в переменной Контекст появилось значение ГлавноеОкноТестируемого");
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПолучитьСписокТестов(КонтекстФреймворкаBDD) Экспорт
	Ванесса = КонтекстФреймворкаBDD;

	ВсеТесты = Новый Массив;

	// описание шагов
	//пример вызова Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,Снипет,ИмяПроцедуры,ПредставлениеТеста,Транзакция,Параметр);

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯРаботаюВСеансеЗапущенногоСКлючомTESTMANAGER()","ЯРаботаюВСеансеЗапущенногоСКлючомTESTMANAGER","Я работаю в сеансе, запущенного с ключом TESTMANAGER");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯЗапускаюСеанс1ССКлючомTESTCLIENTСЛогиномИПаролем()","ЯЗапускаюСеанс1ССКлючомTESTCLIENTСЛогиномИПаролем","Я запускаю сеанс 1С с ключом TESTCLIENT");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ВПеременнойКонтекстПоявилосьЗначениеГлавноеОкноТестируемого()","ВПеременнойКонтекстПоявилосьЗначениеГлавноеОкноТестируемого","в переменной Контекст появилось значение ГлавноеОкноТестируемого");

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯСворачиваюВсеОкна()","ЯСворачиваюВсеОкна","я сворачиваю все окна");

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯУстанавливаюСоединениеССеансомTESTCLIENT()","ЯУстанавливаюСоединениеССеансомTESTCLIENT","я устанавливаю соединение с сеансом TESTCLIENT");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯАктивизируюГлавноеОкноСеансаTESTCLIENT()","ЯАктивизируюГлавноеОкноСеансаTESTCLIENT","я активизирую главное окно сеанса TESTCLIENT");

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

&НаКлиенте

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

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

&НаКлиенте

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

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

&НаКлиенте
//Я работаю в сеансе, запущенного с ключом TESTMANAGER
//@ЯРаботаюВСеансеЗапущенногоСКлючомTESTMANAGER()

Процедура ЯРаботаюВСеансеЗапущенногоСКлючомTESTMANAGER() Экспорт
	Попытка
		ТипЗначения = Тип("ТестируемоеПриложение");
	Исключение
		ВызватьИсключение "Хост сеанс надо запустить с ключом /TESTMANAGER.";
	КонецПопытки;

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

&НаКлиенте
//я сворачиваю все окна
//@ЯСворачиваюВсеОкна()

Процедура ЯСворачиваюВсеОкна() Экспорт
	СисИнфо = Новый СистемнаяИнформация;
	Если (СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86) или (СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64) Тогда
		Попытка
			Оболочка = Новый COMОбъект("Shell.Application");
			Оболочка.MinimizeAll();
		Исключение
			ВызватьИсключение "Не удалось подключить COM объект <Shell.Application>";
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
//Я запускаю сеанс 1С с ключом TESTCLIENT С Логином "НетЛогина" И Паролем "НетПароля"
//@ЯЗапускаюСеанс1ССКлючомTESTCLIENTСЛогиномИПаролем()

Процедура ЯЗапускаюСеанс1ССКлючомTESTCLIENTСЛогиномИПаролем(Логин,Пароль) Экспорт

	УстановитьКраткийЗаголовокПриложения("Vanessa-ADD");

	Контекст.Вставить("Логин",Логин);
	Контекст.Вставить("Пароль",Пароль);

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

			Если ГлавноеОкноТестКлиента <> Неопределено Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	СисИнфо = Новый СистемнаяИнформация;

	ВерсияПриложения = СисИнфо.ВерсияПриложения;
	ИмяФайлаПриложения1С = "";
	Если Ванесса.ЭтоЛинукс() Тогда
		ИмяФайлаПриложения1С = "1cv8c";
		КаталогПрограммы = КаталогПрограммы();
	Иначе
		ИмяФайлаПриложения1С = "1cv8c.exe";
		КаталогПрограммы = Ванесса.СтрШаблон_("C:\Program Files (x86)\1cv8\%1\bin\", ВерсияПриложения);
	КонецЕсли;
	ПутьК1С = КаталогПрограммы + ИмяФайлаПриложения1С;

	Если НЕ Ванесса.ФайлСуществуетКомандаСистемы(ПутьК1С) Тогда
		ВызватьИсключение Ванесса.СтрШаблон_("Не нашел путь к %1: %2", ИмяФайлаПриложения1С, ПутьК1С);
	КонецЕсли;

	КаталогБазы = СтрокаСоединенияИнформационнойБазы();

	Если Найти(ВРег(КаталогБазы),ВРег("File=")) > 0 Тогда

		КаталогБазы = СтрЗаменить(КаталогБазы,"File="," /F");
		КаталогБазы = СтрЗаменить(КаталогБазы,";","");

	Иначе

		КаталогБазы = СтрЗаменить(КаталогБазы,"Srvr=","/S");
		КаталогБазы = СтрЗаменить(КаталогБазы,""";Ref=""","\");

	КонецЕсли;

	Если НРег(Логин) <> НРег("НетЛогина") Тогда
		КаталогБазы = КаталогБазы + " /N""" + Логин +  """ /P""" + Пароль + """";
	КонецЕсли;

	СтрокаЗапуска = """" + ПутьК1С + """ ENTERPRISE " + КаталогБазы + " /TESTCLIENT";

	ЗапуститьСистему(СтрокаЗапуска);

	ТипЗначения = Тип("ТестируемоеПриложение");
	ПараметрыОбъекта = Новый Массив;
	ПараметрыОбъекта.Добавить("localhost");
	ТестовоеПриложение = Новый (ТипЗначения,ПараметрыОбъекта);

	КонтекстСохраняемый.Вставить("ТестовоеПриложение",ТестовоеПриложение);

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

&НаКлиенте

Процедура УстановитьСоединениеССеансомTESTCLIENT()

	ТестовоеПриложение = КонтекстСохраняемый.ТестовоеПриложение;

	ТекКоличествоСекундПодключения = ТекКоличествоСекундПодключения + 1;
	Сообщить("ТекКоличествоСекундПодключения=" + ТекКоличествоСекундПодключения);

	Попытка
		ТестовоеПриложение.УстановитьСоединение();
		ОтключитьОбработчикОжидания("УстановитьСоединениеССеансомTESTCLIENT");
		Сообщить("Подключились к сеансу TESTCLIENT!!!");
		Ванесса.ПродолжитьВыполнениеШагов();

		Возврат;
	Исключение
		Сообщить("" + ОписаниеОшибки());
	КонецПопытки;

	Если ТекКоличествоСекундПодключения >= МаксКоличествоСекундПодключения Тогда
		ОтключитьОбработчикОжидания("УстановитьСоединениеССеансомTESTCLIENT");
		Ванесса.ПродолжитьВыполнениеШагов();
	КонецЕсли;

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

&НаКлиенте
//я устанавливаю соединение с сеансом TESTCLIENT
//@ЯУстанавливаюСоединениеССеансомTESTCLIENT()

Процедура ЯУстанавливаюСоединениеССеансомTESTCLIENT() Экспорт
	Ванесса.ЗапретитьВыполнениеШагов();

	МаксКоличествоСекундПодключения = 10;
	ТекКоличествоСекундПодключения  = 0;

	ПодключитьОбработчикОжидания("УстановитьСоединениеССеансомTESTCLIENT",1);

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

&НаКлиенте

Процедура ПолучитьГлавноеОкноТестируемогоПриложения()

	ТестовоеПриложение = КонтекстСохраняемый.ТестовоеПриложение;

	ТекКоличествоСекундПодключения = ТекКоличествоСекундПодключения + 1;
	Сообщить("ТекКоличествоСекундПодключения=" + ТекКоличествоСекундПодключения);

	Если ТекКоличествоСекундПодключения >= МаксКоличествоСекундПодключения Тогда
		ОтключитьОбработчикОжидания("ПолучитьГлавноеОкноТестируемогоПриложения");
		Сообщить("Не смог ПолучитьГлавноеОкноТестируемогоПриложения!");
		Ванесса.ПродолжитьВыполнениеШагов();
	КонецЕсли;

	Попытка
		ГлавноеОкноТестируемого = ТестовоеПриложение.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"));
		ГлавноеОкноТестируемого.Активизировать();
		ОтключитьОбработчикОжидания("ПолучитьГлавноеОкноТестируемогоПриложения");
		КонтекстСохраняемый.Вставить("ГлавноеОкноТестируемого",ГлавноеОкноТестируемого);
		Ванесса.ПродолжитьВыполнениеШагов();
	Исключение
		Сообщить("" + ОписаниеОшибки());
	КонецПопытки;

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

&НаКлиенте

Процедура ЗавершитьСеансыTestClientПринудительно()
	Ванесса.ЗавершитьСеансыTestClientПринудительно();
КонецПроцедуры

&НаКлиенте
//я активизирую главное окно сеанса TESTCLIENT
//@ЯАктивизируюГлавноеОкноСеансаTESTCLIENT()


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

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

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

	Если Найти(НРег(ПредставлениеДанных),НРег(СтроковоеПредставление)) = 0 Тогда
		ТекстСообщения = "В значение элемента формы %1 не найдена строка <%2>. Текущее значение поля <%3>";
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ЗначениеПоляСодержитТекст(ИмяЭлемента,СтроковоеПредставление,ИскатьПоИмени = Ложь) Экспорт
	ЭлементФормы        = Ванесса.НайтиРеквизитОткрытойФормыПоЗаголовку(ИмяЭлемента,ИскатьПоИмени);
	ПредставлениеДанных = Ванесса.ПолучитьПредставлениеДанныхЭлементаФормы(ЭлементФормы);

	Если Найти(НРег(ПредставлениеДанных),НРег(СтроковоеПредставление)) = 0 Тогда
		ТекстСообщения = "В значение элемента формы %1 не найдена строка <%2>. Текущее значение поля <%3>";
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяЭлемента);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%2",СтроковоеПредставление);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%3",ПредставлениеДанных);
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
//Тогда значение поля с именем "Наименование" содержит текст "111"
//@ЗначениеПоляСИменемСодержитТекст(Парам01,Парам02)

Процедура ЗначениеПоляСИменемСодержитТекст(ИмяЭлемента,СтроковоеПредставление) Экспорт
	ЗначениеПоляСодержитТекст(ИмяЭлемента,СтроковоеПредставление,Истина);
КонецПроцедуры

&НаКлиенте
//И я активизирую поле "Имя поля"
//@ЯАктивизируюПоле(Парам01)

Процедура ЯАктивизируюПоле(ИмяЭлемента,ИскатьПоИмени = Ложь) Экспорт
	ЭлементФормы = Ванесса.НайтиРеквизитОткрытойФормыПоЗаголовку(ИмяЭлемента,ИскатьПоИмени);
	ЭлементФормы.Активизировать();
КонецПроцедуры

&НаКлиенте
//И я активизирую поле с именем "Имя поля"
//@ЯАктивизируюПолеСИменем(Парам01,Парам02)

Процедура ЯАктивизируюПолеСИменем(ИмяЭлемента,ИскатьПоИмени = Ложь) Экспорт
	ЯАктивизируюПоле(ИмяЭлемента,Истина);
КонецПроцедуры

&НаКлиенте
//Тогда текст ячейки таблицы "Таблица" "Наименование" стал равен "111"
//@ТекстЯчейкиТаблицыСталРавен(Парам01,Парам02,Парам03)

Процедура ТекстЯчейкиТаблицыСталРавен(ИмяТЧ,ИмяЭлемента,Знач СтроковоеПредставление,ИскатьПоИмени = Истина) Экспорт
	ТЧ                  = Ванесса.НайтиТЧПоИмени(ИмяТЧ);
	Если ИскатьПоИмени Тогда
		ПредставлениеДанных = ТЧ.ПолучитьТекстЯчейки(ИмяЭлемента);
	Иначе
		ВыделенныеСтроки = ТЧ.ПолучитьВыделенныеСтроки();
		Если ВыделенныеСтроки.Количество() = 0 Тогда
			ТекстСообщения = "В таблице <%1> не найдено ни одной строки";
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяТЧ);
			ВызватьИсключение ТекстСообщения;
		КонецЕсли;

		ЗначениеТекущейСтроки = ВыделенныеСтроки[0];
		ПредставлениеДанных   = ЗначениеТекущейСтроки[ИмяЭлемента];
		Если ПредставлениеДанных = Неопределено Тогда
			ТекстСообщения = "В таблице <%1> не найдено ячейки с заголовком <%2>";
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяТЧ);
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%2",ИмяЭлемента);
			ВызватьИсключение ТекстСообщения;
		КонецЕсли;
	КонецЕсли;

	СтроковоеПредставление = ПолучитьКорректныйТекстДляВставкиВПоле(СтроковоеПредставление);

	Если ПредставлениеДанных <> СтроковоеПредставление Тогда
		ТекстСообщения = "Для ячейки <%1> таблицы <%2> текущее значение равно <%3>, а ожидали <%4>";
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяЭлемента);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%2",ИмяТЧ);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%3",ПредставлениеДанных);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%4",СтроковоеПредставление);
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
//Тогда текст ячейки таблицы "Таблица" "Наименование" стал равен "111"
//@ТекстТекущейЯчейкиТаблицыСталРавен(Парам01,Парам02)

Процедура ТекстТекущейЯчейкиТаблицыСталРавен(ИмяТЧ,СтроковоеПредставление) Экспорт
	ТЧ                  = Ванесса.НайтиТЧПоИмени(ИмяТЧ);
	ПредставлениеДанных = ТЧ.ПолучитьТекстЯчейки();

	Если ПредставлениеДанных <> СтроковоеПредставление Тогда
		ТекстСообщения = "Для текущей ячейки таблицы <%1> текущее значение равно <%2>, а ожидали <%3>";
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяТЧ);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%2",ПредставлениеДанных);
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%3",СтроковоеПредставление);
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
//И поле "Имя поля" заполнено
//@ПолеЗаполнено(Парам01)

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

&НаКлиенте
//И поле с именем "Имя поля" заполнено
//@ПолеСИменемЗаполнено(Парам01)

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

&НаКлиенте

Функция ПолучитьСтрокиИзТаблицыTestClient(ТЧ)
	Возврат Ванесса.ПолучитьЗначениеТестируемаяТаблицаФормы(ТЧ);
КонецФункции

&НаКлиенте
//И     таблица формы с именем ""ИмяТаблицы"" стала равной:
//@ТаблицаФормыСИменемСталаРавной(Парам01,ТабПарам)


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

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

Процедура ИмяФункции(Отказ, Режим)
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	// регистр РСПодчиненныйРегистратору
	Движения.РСПодчиненныйРегистратору.Записывать = Истина;
	Движения.РСПодчиненныйРегистратору.Очистить();
	Для Каждого ТекСтрокаСостав Из Состав Цикл
		Движение = Движения.РСПодчиненныйРегистратору.Добавить();
		Движение.Период = Дата;
		Движение.ПростойСправочник = ПростойСправочник;
		Движение.ПростойСправочник2 = ТекСтрокаСостав.ПростойСправочник2;
		Движение.РесурсЧисло = ТекСтрокаСостав.РеквизитЧисло;
		Движение.РеквизитБулево = ТекСтрокаСостав.РеквизитБулево;
	КонецЦикла;

	// регистр РегистрНакопления2 Приход
	Движения.РегистрНакопления2.Записывать = Истина;
	Движения.РегистрНакопления2.Очистить();
	Для Каждого ТекСтрокаСостав Из Состав Цикл
		Движение = Движения.РегистрНакопления2.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.ПростойСправочник = ПростойСправочник;
		Движение.ПростойСправочник2 = ТекСтрокаСостав.ПростойСправочник2;
		Движение.РесурсЧисло = ТекСтрокаСостав.РеквизитЧисло;
		Движение.РеквизитБулево = ТекСтрокаСостав.РеквизитБулево;
	КонецЦикла;

	// регистр РегистрБухгалтерии1
	Движения.РегистрБухгалтерии1.Записывать = Истина;
	Движения.РегистрБухгалтерии1.Очистить();
	Для Каждого ТекСтрокаСостав Из Состав Цикл
		Движение = Движения.РегистрБухгалтерии1.Добавить();
		Движение.СчетДт = ПланыСчетов.ПланСчетов1.Счет01;
		Движение.СчетКт = ПланыСчетов.ПланСчетов1.Счет02;
		Движение.Период = Дата;
		Движение.ПростойСправочник = ПростойСправочник;
		Движение.ПростойСправочник2Дт = ТекСтрокаСостав.ПростойСправочник2;
		Движение.РесурсЧисло = ТекСтрокаСостав.РеквизитЧисло;
		Движение.РесурсЧисло1Дт = ТекСтрокаСостав.РеквизитЧисло;
		Движение.РеквизитБулево = ТекСтрокаСостав.РеквизитБулево;

		Движение.СубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконто1.Субконто1, ПростойСправочник);
		Движение.СубконтоКт.Вставить(ПланыВидовХарактеристик.ВидыСубконто1.Субконто2, ТекСтрокаСостав.ПростойСправочник2);
		Движение.СубконтоКт.Вставить(ПланыВидовХарактеристик.ВидыСубконто1.Субконто1, ПростойСправочник);

		Движение = Движения.РегистрБухгалтерии1.Добавить();
		Движение.СчетДт = ПланыСчетов.ПланСчетов1.СчетБезСубконто;
		Движение.Период = Дата;
		Движение.ПростойСправочник = ПростойСправочник;
		Движение.ПростойСправочник2Кт = ТекСтрокаСостав.ПростойСправочник2;
		Движение.РесурсЧисло = ТекСтрокаСостав.РеквизитЧисло;
		Движение.РесурсЧисло1Кт = ТекСтрокаСостав.РеквизитЧисло;
		Движение.РеквизитБулево = ТекСтрокаСостав.РеквизитБулево;

	КонецЦикла;

	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

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


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

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

Функция ИмяФункции(Знач СтрокаПодстановки,
	Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
	Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
	Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт

	ИспользоватьАльтернативныйАлгоритм =
		Найти(Параметр1, "%")
		Или Найти(Параметр2, "%")
		Или Найти(Параметр3, "%")
		Или Найти(Параметр4, "%")
		Или Найти(Параметр5, "%")
		Или Найти(Параметр6, "%")
		Или Найти(Параметр7, "%")
		Или Найти(Параметр8, "%")
		Или Найти(Параметр9, "%");

	Если ИспользоватьАльтернативныйАлгоритм Тогда
		СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1,
			Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9);
	Иначе
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8);
		СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9);
	КонецЕсли;

	Возврат СтрокаПодстановки;
КонецФункции

// Подставляет параметры в строку. Число параметров в строке не ограничено.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров
// начинается с единицы.
//
// Параметры
//  СтрокаПодстановки  - Строка - шаблон строки с параметрами (вхождениями вида "%1");
//  МассивПараметров   - Массив - массив строк, которые соответствуют параметрам в строке подстановки.
//
// Возвращаемое значение:
//   Строка - строка с подставленными параметрами.
//
// Пример:
//  МассивПараметров = Новый Массив;
//  МассивПараметров = МассивПараметров.Добавить("Вася");
//  МассивПараметров = МассивПараметров.Добавить("Зоопарк");
//
//  Строка = ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), МассивПараметров);
//

Функция ПодставитьПараметрыВСтрокуИзМассива(Знач СтрокаПодстановки, Знач МассивПараметров) Экспорт

	СтрокаРезультата = СтрокаПодстановки;

	Индекс = МассивПараметров.Количество();
	Пока Индекс > 0 Цикл
		Значение = МассивПараметров[Индекс-1];
		Если Не ПустаяСтрока(Значение) Тогда
			СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%" + Формат(Индекс, "ЧГ="), Значение);
		КонецЕсли;
		Индекс = Индекс - 1;
	КонецЦикла;

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

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

// Заменяет в шаблоне строки имена параметров на их значения. Параметры в строке выделяются с двух сторон квадратными
// скобками.
//
// Параметры:
//
//  ШаблонСтроки        - Строка    - строка, в которую необходимо вставить значения.
//  ВставляемыеЗначения - Структура - структура значений, где ключ - имя параметра без спецсимволов,
//                                    значение - вставляемое значение.
//
// Возвращаемое значение:
//  Строка - строка со вставленными значениями.
//
// Пример использования:
//  ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Новый Структура("Фамилия,Имя", "Пупкин", "Вася"));
//  Возвращает: "Здравствуй, Вася Пупкин".

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

// Получает значения параметров из строки.
//
// Параметры:
//  СтрокаПараметров - Строка - строка, содержащая параметры, каждый из которых представляет собой
//                              фрагмент вида <Имя параметра>=<Значение>, где:
//                                Имя параметра - имя параметра;
//                                Значение - его значение.
//                              Фрагменты отделяются друг от друга символами ';'.
//                              Если значение содержит пробельные символы, то оно должно быть заключено в двойные
//                              кавычки (").
//                              Например:
//                               "File=""c:\InfoBases\Trade""; Usr=""Director"";"
//
// Возвращаемое значение:
//  Структура - структура параметров, где ключ - имя параметра, значение - значение параметра.
//

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

	Результат = Новый Структура;

	СимволДвойныеКавычки = Символ(34); // (")

	МассивПодстрок = РазложитьСтрокуВМассивПодстрок(СтрокаПараметров, ";");

	Для Каждого СтрокаПараметра Из МассивПодстрок Цикл

		ПозицияПервогоЗнакаРавенства = Найти(СтрокаПараметра, "=");

		// Получаем имя параметра
		ИмяПараметра = СокрЛП(Лев(СтрокаПараметра, ПозицияПервогоЗнакаРавенства - 1));

		// Получаем значение параметра
		ЗначениеПараметра = СокрЛП(Сред(СтрокаПараметра, ПозицияПервогоЗнакаРавенства + 1));

		Если  Лев(ЗначениеПараметра, 1) = СимволДвойныеКавычки
			И Прав(ЗначениеПараметра, 1) = СимволДвойныеКавычки Тогда

			ЗначениеПараметра = Сред(ЗначениеПараметра, 2, СтрДлина(ЗначениеПараметра) - 2);

		КонецЕсли;

		Если Не ПустаяСтрока(ИмяПараметра) Тогда

			Результат.Вставить(ИмяПараметра, ЗначениеПараметра);

		КонецЕсли;

	КонецЦикла;

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

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

Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт

	Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;

	Если Не УчитыватьПробелы Тогда
		СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
	КонецЕсли;

	Если ПустаяСтрока(СтрокаПроверки) Тогда
		Возврат Истина;
	КонецЕсли;

	Если Не УчитыватьЛидирующиеНули Тогда
		Позиция = 1;
		// Взятие символа за границей строки возвращает пустую строку.
		Пока Сред(СтрокаПроверки, Позиция, 1) = "0" Цикл
			Позиция = Позиция + 1;
		КонецЦикла;
		СтрокаПроверки = Сред(СтрокаПроверки, Позиция);
	КонецЕсли;

	// Если содержит только цифры, то в результате замен должна быть получена пустая строка.
	// Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы.
	Возврат СтрДлина(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
			СтрокаПроверки, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")
	) = 0;

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

// Проверяет, содержит ли строка только символы кириллического алфавита.
//
// Параметры:
//  УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
//  ДопустимыеСимволы - строка для проверки.
//
// Возвращаемое значение:
//  Булево - Истина, если строка содержит только кириллические (или допустимые) символы или пустая;
//           Ложь, если строка содержит иные символы.
//

[Assistant]
Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
	Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
	Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
	Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено)


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

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

Функция ИмяФункции(Знач ИсходнаяСтрока) Экспорт
	ИсходнаяСтрока = СокрЛП(ИсходнаяСтрока);
	Результат = 0;
	ЗнаковПослеЗапятой = -1;
	ЗнакОтрицательный = Ложь;
	Для НомерСимвола = 1 По СтрДлина(ИсходнаяСтрока) Цикл
		КодСимвола = КодСимвола(ИсходнаяСтрока, НомерСимвола);
		Если КодСимвола = 32 Или КодСимвола = 160 Тогда // Пробел или неразрывный пробел.
			// Пропуск (действие не требуется).
		ИначеЕсли КодСимвола = 45 Или КодСимвола = 40 Тогда // Минус или открывающая скобка.
			Если Результат <> 0 Тогда
				Возврат Неопределено;
			КонецЕсли;
			ЗнакОтрицательный = Истина;
		ИначеЕсли КодСимвола = 41 Тогда // Закрывающая скобка.
			Если Не ЗнакОтрицательный Или Результат = 0 Тогда // Не было открывающей скобки или нет числа.
				Возврат Неопределено;
			КонецЕсли;
			// Пропуск (действие не требуется).
		ИначеЕсли КодСимвола = 44 Или КодСимвола = 46 Тогда // Запятая или точка.
			Если ЗнаковПослеЗапятой <> -1 Тогда
				Возврат Неопределено; // Разделитель уже был, следовательно это не число.
			КонецЕсли;
			ЗнаковПослеЗапятой = 0; // Запуск отсчета знаков после запятой.
		ИначеЕсли КодСимвола > 47 И КодСимвола < 58 Тогда // Число.
			Если ЗнаковПослеЗапятой <> -1 Тогда
				ЗнаковПослеЗапятой = ЗнаковПослеЗапятой + 1;
			КонецЕсли;
			Число = КодСимвола - 48;
			Результат = Результат * 10 + Число;
		Иначе
			Возврат Неопределено;
		КонецЕсли;
	КонецЦикла;

	Если ЗнаковПослеЗапятой > 0 Тогда
		Результат = Результат / Pow(10, ЗнаковПослеЗапятой);
	КонецЕсли;
	Если ЗнакОтрицательный Тогда
		Результат = -Результат;
	КонецЕсли;

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

// Выполняет преобразование цифры в римскую нотацию.
//
// Параметры
//	Цифра - Число - цифра от 0 до 9.
//  РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка - Строка - символы, соответствующие римским цифрам.
//
// Возвращаемое значение
//	Строка - цифра в римской нотации.
//
// Пример:
//	ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII".
//

Функция ПреобразоватьЦифруВРимскуюНотацию(Цифра, РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка)

	РимскаяЦифра="";
	Если Цифра = 1 Тогда
		РимскаяЦифра = РимскаяЕдиница
	ИначеЕсли Цифра = 2 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 3 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 4 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяПятерка;
	ИначеЕсли Цифра = 5 Тогда
		РимскаяЦифра = РимскаяПятерка;
	ИначеЕсли Цифра = 6 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница;
	ИначеЕсли Цифра = 7 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 8 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 9 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяДесятка;
	КонецЕсли;
	Возврат РимскаяЦифра;

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

// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д.

Функция ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(Знач СтрокаПодстановки,
	Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
	Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
	Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено)

	Результат = "";
	Позиция = Найти(СтрокаПодстановки, "%");
	Пока Позиция > 0 Цикл
		Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1);
		СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1);
		ПодставляемыйПараметр = "";
		Если СимволПослеПроцента = "1" Тогда
			ПодставляемыйПараметр =  Параметр1;
		ИначеЕсли СимволПослеПроцента = "2" Тогда
			ПодставляемыйПараметр =  Параметр2;
		ИначеЕсли СимволПослеПроцента = "3" Тогда
			ПодставляемыйПараметр =  Параметр3;
		ИначеЕсли СимволПослеПроцента = "4" Тогда
			ПодставляемыйПараметр =  Параметр4;
		ИначеЕсли СимволПослеПроцента = "5" Тогда
			ПодставляемыйПараметр =  Параметр5;
		ИначеЕсли СимволПослеПроцента = "6" Тогда
			ПодставляемыйПараметр =  Параметр6;
		ИначеЕсли СимволПослеПроцента = "7" Тогда
			ПодставляемыйПараметр =  Параметр7
		ИначеЕсли СимволПослеПроцента = "8" Тогда
			ПодставляемыйПараметр =  Параметр8;
		ИначеЕсли СимволПослеПроцента = "9" Тогда
			ПодставляемыйПараметр =  Параметр9;
		КонецЕсли;
		Если ПодставляемыйПараметр = "" Тогда
			Результат = Результат + "%";
			СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1);
		Иначе
			Результат = Результат + ПодставляемыйПараметр;
			СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2);
		КонецЕсли;
		Позиция = Найти(СтрокаПодстановки, "%");
	КонецЦикла;
	Результат = Результат + СтрокаПодстановки;

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

Функция СоответствиеКириллицыИЛатиницы()
	// Транслитерация, используемая в загранпаспортах 1997-2010.
	Соответствие = Новый Соответствие;
	Соответствие.Вставить("а","a");
	Соответствие.Вставить("б","b");
	Соответствие.Вставить("в","v");
	Соответствие.Вставить("г","g");
	Соответствие.Вставить("д","d");
	Соответствие.Вставить("е","e");
	Соответствие.Вставить("ё","e");
	Соответствие.Вставить("ж","zh");
	Соответствие.Вставить("з","z");
	Соответствие.Вставить("и","i");
	Соответствие.Вставить("й","y");
	Соответствие.Вставить("к","k");
	Соответствие.Вставить("л","l");
	Соответствие.Вставить("м","m");
	Соответствие.Вставить("н","n");
	Соответствие.Вставить("о","o");
	Соответствие.Вставить("п","p");
	Соответствие.Вставить("р","r");
	Соответствие.Вставить("с","s");
	Соответствие.Вставить("т","t");
	Соответствие.Вставить("у","u");
	Соответствие.Вставить("ф","f");
	Соответствие.Вставить("х","kh");
	Соответствие.Вставить("ц","ts");
	Соответствие.Вставить("ч","ch");
	Соответствие.Вставить("ш","sh");
	Соответствие.Вставить("щ","shch");
	Соответствие.Вставить("ъ","""");
	Соответствие.Вставить("ы","y");
	Соответствие.Вставить("ь",""); // пропускается
	Соответствие.Вставить("э","e");
	Соответствие.Вставить("ю","yu");
	Соответствие.Вставить("я","ya");

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

////////////////////////////////////////////////////////////////////////////////
// УСТАРЕВШИЕ ПРОЦЕДУРЫ И ФУНКЦИИ

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

Функция ПолучитьСтрокуИзМассиваПодстрок(Массив, Разделитель = ",") Экспорт

	// Возвращаемое значение функции.
	Результат = "";

	Для Каждого Элемент Из Массив Цикл

		Подстрока = ?(ТипЗнч(Элемент) = Тип("Строка"), Элемент, Строка(Элемент));

		РазделительПодстрок = ?(ПустаяСтрока(Результат), "", Разделитель);

		Результат = Результат + РазделительПодстрок + Подстрока;

	КонецЦикла;

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

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

// } Функции работы со строками

[Assistant] Функция СтрокаВЧисло(Знач ИсходнаяСтрока)


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

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

Функция ОписаниеПлагина(КонтекстЯдра, ВозможныеТипыПлагинов)
Экспорт
	Результат = Новый Структура;
	Результат.Вставить("Тип", ВозможныеТипыПлагинов.Загрузчик);
	Результат.Вставить("Идентификатор", Метаданные().Имя);
    // TODO: допиши оставшуюся часть

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

	Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции

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

// } Plugin interface

// { Loader interface
#Если ТолстыйКлиентОбычноеПриложение Тогда

Функция ВыбратьПутьИнтерактивно(КонтекстЯдра, ТекущийПуть = "") Экспорт
	ДиалогВыбораТеста = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораТеста.Фильтр = "Обработка-тест (*.epf)|*.epf|Отчет-тест (*.erf)|*.erf|Все файлы|*";
	ДиалогВыбораТеста.МножественныйВыбор = Истина;
	ДиалогВыбораТеста.ПроверятьСуществованиеФайла = Истина;
	ДиалогВыбораТеста.ПолноеИмяФайла = ТекущийПуть;

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

	Возврат Лев(Текст, СтрДлина(Текст) - 1);
КонецФункции
#КонецЕсли

Функция Загрузить(КонтекстЯдра, Путь) Экспорт
	ИспользоватьПрямыеПутиФайлов = КонтекстЯдра.ИспользоватьПрямыеПутиФайлов;

	ПостроительДереваТестов = КонтекстЯдра.Плагин("ПостроительДереваТестов");
	ДеревоТестов = Неопределено;
	Для Сч = 1 По СтрЧислоСтрок(Путь) Цикл
		ФайлОбработки = Новый Файл(СтрПолучитьСтроку(Путь, Сч));

		Если ДеревоТестов = Неопределено Тогда
			ДеревоТестов = ПостроительДереваТестов.СоздатьКонтейнер(ФайлОбработки.Путь);
		КонецЕсли;

		КонтейнерСТестамиОбработки = ЗагрузитьФайл(ПостроительДереваТестов, ФайлОбработки, КонтекстЯдра);
		Если КонтейнерСТестамиОбработки.Строки.Количество() > 0 Тогда
			ДеревоТестов.Строки.Добавить(КонтейнерСТестамиОбработки);
		КонецЕсли;
	КонецЦикла;

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

Функция ПолучитьКонтекстПоПути(КонтекстЯдра, Путь) Экспорт
	ФайлОбработки = Новый Файл(Путь);

	Обработка = ПолучитьКонтекстОбработки(ФайлОбработки);

	Возврат Обработка;
КонецФункции
// } Loader interface

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

	ЭтоФайлОтчета = (НРег(ФайлОбработки.Расширение) = ".erf");

	Если ИспользоватьПрямыеПутиФайлов Тогда
		ПроверитьКорректностьФайла(ФайлОбработки);

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

			Если ЭтоФайлОтчета Тогда
				Обработка = ВнешниеОтчеты.Создать(ФайлОбработки.ПолноеИмя, Ложь);
			Иначе
				Обработка = ВнешниеОбработки.Создать(ФайлОбработки.ПолноеИмя, Ложь);
			КонецЕсли;
		КонецПопытки;
	КонецЕсли;

	ИмяОбработки = СтрЗаменить("" + Обработка, "ВнешняяОбработкаОбъект.", "");
	ИмяОбработки = СтрЗаменить("" + ИмяОбработки, "ExternalDataProcessorObject.", "");

	Возврат Обработка;

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

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

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

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

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

	//TODO: Добавить получение метаданных
	МетаданныеОбработки = Обработка.Метаданные();
	Если ЗначениеЗаполнено(МетаданныеОбработки.Синоним) Тогда

		ИмяКонтейнера = МетаданныеОбработки.Синоним;

	Иначе

		ИмяКонтейнера = ИмяОбработки;

	КонецЕсли;

	КонтейнерТестов = ПостроительДереваТестов.СоздатьКонтейнер(ИмяКонтейнера, ИконкаУзла);

	Попытка
		Обработка.ЗаполнитьНаборТестов(ЭтотОбъект, КонтекстЯдра);
	Исключение
		Инфо = ИнформацияОбОшибке();
		Если (Инфо.ИмяМодуля = "ВнешняяОбработка.ЗагрузчикФайла.МодульОбъекта" ИЛИ Инфо.ИмяМодуля = "ExternalDataProcessor.ЗагрузчикФайла.ObjectModule") И
			(Инфо.Описание = "Слишком много фактических параметров" Или
			Инфо.Описание = "Too many actual parameters") И
			Найти(Инфо.ИсходнаяСтрока, "Обработка.ЗаполнитьНаборТестов(ЭтотОбъект, КонтекстЯдра);") > 0
			Тогда

				Обработка.ЗаполнитьНаборТестов(ЭтотОбъект);

			Иначе
				ВызватьИсключение;
			КонецЕсли;
	КонецПопытки;

	Результат = КонтейнерТестов;
	КонтейнерТестов = Неопределено;
	ТекущаяГруппа = Неопределено;

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

Функция ЭтоНовыйФорматОбработки(Знач ТекстОшибки)
	ЭтоНовыйФорматОбработки = Не ЕстьОшибка_МетодОбъектаНеОбнаружен(ТекстОшибки, "ЗаполнитьНаборТестов");

	Возврат ЭтоНовыйФорматОбработки;
КонецФункции

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

		Если Найти(Описание, "Метод объекта не обнаружен (ПолучитьСписокТестов)") = 0 И
			Найти(Описание, "Object method not found (ПолучитьСписокТестов)") = 0 Тогда
			ВызватьИсключение Описание;
		КонецЕсли;
	КонецПопытки;

	СлучайныйПорядокВыполнения = Истина;
	Попытка
		СлучайныйПорядокВыполнения = Обработка.РазрешенСлучайныйПорядокВыполненияТестов();
	Исключение
	КонецПопытки;

	МетаданныеОбработки = Обработка.Метаданные();
	Если ЗначениеЗаполнено(МетаданныеОбработки.Синоним) Тогда

		ИмяКонтейнера = МетаданныеОбработки.Синоним;

	Иначе

		ИмяКонтейнера = ФайлОбработки.ИмяБезРасширения;

	КонецЕсли;

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

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


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

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

Функция ОписаниеПлагина(КонтекстЯдра, ВозможныеТипыПлагинов)
Экспорт
	Результат = Новый Структура;
	Результат.Вставить("Тип", ВозможныеТипыПлагинов.Утилита);
	Результат.Вставить("Идентификатор", Метаданные().Имя);
    // TODO: допиши оставшуюся часть

[Assistant]
Перем ПутьКФайлуПолный Экспорт;// в эту переменную будет установлен правильный клиентский путь к текущему файлу

Перем КонтекстЯдра;
Перем ЭтоЛинукс;

Перем РегулярноеВыражение;
Перем ТестерЛинукс;

Перем Ожидаем;
Перем ПредыдущийШаблон;
Перем ПредыдущийШаблонДоЭкранирования;
Перем ПредыдущийШаблонПослеЭкранирования;

Перем СпецСимволы;

// { Plugin interface
Функция ОписаниеПлагина(КонтекстЯдра, ВозможныеТипыПлагинов) Экспорт
	Результат = Новый Структура;
	Результат.Вставить("Тип", ВозможныеТипыПлагинов.Утилита);
	Результат.Вставить("Идентификатор", Метаданные().Имя);
	Результат.Вставить("Представление", "РегулярныеВыражения");

	Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции

Процедура Инициализация(КонтекстЯдраПараметр) Экспорт
	КонтекстЯдра = КонтекстЯдраПараметр;
	ЭтоЛинукс = КонтекстЯдраПараметр.ЭтоЛинукс();
КонецПроцедуры
// } Plugin interface

// { API

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

		РегулярноеВыражение.Pattern = Шаблон;
	КонецЕсли;
КонецПроцедуры

// Проверяет строку на соответствие подготовленному регулярному выражению
//
// Параметры:
//  ПроверяемаяСтрока	 - 	 -
//
// Возвращаемое значение:
//   Булево - соответствует или нет
//
Функция Совпадает(Знач ПроверяемаяСтрока) Экспорт
	ПроверитьПодготовленность();
	Возврат РегулярноеВыражение.Test(ПроверяемаяСтрока);
КонецФункции

// Позволяет проверить соответствие строки "ПроверяемаяСтрока" шаблону "Шаблон"
//	при этом подстрока "Шаблон" может содержать символы *, который означает "любые символы"
//	например СтрокаСоответствуетШаблону("Привет","*вет")
//
// Параметры:
//  ПроверяемаяСтрока	 - Строка	 -
//  Шаблон				 - Строка	 -
//  ШаблонУжеПодготовлен - Булево	 - флаг предварительной подготовки шаблона для ускорения
//
// Возвращаемое значение:
//   Булево - соответствует или нет
//
Функция СтрокаСоответствуетШаблону(Знач ПроверяемаяСтрока, Знач Шаблон = "", Знач ШаблонУжеПодготовлен = Ложь) Экспорт

	Если ПроверяемаяСтрока = "" И Шаблон = "" Тогда
		Возврат Истина;
	КонецЕсли;
	Если ПредыдущийШаблон <> Шаблон Тогда
		ПредыдущийШаблон = Шаблон;
		Если ЗначениеЗаполнено(Шаблон) Тогда
			Если Не ШаблонУжеПодготовлен Тогда
				Шаблон = ПодготовитьШаблонКИспользованиюВРегулярке(Шаблон);
			КонецЕсли;
			Если Не ЭтоЛинукс Тогда
				//для VBScript.RegExp явно указываем что есть начало и конец строки
				Шаблон            = "^" + Шаблон + "$";
			КонецЕсли;

			Подготовить(Шаблон);
		КонецЕсли;

		ПроверитьПодготовленность();
	КонецЕсли;

	Если ЭтоЛинукс Тогда
		Возврат ПроверитьСтрокуRexExpLinux(ПроверяемаяСтрока);
	Иначе
		Возврат РегулярноеВыражение.Test(ПроверяемаяСтрока);
	КонецЕсли;
КонецФункции

// Подготовить шаблон к использованию в регулярке путем экранирования служебных символов
//	Важно: Символ * в шаблоне трактуется как выражение .+ (любой символ)
//
// Параметры:
//  Шаблон	 - Строка - строка регулярного выражения без экранирования
//
// Возвращаемое значение:
//   Строка - подготовленный шаблон регулярного выражения с добавлением экранирования и заменой *
//
Функция ПодготовитьШаблонКИспользованиюВРегулярке(Знач Шаблон) Экспорт

	Если ПредыдущийШаблонДоЭкранирования = Шаблон Тогда
		Возврат ПредыдущийШаблонПослеЭкранирования;
	КонецЕсли;
	ПредыдущийШаблонДоЭкранирования = Шаблон;

	// Экранируем все, кроме звездочки. Ее будем трактовать по-своему.
	Если СпецСимволы = Неопределено Тогда
		СпецСимволы = Новый Массив;
		СпецСимволы.Добавить("\");
		СпецСимволы.Добавить("^");
		СпецСимволы.Добавить("$");
		СпецСимволы.Добавить("(");
		СпецСимволы.Добавить(")");
		СпецСимволы.Добавить("<");
		СпецСимволы.Добавить("[");
		СпецСимволы.Добавить("]");
		СпецСимволы.Добавить("{");
		СпецСимволы.Добавить("}");
		СпецСимволы.Добавить("|");
		СпецСимволы.Добавить(">");
		СпецСимволы.Добавить(".");
		СпецСимволы.Добавить("+");
		СпецСимволы.Добавить("?");
	КонецЕсли;

	Для Каждого СпецСимвол Из СпецСимволы Цикл
		Шаблон = СтрЗаменить(Шаблон, СпецСимвол, "\" + СпецСимвол);
	КонецЦикла;

	// Трактуем * по-нашему.
	Шаблон = СтрЗаменить(Шаблон, "*", ".*");

	ПредыдущийШаблонПослеЭкранирования = Шаблон;
	Возврат Шаблон;

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

// } API

// { Helpers

Процедура ПроверитьПодготовленность()
	Если ЭтоЛинукс Тогда
		Значение = ТестерЛинукс;
	Иначе
		Значение = РегулярноеВыражение;
	КонецЕсли;
	Ожидаем().Что(Значение <> Неопределено,
		"Ожидали, что регулярное выражение подготовлено, а это не так")
		.ЭтоИстина();
КонецПроцедуры

//взято из https://infostart.ru/public/464971/
Функция ПроверитьСтрокуRexExpLinux(Знач Строка)

    Попытка
        ТестерЛинукс.TestItem = Строка;
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
КонецФункции

//взято из https://infostart.ru/public/464971/
Функция ПодготовитьШаблонRegExpLinux(Знач Шаблон)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(
                "<Model xmlns=""http://v8.1c.ru/8.1/xdto"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""Model"">
                |<package targetNamespace=""sample-my-package"">
                |<valueType name=""testtypes"" base=""xs:string"">
                |<pattern>" + Шаблон + "</pattern>
                |</valueType>
                |<objectType name=""TestObj"">
                |<property xmlns:d4p1=""sample-my-package"" name=""TestItem"" type=""d4p1:testtypes""/>
                |</objectType>
                |</package>
                |</Model>");

    Модель = ФабрикаXDTO.ПрочитатьXML(Чтение);
    МояФабрикаXDTO = Новый ФабрикаXDTO(Модель);
    Пакет = МояФабрикаXDTO.Пакеты.Получить("sample-my-package");
    ТестерЛинукс = МояФабрикаXDTO.Создать(Пакет.Получить("TestObj"));

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

Функция Ожидаем()

	Если Ожидаем = Неопределено Тогда
		Ожидаем = КонтекстЯдра.Плагин("УтвержденияBDD");
	КонецЕсли;
	Возврат Ожидаем;

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

// } Helpers

add-develop/plugins/РегулярныеВыражения/РегулярныеВыражения/Ext/ObjectModule.bsl


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

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

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

	ПрочитатьДанныеИзМакета(ПротоДанные, ТабличныйДокумент, Неопределено);

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

			Если ОписаниеОбъекта.Ключ = "Объект" Тогда
				Продолжить;
			КонецЕсли;

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

			Если ТипЗнч(Значение) = Тип("Структура")
				ИЛИ ТипЗнч(Значение) = Тип("Массив")
				ИЛИ ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда

				Если Значение.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли;
			КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПреобразоватьМакетДанныхВСтроку(ТабличныйДокумент) Экспорт
	ПротоДанные = Новый Структура;

	ПрочитатьДанныеИзМакета(ПротоДанные, ТабличныйДокумент, Неопределено);

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

			Если ОписаниеОбъекта.Ключ = "Объект" Тогда
				Продолжить;
			КонецЕсли;

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

			Если ТипЗнч(Значение) = Тип("Структура")
				ИЛИ ТипЗнч(Значение) = Тип("Массив")
				ИЛИ ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда

				Если Значение.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли;
			КонецЕсли;

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

			ПротоДанныеКопия[КлючЗначение.Ключ].Вставить(ОписаниеОбъекта.Ключ, Значение);
		КонецЦикла;
	КонецЦикла;

	ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(   , Символы.Таб);
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку(ПараметрыЗаписи);
	ЗаписатьJSON(Запись, ПротоДанныеКопия);

	Возврат Запись.Закрыть();

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

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

	Результат = Новый Массив;

	Периодический        = НЕ (Метаданные.РегистрыСведений[ИмяРС].ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический);
	ПодчиненРегистратору = (Метаданные.РегистрыСведений[ИмяРС].РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору);

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

	Для каждого Запись Из НаборЗаписей Цикл
		ЗначенияКлюча = Новый Структура;

		Если ПодчиненРегистратору Тогда
			ЗначенияКлюча.Вставить("Регистратор", Запись.Регистратор);
		КонецЕсли;
		Если Периодический Тогда
			ЗначенияКлюча.Вставить("Период", Запись.Период);
		КонецЕсли;

		Для каждого Измерение Из МассивИзмерений Цикл
			ЗначенияКлюча.Вставить(Измерение, Запись[Измерение]);
		КонецЦикла;

		КлючЗаписи = РегистрыСведений[ИмяРС].СоздатьКлючЗаписи(ЗначенияКлюча);

		Результат.Добавить(КлючЗаписи);
	КонецЦикла;

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

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

Функция ПолучитьКлючиЗаписиРНПоНаборуЗаписейРН(НаборЗаписей,ИмяРН)

	Результат = Новый Массив;

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

	Для каждого Запись Из НаборЗаписей Цикл
		ЗначенияКлюча = Новый Структура;

		ЗначенияКлюча.Вставить("Регистратор", Запись.Регистратор);
		ЗначенияКлюча.Вставить("Период", Запись.Период);

		Для каждого Измерение Из МассивИзмерений Цикл
			ЗначенияКлюча.Вставить(Измерение, Запись[Измерение]);
		КонецЦикла;

		КлючЗаписи = РегистрыНакопления[ИмяРН].СоздатьКлючЗаписи(ЗначенияКлюча);

		Результат.Добавить(КлючЗаписи);
	КонецЦикла;

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

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

Функция ПолучитьКлючиЗаписиРБПоНаборуЗаписейРБ(НаборЗаписей,ИмяРБ)

	Результат = Новый Массив;

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

	Для каждого Запись Из НаборЗаписей Цикл
		ЗначенияКлюча = Новый Структура;

		ЗначенияКлюча.Вставить("Регистратор", Запись.Регистратор);
		ЗначенияКлюча.Вставить("Период", Запись.Период);

		Для каждого Измерение Из МассивИзмерений Цикл
			ЗначенияКлюча.Вставить(Измерение, Запись[Измерение]);
		КонецЦикла;

		КлючЗаписи = РегистрыБухгалтерии[ИмяРБ].СоздатьКлючЗаписи(ЗначенияКлюча);

		Результат.Добавить(КлючЗаписи);
	КонецЦикла;

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

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

Функция ПолучитьКлючиЗаписиРРПоНаборуЗаписейРР(НаборЗаписей,ИмяРР)

	Результат = Новый Массив;

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

	Для каждого Запись Из НаборЗаписей Цикл
		ЗначенияКлюча = Новый Структура;

		ЗначенияКлюча.Вставить("Регистратор", Запись.Регистратор);
		ЗначенияКлюча.Вставить("ПериодРегистрации", Запись.ПериодРегистрации);
		ЗначенияКлюча.Вставить("ВидРасчета", Запись.ВидРасчета);

		Для каждого Измерение Из МассивИзмерений Цикл
			ЗначенияКлюча.Вставить(Измерение, Запись[Измерение]);
		КонецЦикла;

		КлючЗаписи = РегистрыРасчета[ИмяРР].СоздатьКлючЗаписи(ЗначенияКлюча);

		Результат.Добавить(КлючЗаписи);
	КонецЦикла;

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

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

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