Процедура ОбойтиДеревоДляОтчетаАллюр(Дерево,Фабрика,ТекущаяФича = Неопределено,СписокСценариев = Неопределено,СписокШагов = Неопределено)
	Для каждого СтрСтроки Из Дерево.Строки Цикл
		Если      СтрСтроки.Тип = "Фича" Тогда

			GUID             = Новый УникальныйИдентификатор();
			РеальноеИмяФайла = "" + GUID +"-testsuite.xml";
			ИмяФайлаXML      = ДополнитьСлешВПуть(КаталогOutputAllure) + РеальноеИмяФайла;

			Если ОтчетВРежимеУФ Тогда
				СтруткутаДляФайлаXML = Новый Структура;
				СтруткутаДляФайлаXML.Вставить("РеальноеИмяФайла",РеальноеИмяФайла);

				ИмяФайлаXML = ПолучитьИмяВременногоФайла("xml");
			КонецЕсли;

			ЗТ = Новый ЗаписьТекста(ИмяФайлаXML, КодировкаТекста.ANSI);
			ЗТ.Закрыть();

			ВременныйФайлXML = ПолучитьИмяВременногоФайла("xml");
			ЗаписьXML = Новый ЗаписьXML;

			ЗаписьXML.ОткрытьФайл(ВременныйФайлXML);
			ЗаписьXML.ЗаписатьОбъявлениеXML();

			ТипTestSuiteResult = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "test-suite-result");
			ТекущаяФича        = Фабрика.Создать(ТипTestSuiteResult);
			ТекущаяФича.name   = СтрСтроки.Имя;

			ТипTestCasesResult = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "test-cases-result");
			СписокСценариев    = Фабрика.Создать(ТипTestCasesResult);

			ОбойтиДеревоДляОтчетаАллюр(СтрСтроки,Фабрика,ТекущаяФича,СписокСценариев,СписокШагов);

			ТекущаяФича.test_cases = СписокСценариев;

			Типlabels   = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "labels");
			СписокМеток = Фабрика.Создать(Типlabels);

			ДобавитьМетку(Фабрика,СписокМеток,"feature",СтрСтроки.Имя);
			ДобавитьМетку(Фабрика,СписокМеток,"framework","vanessa-add");
			ДобавитьМетку(Фабрика,СписокМеток,"language","1С");

			ТекущаяФича.labels = СписокМеток;

			Фабрика.ЗаписатьXML(ЗаписьXML, ТекущаяФича);
			ЗаписьXML.Закрыть();

			//делаем запись без BOM и немного преобразуем строки xml
			ЗТ = Новый ЗаписьТекста(ИмяФайлаXML,,, Истина);
			Текст = Новый ЧтениеТекста;
			Текст.Открыть(ВременныйФайлXML,"UTF-8");

			Пока Истина Цикл
				Стр = Текст.ПрочитатьСтроку();
				Если Стр = Неопределено Тогда
					Прервать;
				КонецЕсли;
				ДобавитьПрефиксAllureВСтроку(Стр);

				ЗТ.ЗаписатьСтроку(Стр);
			КонецЦикла;
			ЗТ.Закрыть();
			Текст.Закрыть();

			Если ОтчетВРежимеУФ Тогда
				ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаXML);
				СтруткутаДляФайлаXML.Вставить("ФайлXMLДвоичныеДанные",ДвоичныеДанные);
				ПараметрыОтчетаУФ.МассивXMLОтчетаAllure.Добавить(СтруткутаДляФайлаXML);

				УдалитьФайлы(ИмяФайлаXML);
			Иначе
				СделатьСообщение("Файл отчета Allure-report (" + ИмяФайлаXML + ") записан.");
			КонецЕсли;

		ИначеЕсли (СтрСтроки.Тип = "Сценарий") или (СтрСтроки.Тип = "Пример") Тогда
			Если (СтрСтроки.ДопТип = "Контекст") Тогда
				//его не надо добавлять в отчет, т.к. этот сценарий включается в каждый сценарий

			ИначеЕсли (СтрСтроки.ДопТип = "СтруктураСценария") или (СтрСтроки.Строки.Количество() = 0) Тогда
				//его не надо добавлять в отчет, т.к. этот сценарий явно не выполняется
				ОбойтиДеревоДляОтчетаАллюр(СтрСтроки,Фабрика,ТекущаяФича,СписокСценариев,СписокШагов);
			Иначе

				РезультатПрохожденияТестовСценария = ПолучитьРезультатПрохожденияТестовСценария(СтрСтроки);

				Если РезультатПрохожденияТестовСценария = Неопределено Тогда
					Продолжить;
				КонецЕсли;

				ТипTestCaseResult = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "test-case-result");
				Сценарий          = Фабрика.Создать(ТипTestCaseResult);

				ПрефиксИмениСценария = "";
				Если ДобавлятьКИмениСценарияУсловияВыгрузки Тогда
					ПрефиксИмениСценария = ПолучитьПрефиксИмениСценария();
				КонецЕсли;

				Если СтрСтроки.Тип = "Пример" Тогда
					Сценарий.name     = ПрефиксИмениСценария + СтрСтроки.Родитель.Родитель.Имя + " №" + (СтрСтроки.Родитель.Строки.Индекс(СтрСтроки));
				Иначе
					Сценарий.name     = ПрефиксИмениСценария + СтрСтроки.Имя;
				КонецЕсли;

				Сценарий.start = РезультатПрохожденияТестовСценария.ВремяНачала - РазницаВМилисекундахМеждуЮниксИНачалЭпохи;
				Сценарий.stop  = РезультатПрохожденияТестовСценария.ВремяОкончания - РазницаВМилисекундахМеждуЮниксИНачалЭпохи;

				ТипSteps    = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "steps");
				СписокШагов = Фабрика.Создать(ТипSteps);

				Если СтрСтроки.ДопТип = "СтруктураСценария" Тогда
					ОбойтиДеревоДляОтчетаАллюр(СтрСтроки,Фабрика,ТекущаяФича,СписокСценариев,СписокШагов);
				Иначе
					Для каждого СтрРезультатПрохожденияТестовШагов Из РезультатПрохожденияТестовСценария.РезультатПрохожденияТестовШагов Цикл
						ТипStep   = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "step");
						Шаг       = Фабрика.Создать(ТипStep);
						Шаг.name  = СтрРезультатПрохожденияТестовШагов.Имя;
						Шаг.title = СтрРезультатПрохожденияТестовШагов.Имя;

						Если СтрРезультатПрохожденияТестовШагов.ВремяНачала <> Неопределено Тогда
							Шаг.start = СтрРезультатПрохожденияТестовШагов.ВремяНачала - РазницаВМилисекундахМеждуЮниксИНачалЭпохи;;
							Шаг.stop  = СтрРезультатПрохожденияТестовШагов.ВремяОкончания - РазницаВМилисекундахМеждуЮниксИНачалЭпохи;;
						КонецЕсли;

						ЗаписатьСтатусВШагИлиСценарий(Шаг,СтрРезультатПрохожденияТестовШагов.Статус);

						СписокШагов.step.Добавить(Шаг);
					КонецЦикла;
				КонецЕсли;

				ЗаписатьСтатусВШагИлиСценарий(Сценарий,СтрСтроки.Статус);
				Если (СтрСтроки.Статус = "Failed") или (СтрСтроки.Статус = "Pending") Тогда
					ТипFailure            = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "failure");
					ОбъектFailure         = Фабрика.Создать(ТипFailure);
					ОбъектFailure.message = РезультатПрохожденияТестовСценария.ОписаниеОшибки;

					Сценарий.failure = ОбъектFailure;
				КонецЕсли;
				Сценарий.steps = СписокШагов;

				Если РезультатПрохожденияТестовСценария.Свойство("МассивСкриншотов") Тогда
					//значит есть скриншоты

					Типattachments    = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "attachments");
					Списокattachments = Фабрика.Создать(Типattachments);

					Для каждого СтруктураСкриншот Из РезультатПрохожденияТестовСценария.МассивСкриншотов Цикл
						Типattachment  = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "attachment");
						attachment      = Фабрика.Создать(Типattachment);

						attachment.title  = "screenshot";
						attachment.source = СтруктураСкриншот.ИмяФайла;

						Списокattachments.attachment.Добавить(attachment);
					КонецЦикла;
					Сценарий.attachments = Списокattachments;
				КонецЕсли;

				Типlabels   = Фабрика.Тип("urn:model.allure.qatools.yandex.ru", "labels");
				СписокМеток = Фабрика.Создать(Типlabels);
				ДобавитьМетку(Фабрика,СписокМеток,"story",СтрСтроки.Имя);
				Сценарий.labels = СписокМеток;

				СписокСценариев.test_case.Добавить(Сценарий);
			КонецЕсли;
		ИначеЕсли СтрСтроки.Тип = "Шаг" Тогда
			Если СтрСтроки.Родитель.ДопТип = "СтруктураСценария" Тогда
				//его не надо добавлять в отчет, т.к. этот сценарий явно не выполняется
				ОбойтиДеревоДляОтчетаАллюр(СтрСтроки,Фабрика,ТекущаяФича,СписокСценариев,СписокШагов);
			КонецЕсли;
		Иначе
			ОбойтиДеревоДляОтчетаАллюр(СтрСтроки,Фабрика,ТекущаяФича,СписокСценариев,СписокШагов);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры


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

	СоздатьКаталогКомандаСистемы(Путь);
КонецПроцедуры

&НаКлиенте

Процедура ВывестиТекстФайлаЛога(ИмяФайла)
	Текст = Новый ЧтениеТекста;
	Текст.Открыть(ИмяФайла, "UTF-8");

	Сообщить(Текст.Прочитать());

	Текст.Закрыть();
КонецПроцедуры

&НаКлиенте

Процедура СоздатьФайлыОбработок(СтруктураОписанияEpf, КаталогДляВременныхФайлов)

	ГенерироватьУФ = Объект.ГенерироватьУФ;
	КаталогИнструментов = Объект.КаталогИнструментов;
	ТекстМодуля = "";

	ТелоМодуля = СтруктураОписанияEpf.ТелоМодуля;

	ТелоМодуля = ПолучитьТелоМодуляВМассивСервер(ТелоМодуля);

	Отладка("Буду записывать " + СтруктураОписанияEpf.ВременноеИмяМодуля);

	ЗТ = Новый ЗаписьТекста(СтруктураОписанияEpf.ВременноеИмяМодуля, "UTF-8", , Ложь);
	Для Каждого СтрТелоМодуля Из ТелоМодуля Цикл
		ЗТ.ЗаписатьСтроку(СтрТелоМодуля);
	КонецЦикла;
	ЗТ.Закрыть();
	Отладка("Записал " + СтруктураОписанияEpf.ВременноеИмяМодуля);

	ПутьКИсходникам = СтруктураОписанияEpf.КаталогИсходников;

	ИмяВременногоEPF = ПолучитьПутьВременногоФайла(КаталогДляВременныхФайлов, "epf");

	ИмяОбработки = УбратьСпецсимволыИзИмениОбработки(СтруктураОписанияEpf.ИмяФичи);
	Если ЗначениеЗаполнено(СтруктураОписанияEpf.РеальноеИмяОбработки) Тогда
		ИмяОбработки = СтруктураОписанияEpf.РеальноеИмяОбработки;
	КонецЕсли;

	КорневойФайлОбработки = ПутьКИсходникам + "/" + ИмяОбработки + ".xml";

	Если НЕ СтруктураОписанияEpf.ФайлEpfПересоздавался Тогда
		СоздатьКаталогКомандаСистемы(ПутьКИсходникам + "/" + ИмяОбработки);
		КопироватьКаталогКомандаСистемы(ПутьКИсходникам + "/Обработка", ПутьКИсходникам + "/" + ИмяОбработки, КаталогДляВременныхФайлов);
		ПереместитьФайлКомандаСистемы(ПутьКИсходникам + "/Обработка.xml", КорневойФайлОбработки);

		ЗаменитьСтрокиВФайлеОсновыОбработки(ПутьКИсходникам, ИмяОбработки);
	КонецЕсли;

	ВременныйКаталогБазы = СтруктураОписанияEpf.КаталогБазы1С;
	Если Не ЗначениеЗаполнено(ВременныйКаталогБазы) Тогда
		ВременныйКаталогБазы = ПолучитьПутьВременногоФайла(КаталогДляВременныхФайлов);
		ДопСообщениеОшибки = "Файл EPF не создан. Не смог создать каталог временной базы.";
		Если Не СоздатьБазу1С(ВременныйКаталогБазы, КаталогДляВременныхФайлов, ДопСообщениеОшибки) Тогда
			Возврат; //TODO переделать СоздатьФайлыОбработок в функцию для выдачи состояния выполнения ??
		КонецЕсли;
		СтруктураОписанияEpf.КаталогБазы1С = ВременныйКаталогБазы;
	КонецЕсли;

	Если ЭтоLinux Тогда
		СтрокаЗапуска1С = "" + ДополнитьСлешВПуть(Объект.ВерсияПлатформыДляГенерацииEPF) + "1cv8 DESIGNER /F"""
			+ ВременныйКаталогБазы + """ /LoadExternalDataProcessorOrReportFromFiles """ + КорневойФайлОбработки
			+ """ """ + ИмяВременногоEPF + """";
	Иначе
		СтрокаЗапуска1С = """" + ДополнитьСлешВПуть(Объект.ВерсияПлатформыДляГенерацииEPF) + "1cv8"" DESIGNER /F """
			+ ВременныйКаталогБазы + """ /LoadExternalDataProcessorOrReportFromFiles """ + КорневойФайлОбработки
			+ """ """ + ИмяВременногоEPF + """";
	КонецЕсли;

	ОписаниеЗапуска = Запустить1С(СтрокаЗапуска1С, КаталогДляВременныхФайлов);

	ИмяФайлаЛога = ОписаниеЗапуска.ИмяФайлаЛога;
	ИмяФайлаOUT = ОписаниеЗапуска.ИмяФайлаOUT;

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

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

&НаКлиенте

Процедура СделатьGenerateEpf(СтруктураПараметров) //TODO проверить на асинхронность и работу на клиент-сервере

	ГенерироватьУФ          = СтруктураПараметров.ГенерироватьУФ;
	ШагСтрокДляМодуля       = СтруктураПараметров.ШагСтрокДляМодуля;
	DebugLog                = СтруктураПараметров.DebugLog;
	КаталогФич              = СтруктураПараметров.КаталогФич;
	КонтекстVanessaADD = СтруктураПараметров.КонтекстVanessaADD;
	КаталогиБиблиотек       = СтруктураПараметров.КаталогиБиблиотек;
	ДвДанныеvbFeatureReader = СтруктураПараметров.ДвДанныеvbFeatureReader;

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

	СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур       = СтруктураПараметров.СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур;

	ДанныеПоВерсиямОбработок = ПолучитьТаблицыПоТаблицаИзвестныхStepDefinition();

	ОписанияФайловШагов = Новый Массив;
	ПолучитьВсеСуществующиеШагиИзОбработок(КаталогФич, КаталогиБиблиотек,
		ДанныеПоВерсиямОбработок, ДополнительныеПараметры, ОписанияФайловШагов);

	ПодключитьШаги(ОписанияФайловШагов);

	МассивФич   = СтруктураПараметров.МассивФич;
	МассивШагов = СтруктураПараметров.МассивШагов;

	КаталогДляВременныхФайлов = ПолучитьИмяВременногоФайла();
	СоздатьКаталогКомандаСистемы(КаталогДляВременныхФайлов);

	КаталогБазы1С = "";
	Ном = 0;
	Для каждого ИмяФайлаФичи Из МассивФич Цикл
		Ном = Ном + 1;
		Шаги = МассивШагов.Получить(Ном - 1);

		ФайлФичи       = Новый Файл(ИмяФайлаФичи);
		ИмяТекущейФичи = ФайлФичи.ИмяБезРасширения;
		ТекстСообщения = "Работаю по фиче: %1";
		ТекстСообщения = СтрЗаменить(ТекстСообщения, "%1", ИмяФайлаФичи);
		СделатьСообщение(ТекстСообщения);

		МассивДляСозданияEpf = Новый Массив;
		ОтносительныйКаталогФичи = ФайлФичи.Путь;
		Если Найти(Прав(ОтносительныйКаталогФичи, 1), "\/") > 0 Тогда
			ОтносительныйКаталогФичи = Лев(ОтносительныйКаталогФичи, СтрДлина(ОтносительныйКаталогФичи) - 1);
		КонецЕсли;

		Отладка("ОтносительныйКаталогФичи=" + ОтносительныйКаталогФичи);
		СтруктураОписанияEpf = СоздатьСтруктураОписанияEpf(ОтносительныйКаталогФичи, ФайлФичи.ИмяБезРасширения,
			ДополнительныеПараметры, КаталогДляВременныхФайлов, КаталогБазы1С);

		СоздатьТекстМодуляНаСервере(Шаги, СтруктураОписанияEpf, ДвДанныеvbFeatureReader,
			ИмяФайлаФичи, СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур, ШагСтрокДляМодуля, ГенерироватьУФ,
			Объект.СоздаватьОбластиПриГенерацииКода);

		Если Объект.ВыводитьТекстМодуляВместоПерегенерацииEPF Тогда
			ВывестиТекстМодуляНаЭкран(СтруктураОписанияEpf);
		Иначе
			СоздатьФайлыОбработок(СтруктураОписанияEpf, КаталогДляВременныхФайлов);
		КонецЕсли;

	КонецЦикла;

	УдалитьКаталогКомандаСистемы(КаталогДляВременныхФайлов);
	СделатьСообщение("Создание epf по фичам закончено.");

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

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


Процедура ПолучитьТекстФичиИзДействийПользователя(Результат)

	ТекстРезультат = Новый ТекстовыйДокумент;
	ТекстРезультат.ДобавитьСтроку("");

	ХМЛСтрока = ЗаменитьСимволПереводаСтрокВXML(Результат);

	XML = Новый ЧтениеXML;
	XML.УстановитьСтроку(ХМЛСтрока);

	МассивОбъектов = Новый Массив(100);
	МассивСвойств  = Новый Массив(МассивОбъектов.Количество());
	ИдВМассиве     = -1;

	СчетчикДействий      = 0;
	ТаблицаСвойствСтроки = Неопределено;
	НашлиПанельРазделов  = Ложь; //надо для обхода бага, когда в логе действий пользователя нет нажатия на панель разделов

	ФлагРедактированияТекстаМакета = Ложь;

	ТекущееОкно  = "";
	ТекущаяФорма = "";
	ТекущаяТЧ    = "";
	ДанныеНажатияНаЭлементФормы = Неопределено;
	ЭтоСлужебнаяФорма1С_ВыборТипа = Ложь;
	ДобавитьПодсказкуПоПереходуКМетаданномуВСлужебнойФорма1С_ВыборТипа = Ложь;

	МассивСтруктурФорм = ПреобразоватьМассивСостояниеФормTestClient(МассивСостояниеФормTestClient);

	ЗначениеСтрокиinputText = "";
	Пока XML.Прочитать() Цикл

		ИмяУзла = XML.Имя;
		Если XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			ДобавитьУзел(МассивОбъектов, МассивСвойств, ИдВМассиве, ИмяУзла);
			Если (ИмяУзла = "gotoRow") или (ИмяУзла = "expand") или (ИмяУзла = "collapse") Тогда
				ТаблицаСвойствСтроки = Новый Массив();
			ИначеЕсли ИмяУзла = "Field" Тогда
				СвойствоСтроки = Новый Соответствие;
			КонецЕсли;
			Пока XML.ПрочитатьАтрибут() Цикл
				МассивСвойств[ИдВМассиве].Вставить(XML.Имя, XML.Значение);

				Если ИмяУзла = "Field" Тогда
					СвойствоСтроки.Вставить(XML.Имя, XML.Значение);
				КонецЕсли;
			КонецЦикла;

			Если ИмяУзла = "Form" Тогда
				ТекущаяФорма = МассивСвойств[ИдВМассиве]["title"];
				ДанныеНажатияНаЭлементФормы = Неопределено;
			ИначеЕсли ИмяУзла = "ClientApplicationWindow" Тогда
				ТекущееОкно  = МассивСвойств[ИдВМассиве]["caption"];

				Если ТекущееОкно = "Выбор типа данных" Тогда
					ЭтоСлужебнаяФорма1С_ВыборТипа = Истина;
					ДобавитьПодсказкуПоПереходуКМетаданномуВСлужебнойФорма1С_ВыборТипа = Истина;
				Иначе
					ЭтоСлужебнаяФорма1С_ВыборТипа = Ложь;
					ДобавитьПодсказкуПоПереходуКМетаданномуВСлужебнойФорма1С_ВыборТипа = Ложь;
				КонецЕсли;
				ДанныеНажатияНаЭлементФормы = Неопределено;
			ИначеЕсли ИмяУзла = "FormTable" Тогда
				ТекущаяТЧ = МассивСвойств[ИдВМассиве]["name"];
				ДанныеНажатияНаЭлементФормы = Неопределено;
			КонецЕсли;

			Если ИмяУзла = "click" Тогда
				ДанныеНажатияНаЭлементФормы = Неопределено;
				Если МассивОбъектов[ИдВМассиве - 1] = "CommandInterfaceButton" Тогда
					Если НРег(МассивСвойств[1]["isMain"]) = "true" Тогда
						Если МассивСвойств[ИдВМассиве - 2]["title"] = "Панель разделов" Тогда
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " В панели разделов я выбираю '"
								+ ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
							НашлиПанельРазделов = Истина;
						ИначеЕсли МассивСвойств[ИдВМассиве - 2]["title"] = "Панель открытых" Тогда
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " В панели открытых я выбираю '" +
								ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
						ИначеЕсли (МассивСвойств[ИдВМассиве - 2]["title"] = "Меню функций")
								Или (МассивСвойств[ИдВМассиве - 3]["title"] = "Меню функций") Тогда
							Если Не НашлиПанельРазделов Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
									+ " в xml не найдено значение клика в панели разделов. Проверьте xml, который был получен с TestClient.");
							КонецЕсли;

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

									ИмяПанелиРазделов = СокрЛП(Сред(ПредыдущаяСтрока, Поз + СтрДлина("В панели разделов я выбираю")));

									ТекстРезультат.УдалитьСтроку(ТекстРезультат.КоличествоСтрок());

									ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " В командном интерфейсе я выбираю " + ИмяПанелиРазделов +  " '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
								КонецЕсли;
							КонецЕсли;

							Если НЕ ЗаменилиПредыдущуюСтроку Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " В панели функций я выбираю '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
							КонецЕсли;

							НашлиПанельРазделов = Ложь;
						Иначе
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " Я нажимаю кнопку командного интерфейса '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
						КонецЕсли;
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " В текущем окне я нажимаю кнопку командного интерфейса '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
					КонецЕсли;

				ИначеЕсли МассивОбъектов[ИдВМассиве - 1] = "FormButton" Тогда

					ЭтоКонтекстаноеМеню = Ложь;
					ИдПоискаМеню = 2;
					Пока Истина Цикл
						Если МассивОбъектов[ИдВМассиве - ИдПоискаМеню] <> "FormGroup" Тогда
							Прервать;
						КонецЕсли;

						Если Найти(Нрег(МассивСвойств[ИдВМассиве - ИдПоискаМеню]["name"]), "контекстноеменю") > 0 Тогда
							ЭтоКонтекстаноеМеню = Истина;
							Прервать;
						КонецЕсли;

						ИдПоискаМеню = ИдПоискаМеню + 1;

						Если ИдПоискаМеню = ИдВМассиве Тогда
							Прервать;
						КонецЕсли;

					КонецЦикла;

					Если ЭтоКонтекстаноеМеню  Тогда
						ЗаголовокОбъекта = МассивСвойств[ИдВМассиве - ИдПоискаМеню - 1]["title"];
						ИмяОбъекта = """" + ЗаголовокОбъекта + """";
						Если (СокрЛП(ЗаголовокОбъекта) = "") или (ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ЗаголовокОбъекта, "ПолеФормы")) Тогда
							ИмяОбъекта = "с именем """ + МассивСвойств[ИдВМассиве - ИдПоискаМеню - 1]["name"] + """";
						КонецЕсли;

						Если ЗначениеЗаполнено(ТекущаяТЧ) Тогда
							ИмяОбъекта = "с именем """ + ТекущаяТЧ + """";
						КонецЕсли;

						ЗаголовокКнопки = МассивСвойств[ИдВМассиве - 1]["title"];
						ИмяКнопки       = """" + ЗаголовокКнопки + """";
						Если (СокрЛП(ЗаголовокКнопки) = "") или (ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ЗаголовокКнопки, "Кнопка")) Тогда
							ИмяКнопки = "с именем '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "'";
						КонецЕсли;

						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я выбираю пункт контекстного меню " + ИмяКнопки + " на элементе формы " + ИмяОбъекта);
						//И я выбираю пункт контекстного меню "ПунктМеню" на элементе формы с именем "ЭлементФормы"
					Иначе
						ДобавитьКомментарийПодсказкуПоВыборуМетаданныхИзФормыВыбораТипа(
							ДобавитьПодсказкуПоПереходуКМетаданномуВСлужебнойФорма1С_ВыборТипа, СчетчикДействий, ТекстРезультат,
							ЭтоСлужебнаяФорма1С_ВыборТипа);

						ЗаголовокОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						ИмяОбъекта = "'" + ЗаголовокОбъекта + "'";
						Если (СокрЛП(ЗаголовокОбъекта) = "")
								Или (ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма,
									ЗаголовокОбъекта, "Кнопка")) Тогда
							ИмяОбъекта = "с именем '"
								+ ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "'";
						КонецЕсли;

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

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

							Если ЗаголовокОбъекта = "Провести и закрыть"
								Или  ЗаголовокОбъекта = "Записать и закрыть"
								Или  ЗаголовокОбъекта = "Post and close"
								Или  ЗаголовокОбъекта = "Save and close"
								Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я жду закрытия окна '" + ТекущееОкно + "' в течение 20 секунд");
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;

				ИначеЕсли (МассивОбъектов[ИдВМассиве - 1] = "FormField") или (МассивОбъектов[ИдВМассиве - 1] = "FormDecoration") Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) <> "" и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю на гиперссылку """ + ИмяОбъекта + """");
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю на гиперссылку с именем """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "gotoDate" Тогда
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " у поля '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "' я перехожу к дате " + ПреобразоватьСтрокуКДатеИзДанныхXML(МассивСвойств[ИдВМассиве]["date"]));
			ИначеЕсли ИмяУзла = "selectAllRows" Тогда
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я выделяю все строки");
			ИначеЕсли ИмяУзла = "gotoFirstRow" Тогда
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я перехожу к первой строке");
			ИначеЕсли ИмяУзла = "gotoLastRow" Тогда
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я перехожу к последней строке");
			ИначеЕсли ИмяУзла = "deleteRow" Тогда
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я удаляю строку");
			ИначеЕсли ИмяУзла = "close" Тогда
				НадоДобавитьДействие = Истина;
				Если ДанныеНажатияНаЭлементФормы <> Неопределено Тогда
					Если ДанныеНажатияНаЭлементФормы.ТекущееОкно = ТекущееОкно Тогда
						Если ДанныеНажатияНаЭлементФормы.ИмяКнопки = "Провести и закрыть" Тогда
							НадоДобавитьДействие = Ложь;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				Если НадоДобавитьДействие Тогда
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " Я закрываю окно '" + МассивСвойств[ИдВМассиве - 1]["caption"] + "'");
				КонецЕсли;
			ИначеЕсли ИмяУзла = "choose" Тогда
				Если ТекущаяТЧ <> "" Тогда
					ДобавитьКомментарийПодсказкуПоВыборуМетаданныхИзФормыВыбораТипа(
						ДобавитьПодсказкуПоПереходуКМетаданномуВСлужебнойФорма1С_ВыборТипа, СчетчикДействий, ТекстРезультат,
						ЭтоСлужебнаяФорма1С_ВыборТипа);

					Если ЭтоСлужебнаяФорма1С_ВыборТипа Тогда
						ДобавляемаяСтрока = " В форме ""Выбор типа данных"" в ТЧ """ + ТекущаяТЧ + " я выбираю текущую строку";
					Иначе
						ДобавляемаяСтрока = " в таблице """ + ТекущаяТЧ + """ я выбираю текущую строку";
					КонецЕсли;
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + ДобавляемаяСтрока);
				КонецЕсли;
			ИначеЕсли ИмяУзла = "startChoosing" Тогда
				Если ТекущаяТЧ <> "" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) = "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я нажимаю кнопку выбора у реквизита с именем """ + ИмяОбъекта + """");
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я нажимаю кнопку выбора у реквизита """ + ИмяОбъекта + """");
					КонецЕсли;
				Иначе
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если (СокрЛП(ИмяОбъекта) <> "") и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю кнопку выбора у поля """ + ИмяОбъекта + """");
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю кнопку выбора у поля с именем """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "clear" Тогда
				ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];

				Если ТекущаяТЧ <> "" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) = "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я нажимаю кнопку очистить у поля с именем """ + ИмяОбъекта + """");
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я нажимаю кнопку очистить у поля """ + ИмяОбъекта + """");
					КонецЕсли;
				Иначе
					Если (СокрЛП(ИмяОбъекта) <> "") и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю кнопку очистить у поля """ + ИмяОбъекта + """");
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю кнопку очистить у поля с именем """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "endEditRow" Тогда
				Если ТекущаяТЧ <> "" Тогда
					Если МассивСвойств[ИдВМассиве]["cancel"] = "false" Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я завершаю редактирование строки");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "addRow" Тогда
				Если ТекущаяТЧ <> "" Тогда
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я добавляю новую строку");
				КонецЕсли;
			ИначеЕсли ИмяУзла = "open" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) <> "" и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю на кнопку открытия поля """ + ИмяОбъекта + """");
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю на кнопку открытия поля с именем """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "create" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) <> "" и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю на кнопку создать поля """ + ИмяОбъекта + """");
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я нажимаю на кнопку создать поля с именем """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "openDropList" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) <> "" и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "executeChoiceFromChoiceList" Тогда
				ЗначениеВыбораИзСписка = МассивСвойств[ИдВМассиве]["presentation"];
				ТипВыбораЗначенияИзСписка = "точное значение";

				ВПредыдущейСтрокеСценарияЕстьВВодПоСтроке = Ложь;
				ПредыдущаяСтрока = "";
				Если ТекстРезультат.КоличествоСтрок() > 0 Тогда
					ПредыдущаяСтрока = ТекстРезультат.ПолучитьСтроку(ТекстРезультат.КоличествоСтрок());
				КонецЕсли;

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

				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					ТекстРезультат.ДобавитьСтроку("	# Возможны проблемы при использовании точного выбора, т.к. подобный ""быстрый выбор"" актуален только для текущей базы и вашего пользователя.");
					ТекстРезультат.ДобавитьСтроку("	# подробнее в FAQ - Можно ли использовать быстрый выбор из списков 1С в полях ссылочных реквизитов");

					Если ТекущаяТЧ <> "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						ЕстьДубли  = ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы");
						Если СокрЛП(ИмяОбъекта) = "" или ЕстьДубли Тогда
							ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ТекущаяТЧ + """ из выпадающего списка с именем """ + ИмяОбъекта
								+ """ я выбираю " + ТипВыбораЗначенияИзСписка + " '" + ЗначениеВыбораИзСписка + "'");
						Иначе
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ТекущаяТЧ + """ из выпадающего списка """ + ИмяОбъекта
								+ """ я выбираю " + ТипВыбораЗначенияИзСписка + " '" + ЗначениеВыбораИзСписка + "'");
						КонецЕсли;
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						Если СокрЛП(ИмяОбъекта) <> "" И
							Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы") Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
									+ " из выпадающего списка """ + ИмяОбъекта + """ я выбираю "
									+ ТипВыбораЗначенияИзСписка + " '" + ЗначениеВыбораИзСписка + "'");
						Иначе
							ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " из выпадающего списка с именем """ + ИмяОбъекта + """ я выбираю "
								+ ТипВыбораЗначенияИзСписка + " '" + ЗначениеВыбораИзСписка + "'");
						КонецЕсли;
					КонецЕсли;
				Иначе
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
						+ " из выпадающего списка я выбираю '" + ЗначениеВыбораИзСписка + "'");
				КонецЕсли;

			ИначеЕсли ИмяУзла = "increaseValue" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					Если ТекущаяТЧ <> "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						Если СокрЛП(ИмяОбъекта) = "" Тогда
							ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ТекущаяТЧ + """ в поле с именем """ + ИмяОбъекта
								+ """ я увеличиваю значение");
						Иначе
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ТекущаяТЧ + """ в поле """ + ИмяОбъекта
								+ """ я увеличиваю значение");
						КонецЕсли;
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						Если СокрЛП(ИмяОбъекта) <> "" И
							Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы") Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
									+ " в поле """ + ИмяОбъекта + """ я увеличиваю значение");
						Иначе
							ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в поле с именем """ + ИмяОбъекта + """ я увеличиваю значение");
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;

			ИначеЕсли ИмяУзла = "decreaseValue" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					Если ТекущаяТЧ <> "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						Если СокрЛП(ИмяОбъекта) = "" Тогда
							ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ТекущаяТЧ + """ в поле с именем """ + ИмяОбъекта
								+ """ я уменьшаю значение");
						Иначе
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ТекущаяТЧ + """ в поле """ + ИмяОбъекта + """ я уменьшаю значение");
						КонецЕсли;
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
						Если СокрЛП(ИмяОбъекта) <> "" И
							Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы") Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
									+ " в поле """ + ИмяОбъекта + """ я уменьшаю значение");
						Иначе
							ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в поле с именем """ + ИмяОбъекта + """ я уменьшаю значение");
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;

			ИначеЕсли ИмяУзла = "executeChoiceFromDropList" Тогда
				ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
				ЕстьДубли  = ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы");

				Если ТекущаяТЧ <> "" Тогда
					Если СокрЛП(ИмяОбъекта) = "" или ЕстьДубли Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я выбираю значение реквизита с именем """ + ИмяОбъекта + """ из формы списка");
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я выбираю значение реквизита """ + ИмяОбъекта + """ из формы списка");
					КонецЕсли;
				Иначе
					Если СокрЛП(ИмяОбъекта) <> "" и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы")) Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я выбираю значение реквизита """ + ИмяОбъекта + """ из формы списка");
					Иначе
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я выбираю значение реквизита с именем """ + ИмяОбъекта + """ из формы списка");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "activate" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormGroup" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					ИмяГруппы   = МассивСвойств[ИдВМассиве - 1]["name"];

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

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

			ИначеЕсли ИмяУзла = "expand" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormGroup" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) = "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						УдалитьПредыдущуюСтрокуЕслиЕстьСовпадения(ТекстРезультат, " я перехожу к закладке", ИмяОбъекта);

						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я разворачиваю группу с именем """ + ИмяОбъекта + """");
					Иначе

						УдалитьПредыдущуюСтрокуЕслиЕстьСовпадения(ТекстРезультат, " я перехожу к закладке", ИмяОбъекта);

						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я разворачиваю группу """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;

			ИначеЕсли ИмяУзла = "collapse" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormGroup" Тогда
					ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["title"];
					Если СокрЛП(ИмяОбъекта) = "" Тогда
						ИмяОбъекта = МассивСвойств[ИдВМассиве - 1]["name"];
						УдалитьПредыдущуюСтрокуЕслиЕстьСовпадения(ТекстРезультат, " я перехожу к закладке", ИмяОбъекта);

						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я сворачиваю группу с именем """ + ИмяОбъекта + """");
					Иначе

						УдалитьПредыдущуюСтрокуЕслиЕстьСовпадения(ТекстРезультат, " я перехожу к закладке", ИмяОбъекта);

						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я сворачиваю группу """ + ИмяОбъекта + """");
					КонецЕсли;
				КонецЕсли;

			ИначеЕсли ИмяУзла = "goOneLevelDown" Тогда
				Если ТекущаяТЧ <> "" Тогда
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице  """ + ТекущаяТЧ + """ я перехожу на один уровень вниз");
				КонецЕсли;
			ИначеЕсли ИмяУзла = "gotoPreviousRow" Тогда
				Если ТекущаяТЧ <> "" Тогда
					switchSelection = Ложь;
					Если МассивСвойств[ИдВМассиве]["switchSelection"] = "true" Тогда
						switchSelection = Истина;
					КонецЕсли;

					Если switchSelection Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице  """ + ТекущаяТЧ + """ я перехожу на одну строку вверх с выделением");
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице  """ + ТекущаяТЧ + """ я перехожу на одну строку вверх");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "gotoNextRow" Тогда
				Если ТекущаяТЧ <> "" Тогда
					switchSelection = Ложь;
					Если МассивСвойств[ИдВМассиве]["switchSelection"] = "true" Тогда
						switchSelection = Истина;
					КонецЕсли;

					Если switchSelection Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице  """ + ТекущаяТЧ + """ я перехожу на одну строку вниз с выделением");
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице  """ + ТекущаяТЧ + """ я перехожу на одну строку вниз");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "goOneLevelUp" Тогда
				Если ТекущаяТЧ <> "" Тогда
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице  """ + ТекущаяТЧ + """ я перехожу на один уровень вверх");
				КонецЕсли;
			ИначеЕсли ИмяУзла = "selectOption" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					Если СокрЛП(МассивСвойств[ИдВМассиве - 1]["title"]) <> "" Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я меняю значение переключателя '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "' на '" + МассивСвойств[ИдВМассиве]["presentation"] + "'");
					Иначе
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я меняю значение переключателя с именем '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' на '" + МассивСвойств[ИдВМассиве]["presentation"] + "'");
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "beginEditingCurrentArea" Тогда
				ФлагРедактированияТекстаМакета = Истина;
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в табличном документе '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я делаю двойной клик на текущей ячейке");
			ИначеЕсли ИмяУзла = "finishEditingCurrentArea" Тогда
				ФлагРедактированияТекстаМакета = Ложь;
			ИначеЕсли ИмяУзла = "setCurrentArea" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					ПредыдущаяСтрока = "";
					Если ТекстРезультат.КоличествоСтрок() > 0 Тогда
						ПредыдущаяСтрока = ТекстРезультат.ПолучитьСтроку(ТекстРезультат.КоличествоСтрок());
					КонецЕсли;
					ТекущаяСтрока = ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в табличном документе '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я перехожу к ячейке """ + МассивСвойств[ИдВМассиве]["area"] + """";
					Если ТекущаяСтрока <> ПредыдущаяСтрока Тогда
						//чтобы не добавлять одинаковых шагов
						ТекстРезультат.ДобавитьСтроку(ТекущаяСтрока);
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "inputText" Тогда
				АктивныйЭлемент = МассивОбъектов[ИдВМассиве - 1];
				Если АктивныйЭлемент = "FormField" Или АктивныйЭлемент = "Form" Тогда

					Если ФлагРедактированияТекстаМакета Тогда
						ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в табличный документ """ + МассивСвойств[ИдВМассиве - 2]["name"] + """ я ввожу текст " + ПолучитьКорректноеПредставлениеСтроковогоЗначенияПоля("'" + МассивСвойств[ИдВМассиве]["text"] + "'"));
					Иначе
						ЗаголовокПоля = МассивСвойств[ИдВМассиве - 1]["title"];
						Если ТекущаяТЧ <> "" Тогда
							Если СокрЛП(ЗаголовокПоля) <> "" Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ в поле '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "' я ввожу текст " + ПолучитьКорректноеПредставлениеСтроковогоЗначенияПоля("'" + МассивСвойств[ИдВМассиве]["text"] + "'"));
							Иначе
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ в поле с именем '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я ввожу текст " + ПолучитьКорректноеПредставлениеСтроковогоЗначенияПоля("'" + МассивСвойств[ИдВМассиве]["text"] + "'"));
							КонецЕсли;
						Иначе
							Если (СокрЛП(ЗаголовокПоля) <> "") и (Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ЗаголовокПоля, "ПолеФормы")) Тогда
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в поле '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "' я ввожу текст " + ПолучитьКорректноеПредставлениеСтроковогоЗначенияПоля("'" + МассивСвойств[ИдВМассиве]["text"] + "'"));
							Иначе
								ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в поле с именем '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "' я ввожу текст " + ПолучитьКорректноеПредставлениеСтроковогоЗначенияПоля("'" + МассивСвойств[ИдВМассиве]["text"] + "'"));
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
					ЗначениеСтрокиinputText = ПолучитьКорректноеПредставлениеСтроковогоЗначенияПоля(МассивСвойств[ИдВМассиве]["text"]);
				КонецЕсли;
			ИначеЕсли ИмяУзла = "setCheck" Тогда
				Если МассивОбъектов[ИдВМассиве - 1] = "FormField" Тогда
					Если ТекущаяТЧ <> "" Тогда
						Если СокрЛП(МассивСвойств[ИдВМассиве - 1]["title"]) <> "" Тогда
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я изменяю флаг '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
						Иначе
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " в таблице """ + ТекущаяТЧ + """ я изменяю флаг с именем '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "'");
						КонецЕсли;
					Иначе
						Если СокрЛП(МассивСвойств[ИдВМассиве - 1]["title"]) <> "" Тогда
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я изменяю флаг '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["title"]) + "'");
						Иначе
							ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я изменяю флаг с именем '" + ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]) + "'");
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ИмяУзла = "ClientApplicationWindow" Тогда
				ИмяОкна = МассивСвойств[ИдВМассиве]["caption"];
				Если ИмяОкна <> Неопределено Тогда
					ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий, "ОткрытиеОкна") + " открылось окно '" + ИмяОкна + "'");
				КонецЕсли;
			ИначеЕсли ИмяУзла = "gotoNextItem" Тогда
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я перехожу к следующему реквизиту");

			ИначеЕсли ИмяУзла = "executeChoiceFromMenu" Тогда
				ЗначениеМеню = МассивСвойств[ИдВМассиве]["presentation"];
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я выбираю пункт меню '" + ЗначениеМеню + "'");
			ИначеЕсли ИмяУзла = "executeChoiceFromList" Тогда
				ЗначениеМеню = МассивСвойств[ИдВМассиве]["presentation"];
				ТекстРезультат.ДобавитьСтроку(ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + " я выбираю из списка '" + ЗначениеМеню + "'");

			ИначеЕсли ИмяУзла = "clickFormattedStringHyperlink" Тогда
				ПредыдущееСвойство = МассивСвойств[ИдВМассиве - 1];
				ИмяОбъекта     = ПредыдущееСвойство["title"];
				ИмяГиперссылки = МассивСвойств[ИдВМассиве]["title"];

				Если СокрЛП(ИмяОбъекта) <> "" И Не ЕстьДублиЗаголовковУПоля(МассивСтруктурФорм, ТекущаяФорма, ИмяОбъекта, "ПолеФормы") Тогда
					ТекстШага = "%1 у поля ""%2"" я нажимаю гиперссылку '%3'";
				Иначе
					ИмяОбъекта = ПредыдущееСвойство["name"];
					ТекстШага = "%1 у поля с именем ""%2"" я нажимаю гиперссылку '%3'";
				КонецЕсли;
				ТекстРезультат.ДобавитьСтроку(СтрШаблон_(ТекстШага, ПолучитьПервоеКлючевоеСлово(СчетчикДействий), ИмяОбъекта, ИмяГиперссылки));
			КонецЕсли;
		КонецЕсли;

		Если XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
			Если ИмяУзла = "Form" Тогда
				ТекущаяФорма = "";
			ИначеЕсли ИмяУзла = "ClientApplicationWindow" Тогда
				ТекущееОкно = "";
			ИначеЕсли ИмяУзла = "FormTable" Тогда
				ТекущаяТЧ = "";
			КонецЕсли;

			Если ТекущаяТЧ <> "" Тогда
				Если (ИмяУзла = "gotoRow") или (ИмяУзла = "expand") или (ИмяУзла = "collapse") Тогда
					ЕстьСтрокиТаблицы = ТаблицаСвойствСтроки.Количество() > 0;
					Если ЕстьСтрокиТаблицы Тогда
						Стр1 = "| ";
						Для каждого СвойствоСтроки Из ТаблицаСвойствСтроки Цикл
							Если СокрЛП(СвойствоСтроки["cellText"]) = "" Тогда
								Продолжить;
							КонецЕсли;
							Стр1 = Стр1 + ЗначениеДляТаблицыГеркин(СвойствоСтроки["title"]);
						КонецЦикла;

						Стр2 = "| ";

						Для каждого СвойствоСтроки Из ТаблицаСвойствСтроки Цикл
							Если СокрЛП(СвойствоСтроки["cellText"]) = "" Тогда
								Продолжить;
							КонецЕсли;
							Стр2 = Стр2 + ЗначениеДляТаблицыГеркин(СвойствоСтроки["cellText"]);
						КонецЦикла;

						МассивТаблицы = Новый Массив();
						МассивТаблицы.Добавить(Стр1);
						МассивТаблицы.Добавить(Стр2);

						ФорматироватьТаблицуGherkin(МассивТаблицы);

						Стр = "		" + МассивТаблицы[0] + Символы.ПС + "		" + МассивТаблицы[1];
					КонецЕсли;

					ДобавляемыйШаг = "";
					ДобавлятьПодсказкуПриВыбореТекущегоШагаЕслиНетСтрокТаблицы = Не ЕстьСтрокиТаблицы;
					ИмяТаблицы = ЭкранироватьСпецСимволыДляЗначенияШага(МассивСвойств[ИдВМассиве - 1]["name"]);
					Если ИмяУзла = "gotoRow" Тогда
						ДобавляемаяСтрока = " в таблице """ + ИмяТаблицы +  """ я перехожу к строке:";
						Если ЭтоСлужебнаяФорма1С_ВыборТипа Тогда
							ДобавляемаяСтрока = " В форме ""Выбор типа данных""" + ДобавляемаяСтрока;
							ДобавитьПодсказкуПоПереходуКМетаданномуВСлужебнойФорма1С_ВыборТипа = Ложь;
							ДобавлятьПодсказкуПриВыбореТекущегоШагаЕслиНетСтрокТаблицы = Ложь;

						КонецЕсли;
						ДобавляемыйШаг = ПолучитьПервоеКлючевоеСлово(СчетчикДействий) + ДобавляемаяСтрока;
					ИначеЕсли ИмяУзла = "expand" Тогда
						Если ЕстьСтрокиТаблицы Тогда
							ДобавляемыйШаг = ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ИмяТаблицы +  """ я разворачиваю строку:";
						Иначе
							ДобавляемыйШаг = ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
								+ " в таблице """ + ИмяТаблицы +  """ я разворачиваю текущую строку";
							ДобавлятьПодсказкуПриВыбореТекущегоШагаЕслиНетСтрокТаблицы = Ложь;
						КонецЕсли;
					ИначеЕсли ИмяУзла = "collapse" Тогда
						ДобавляемыйШаг = ПолучитьПервоеКлючевоеСлово(СчетчикДействий)
							+ " в таблице """ + ИмяТаблицы +  """ я сворачиваю строку:";
					КонецЕсли;
					Если ДобавляемыйШаг <> "" Тогда
						ПредыдущаяСтрока = "";
						Если ТекстРезультат.КоличествоСтрок() > 0 Тогда
							ПредыдущаяСтрока = ТекстРезультат.ПолучитьСтроку(ТекстРезультат.КоличествоСтрок());
							// если есть таблица выше, считаем, что есть выбор\переход к нужной строки и подсказку можно не показывать
							Если Прав(СокрП(ПредыдущаяСтрока), 1) = "|" Тогда
								ДобавлятьПодсказкуПриВыбореТекущегоШагаЕслиНетСтрокТаблицы = Ложь;
							КонецЕсли;
						КонецЕсли;

						Если ДобавлятьПодсказкуПриВыбореТекущегоШагаЕслиНетСтрокТаблицы Тогда
							ТекстРезультат.ДобавитьСтроку("	# ВНИМАНИЕ: использование текущей строки без перехода к конкретной строке таблицы может быть ошибочным");
							ТекстРезультат.ДобавитьСтроку("	# Используйте исследователь формы или кнопки получения состояния формы\текущего элемента подменю ""Форма"" на закладке ""Работа с UI"" ");
							ТекстРезультат.ДобавитьСтроку("	# Ниже пример шага для выбора правильной строки таблицы");
							ТекстРезультат.ДобавитьСтроку("	# " + ДобавляемыйШаг);
							ТекстРезультат.ДобавитьСтроку("	#   | Колонка1  | Колонка2  |");
							ТекстРезультат.ДобавитьСтроку("	#   | Значение1 | Значение2 |");
						Иначе
							ТекстРезультат.ДобавитьСтроку(ДобавляемыйШаг);
							ТекстРезультат.ДобавитьСтроку(Стр);
						КонецЕсли;
					КонецЕсли;

				ИначеЕсли ИмяУзла = "Field" Тогда
					ТаблицаСвойствСтроки.Добавить(СвойствоСтроки);
				КонецЕсли;
			КонецЕсли;

			УдалитьУзел(МассивОбъектов, МассивСвойств, ИдВМассиве);
		КонецЕсли;
	КонецЦикла;
	XML.Закрыть();

	ТекстРезультатКод = Новый ТекстовыйДокумент;

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

	ТекстРезультат.ВставитьСтроку(1, "#language: ru
	|
	|Функционал: <описание фичи>
	|
	|Как <Роль>
	|Я хочу <описание функционала>
	|Чтобы <бизнес-эффект>
	|
	|Контекст:
	|	Дано Я запускаю сценарий открытия TestClient или подключаю уже существующий
	|
	|
	|Сценарий: <описание сценария>");

	Объект.СгенерированныйСценарий = ТекстРезультат.ПолучитьТекст();

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

&НаКлиенте


Процедура ИнициализироватьИндикаторВыполнения(Знач КоличествоТестовыхМетодов = 0)
	ЭлементыФормы.ИндикаторВыполнения.МаксимальноеЗначение = КоличествоТестовыхМетодов;
	ЭлементыФормы.ИндикаторВыполнения.Значение = 0;
	ЭлементыФормы.ИндикаторВыполнения.ЦветРамки = Новый Цвет(0, 174, 0); // Зеленый
КонецПроцедуры

// { работа с настройками

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

	Если ВыбранныеФайлы = Неопределено или ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	ФайлНастройки = ВыбранныеФайлы.Получить(0);
	ПутьФайлаНастроек = ФайлНастройки;

	ПлагинНастроек = Плагин("Настройки");
	ПлагинНастроек.Обновить();

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

Процедура ПерезагрузитьНастройкиИзФайла()

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

		Попытка
			ПервичнаяНастройка();
			//Плагин("Настройки").Обновить();
		Исключение
			Сообщить("Не удалось загрузить настройки из файла '" + ПутьФайлаНастроек() + "' по причине: ");
			Сообщить(ОписаниеОшибки());
		КонецПопытки;

	КонецЕсли;

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

Процедура ПервичнаяНастройка()

	Перем ПлагинВыводВЛогФайл, ПлагинНастроек;

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

	НаборНастроекПоУмолчанию = СоздатьНаборНастроекПоУмолчанию();
	ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Настройки, НаборНастроекПоУмолчанию);

	ПлагинНастроек = Плагин("Настройки");
	ПлагинНастроек.Обновить();

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

	ФлагОтладки = ПлагинНастроек.ПолучитьНастройку("Отладка") = Истина;

	ПервичнаяНастройкаЛогаВыполнения(ПлагинНастроек);

	ИсключатьПропускаемыеТестыИзСписка = ЗначениеНастройки("ИсключатьПропускаемыеТестыИзСписка", Ложь, ПлагинНастроек);
	Отладка(СтрШаблон_("ИсключатьПропускаемыеТестыИзСписка <%1>", ИсключатьПропускаемыеТестыИзСписка));

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

Функция СоздатьНаборНастроекПоУмолчанию()

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

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

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

КонецФункции // ()

Процедура ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Знач Настройки, Знач НаборНастроекПоУмолчанию)

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

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

Процедура ПервичнаяНастройкаЛогаВыполнения(Знач ПлагинНастроек)

	Перем ПлагинВыводВЛогФайл;

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

	Если ВыводитьЛогВыполненияСценариевВТекстовыйФайл Тогда

		ПлагинВыводВЛогФайл = Плагин("ВыводВЛогФайл");

		ПлагинВыводВЛогФайл.ОткрытьФайл(ИмяФайлаЛогВыполненияСценариев);
	КонецЕсли;

	Отладка(СтрШаблон_("ВыводитьЛогВыполненияСценариевВТекстовыйФайл <%1>", ВыводитьЛогВыполненияСценариевВТекстовыйФайл));
	Отладка(СтрШаблон_("ИмяФайлаЛогВыполненияСценариев <%1>", ИмяФайлаЛогВыполненияСценариев));

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

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

// } работа с настройками


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

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

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

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

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯРаботаюСVanessa_ADDepf()","ЯРаботаюСVanessa_ADDepf","я работаю с bddRunner.epf");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯРаботаюСbddRunnerepf()","ЯРаботаюСVanessa_ADDepf","я работаю с bddRunner.epf");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯМогуОткрытьФормуОбработки()","ЯМогуОткрытьФормуОбработки","я могу открыть форму обработки");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯМогуЗакрытьФормуОбработки()","ЯМогуЗакрытьФормуОбработки","я могу закрыть форму обработки");

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

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

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

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

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

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

	Форма = НовыйЭкземпляр.ПолучитьФорму("Форма");
	Ванесса.ПроверитьРавенство(Форма.Открыта(),Ложь,"Мы должны были получить новый экземпляр формы.");
	Контекст.Вставить("ОткрытаяФормаVanessaADD",Форма);
КонецПроцедуры

//я могу открыть форму обработки
//@ЯМогуОткрытьФормуОбработки()
Процедура ЯМогуОткрытьФормуОбработки() Экспорт
	ОткрытаяФормаVanessaADD = Контекст.ОткрытаяФормаVanessaADD;
	ОткрытаяФормаVanessaADD.Открыть();

	Ванесса.ПроверитьРавенство(ОткрытаяФормаVanessaADD.Открыта(),Истина,"Форма vanessa-add открылась.");
КонецПроцедуры

//я могу закрыть форму обработки
//@ЯМогуЗакрытьФормуОбработки()
Процедура ЯМогуЗакрытьФормуОбработки() Экспорт
	ОткрытаяФормаVanessaADD = Контекст.ОткрытаяФормаVanessaADD;
	ОткрытаяФормаVanessaADD.Закрыть();

	Ванесса.ПроверитьРавенство(ОткрытаяФормаVanessaADD.Открыта(),Ложь,"Форма vanessa-add закрылась.");
КонецПроцедуры


&НаКлиенте
Перем СчетчикТаймера,МаксСчетчиктаймера;

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

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

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

	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯОткрылВБраузереСайт(Парам01Строка)","ЯОткрылВБраузереСайт","Я открыл в браузере сайт ""https://www.sourcetreeapp.com/""");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯНажалНаКнопкуDownloadНаСайтеSourcetree()","ЯНажалНаКнопкуDownloadНаСайтеSourcetree","Я нажал на кнопку Download на сайте sourcetree");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯНажалНаКнопкуDownloadНаСайтеGit()","ЯНажалНаКнопкуDownloadНаСайтеGit","Я нажал на кнопку Download на сайте git");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯНажимаюНаКнопкуDownloadPython3x()","ЯНажимаюНаКнопкуDownloadPython3x","Я нажимаю на кнопку Download Python 3x");
	Ванесса.ДобавитьШагВМассивТестов(ВсеТесты,"ЯНажимаюНаКнопкуСохранить()","ЯНажимаюНаКнопкуСохранить","Я нажимаю на кнопку Сохранить");

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

&НаКлиенте
Процедура ПередНачаломСценария() Экспорт
	Если НЕ БраузерПринудительноЗакрывался Тогда
		БраузерПринудительноЗакрывался = Истина;
		СтрокаКоманды = "TASKKILL /F /IM chrome.exe";
		КомандаСистемы(СтрокаКоманды);

		ОткрытьСайт("https://github.com/vanessa-opensource/add");

		Попытка
			Оболочка = Новый COMОбъект("Shell.Application");
			Оболочка.MinimizeAll();
		Исключение
			ВызватьИсключение "Не удалось подключить COM объект <Shell.Application>";
		КонецПопытки;

	КонецЕсли;
КонецПроцедуры

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

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

&НаКлиенте
Процедура УдалитьСкаченныеФайлыПоМаске(Маска)
	WSH         = Новый COMobject("wscript.shell");
	USERPROFILE = WSH.ExpandEnvironmentStrings("%USERPROFILE%");

	ГдеИскать = USERPROFILE + "\Downloads";

	Файлы = НайтиФайлы(ГдеИскать,Маска,Ложь);
	Для каждого Файл Из Файлы Цикл
		Сообщить("Удаляю файл: " + Файл.ПолноеИмя);
		УдалитьФайлы(Файл.ПолноеИмя);
	КонецЦикла;
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОткрытьСайт(Адрес)
	Стр = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"" """ + Адрес + """ -start-maximized";
	ЗапуститьПриложение(Стр);
КонецПроцедуры

&НаСервере
Процедура ПроверитьИстину()
	юТест = ВнешниеОбработки.Создать(ЮнитТестированиеИмя);
	юТест.Проверить(Истина, "Ошибка проверки");
КонецПроцедуры

&НаКлиенте
//Я открыл в браузере сайт "https://www.sourcetreeapp.com/"
//@ЯОткрылВБраузереСайт(Парам01Строка)
Процедура ЯОткрылВБраузереСайт(АдресСайта) Экспорт
	ПроверитьИстину();
	ОткрытьСайт(АдресСайта);

	Ванесса.ЗапретитьВыполнениеШагов();
	ПодключитьОбработчикОжидания("ТаймерОжидания",2);

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

&НаКлиенте
Функция ПолучитьСтрокуВызоваSikuli()
	Возврат """C:\Program Files (x86)\Java\jre6\bin\java.exe"" -Xms64M -Xmx512M -Dfile.encoding=UTF-8 -Dpython.path=""C:\Program Files (x86)\Sikuli X\sikuli-script.jar/"" -jar ""C:\Program Files (x86)\Sikuli X\sikuli-ide.jar"" -r ";
КонецФункции

&НаКлиенте
//Я нажал на кнопку Download на сайте sourcetree
//@ЯНажалНаКнопкуDownloadНаСайтеSourcetree()
Процедура ЯНажалНаКнопкуDownloadНаСайтеSourcetree() Экспорт
	УдалитьСкаченныеФайлыПоМаске("SourceTreeSetup*.exe");

	Команда = ПолучитьСтрокуВызоваSikuli() + Ванесса.Объект.КаталогИнструментов + "\tools\Sikuli\SourceTree.sikuli";
	Рез = Ванесса.ВыполнитьКомандуОСБезПоказаЧерногоОкна(Команда);
	Ванесса.ПроверитьРавенство(Рез,0,"Был клик на кнопку большую синюю кнопку ""Скачать"".");

	Ванесса.ЗапретитьВыполнениеШагов();
	ПодключитьОбработчикОжидания("ТаймерОжидания",3);
КонецПроцедуры

&НаКлиенте
//Я нажал на кнопку Download на сайте git
//@ЯНажалНаКнопкуDownloadНаСайтеGit()
Процедура ЯНажалНаКнопкуDownloadНаСайтеGit() Экспорт
	УдалитьСкаченныеФайлыПоМаске("GIT*.exe");

	Команда = ПолучитьСтрокуВызоваSikuli() + Ванесса.Объект.КаталогИнструментов + "\tools\Sikuli\Git.sikuli";
	Рез = Ванесса.ВыполнитьКомандуОСБезПоказаЧерногоОкна(Команда);
	Ванесса.ПроверитьРавенство(Рез,0,"Был клик на кнопку ""Скачать"".");

	Ванесса.ЗапретитьВыполнениеШагов();
	ПодключитьОбработчикОжидания("ТаймерОжидания",3);
КонецПроцедуры

&НаКлиенте
//Я нажимаю на кнопку Сохранить
//@ЯНажимаюНаКнопкуСохранить()
Процедура ЯНажимаюНаКнопкуСохранить() Экспорт

	Команда = ПолучитьСтрокуВызоваSikuli() + Ванесса.Объект.КаталогИнструментов + "\tools\Sikuli\ClickSaveFF.sikuli";
	Рез = Ванесса.ВыполнитьКомандуОСБезПоказаЧерногоОкна(Команда);
	Ванесса.ПроверитьРавенство(Рез,0,"Был клик на кнопку ""Сохранить"" firefox.");

	Ванесса.ЗапретитьВыполнениеШагов();
	ПодключитьОбработчикОжидания("ТаймерОжидания",2);
КонецПроцедуры

&НаКлиенте
//Я нажимаю на кнопку Download Python 3x
//@ЯНажимаюНаКнопкуDownloadPython3x()
Процедура ЯНажимаюНаКнопкуDownloadPython3x() Экспорт
	УдалитьСкаченныеФайлыПоМаске("python*.exe");

	Команда = ПолучитьСтрокуВызоваSikuli() + Ванесса.Объект.КаталогИнструментов + "\tools\Sikuli\Python.sikuli";
	Рез = Ванесса.ВыполнитьКомандуОСБезПоказаЧерногоОкна(Команда);
	Ванесса.ПроверитьРавенство(Рез,0,"Был клик на кнопку ""Скачать"".");

	Ванесса.ЗапретитьВыполнениеШагов();
	ПодключитьОбработчикОжидания("ТаймерОжидания",3);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	ПодключитьОбработчикОжидания("ОжиданиеЗапускТеста", 1, Истина);

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

&НаКлиенте
Процедура ОжиданиеЗапускТеста()

	ФормуНашли = Ложь;
	ФормаVanessa = Неопределено;

	Окна = ПолучитьОкна();
	Для каждого Окн Из Окна Цикл
		Если ТипЗнч(Окн) = Тип("ОкноКлиентскогоПриложения") Тогда
			Если Найти(Строка(Окн.Заголовок), "Vanessa-ADD")>0 Тогда
				ФормуНашли = Истина;
				Сообщить("" + Окн.Заголовок);
				ФормаVanessa = Окн.ПолучитьСодержимое();
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;

	Если ФормуНашли Тогда

		ФормаVanessa.ДобавитьВнешнийСписокПроцедур(ПолучитьСписокТестов(ФормаVanessa), ЭтаФорма.УникальныйИдентификатор, ЭтаФорма);
		Сообщить("Подключились можно отлаживать");

	КонецЕсли;

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

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


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

	Нашли = Ложь;
	МассивФорм = НайтиФормыТекущегоОкна();
	Для каждого ТекущаяФорма Из МассивФорм Цикл

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

		Если ПолеРеквизит = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		ПолеРеквизит.Активизировать();
		СделатьДействияПриЗаписиВидео();

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

		Нашли = Истина;
		Прервать;
	КонецЦикла;

	Если НЕ Нашли Тогда
		Если ИскатьПоИмени Тогда
			ТекстСообщения = "Флаг с именем <%1> не найден.";
		Иначе
			ТекстСообщения = "Флаг с заголовком <%1> не найден.";
		КонецЕсли;

		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяРеквизита);

		Сообщить(ТекстСообщения);
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;

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

&НаКлиенте
//В открытой форме я устанавливаю флаг "Реквизит булево"
//@ВОткрытойФормеЯУстанавливаюФлаг(Парам01)

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

&НаКлиенте
//В открытой форме я устанавливаю флаг с именем "Реквизит булево"
//@ВОткрытойФормеЯУстанавливаюФлагСИменем(Парам01)

Процедура ВОткрытойФормеЯУстанавливаюФлагСИменем(ИмяРеквизита) Экспорт
	ВОткрытойФормеЯУстанавливаюФлагСЗаголовком(ИмяРеквизита,Истина)
КонецПроцедуры

&НаКлиенте
//В открытой форме я устанавливаю флаг "Реквизит булево"
//@ВОткрытойФормеЯУстанавливаюФлаг(Парам01)

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

//---------------------------------------

&НаКлиенте

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

	Макет = ПолучитьМакетСервер("Fixtures");
	Ванесса.СоздатьДанныеПоТабличномуДокументу(Макет);

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

&НаКлиенте

Функция АктивизироватьКнопку(Кнопка,ТекущаяФорма = Неопределено,ТЧ = Неопределено)
	Если Ванесса.ТекущийTestclientЭтоWebКлиент Тогда
		Возврат Ложь;
	КонецЕсли;

	ПолучилосьАктивизировать = Ложь;
	Если Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели Тогда
		Попытка
			//в 8.3.7 эта строка вызывает проблему для кнопок диалогов
			Если ТЧ <> Неопределено Тогда
				КоманднаяПанельФормы = ТЧ.ПолучитьКоманднуюПанель();
			Иначе
				КоманднаяПанельФормы = ТекущаяФорма.ПолучитьКоманднуюПанель();
			КонецЕсли;

			Если КоманднаяПанельФормы <> Неопределено Тогда
				КоманднаяПанельФормы.Активизировать();
				ПолучилосьАктивизировать = Истина;
			КонецЕсли;
		Исключение

		КонецПопытки;
	Иначе
		Кнопка.Активизировать();
		ПолучилосьАктивизировать = Истина;
	КонецЕсли;

	Возврат ПолучилосьАктивизировать;
КонецФункции

&НаКлиенте

Процедура СделатьДействияПриЗаписиВидео(ПарамСтр = "")
	Ванесса.СделатьДействияПриЗаписиВидео(ПарамСтр);
КонецПроцедуры

&НаКлиенте

Процедура СделатьДействияПриЗаписиHTML(ПарамСтр = "")
	Ванесса.СделатьДействияПриЗаписиHTML(ПарамСтр);
КонецПроцедуры

&НаКлиенте

Функция ПолучитьАктивноеОкноИзТестовоеПриложение()
	Возврат Ванесса.ПолучитьАктивноеОкноИзТестовоеПриложение();
КонецФункции

&НаКлиенте

Функция НайтиФормуПоЗаголовку(ИмяФормы)
	Возврат Ванесса.НайтиФормуПоЗаголовку(ИмяФормы);
КонецФункции

&НаКлиенте

Функция НайтиТЧПоИмени(ИмяТЧ,НужнаяФорма = Неопределено)
	Возврат Ванесса.НайтиТЧПоИмени(ИмяТЧ,НужнаяФорма);
КонецФункции

&НаКлиенте

Функция НайтиФормыТекущегоОкна(ДопПараметры = Неопределено)
	Возврат Ванесса.НайтиФормыТекущегоОкнаTestClient(ДопПараметры);
КонецФункции

&НаКлиенте

Функция НайтиТекущуюФорму()
	Возврат Ванесса.НайтиТекущуюФормуTestClient();
КонецФункции

&НаСервере

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

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

&НаКлиенте

Процедура ЕслиНаЭкранеДиалогМодальныйДиалогТоНадоЕгоЗакрыть()
	Нашли = Ложь;
	НужноеОкно = Неопределено;

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

	Если НужноеОкно = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

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

&НаКлиенте

Функция НаЭкранеДиалогАвторизации()
	Возврат Ванесса.НаЭкранеДиалогАвторизации();
КонецФункции

&НаКлиенте
//И Я закрыл все окна клиентского приложения
//@ЯЗакрылВсеОкнаКлиентскогоПриложения()

Процедура ЯЗакрылВсеОкнаКлиентскогоПриложения() Экспорт
	Если Не КонтекстСохраняемый.Свойство("ТестовоеПриложение") Тогда
		Возврат;
	КонецЕсли;

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

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

	Ванесса.ОбработатьСменуАктивногоОкна();

	НайденДиалогАвторизации = НаЭкранеДиалогАвторизации();
	Если НайденДиалогАвторизации Тогда
		ВызватьИсключение "Не удалось авторизоваться в базе.";
	КонецЕсли;

	ЕслиНаЭкранеДиалогМодальныйДиалогТоНадоЕгоЗакрыть();//диалог мог остаться от предыдущего сценария

	ПроблемныеОкна = Новый Массив;

	//Перебираем окна в обратном порядке.
	//Тогда больше шанс, сначала будет закрыто окно нового объекта, а потом уже форма списка.
	Для Ккк = 0 По ОкнаПриложения.Количество()-1 Цикл
	//Для каждого ОкноПриложение Из ОкнаПриложения Цикл
		ОкноПриложение = ОкнаПриложения[ОкнаПриложения.Количество()-1-ккк];

		Если ОкноПриложение.Основное Тогда
			Продолжить;
		КонецЕсли;

		Если ОкноПриложение.НачальнаяСтраница Тогда
			Продолжить;
		КонецЕсли;

		Попытка
			ОкноПриложение.Закрыть();
		Исключение
			ПроблемныеОкна.Добавить(ОкноПриложение);
			ТекстСообщения = "Не смог закрыть окно %1";
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ОкноПриложение.Заголовок);
			Сообщить(ТекстСообщения);
		КонецПопытки;

		Если Ванесса.ТекущийTestclientЭтоWebКлиент Тогда
			Ванесса.Sleep(1);
		КонецЕсли;
		ЕслиНаЭкранеДиалогМодальныйДиалогТоНадоЕгоЗакрыть();//диалог мог появиться при закрытии окна.

	КонецЦикла;

	ОкноПриложение = Неопределено;
	//попробуем закрыть проблемыные окна ещё раз
	Для Каждого ОкноПриложение Из ПроблемныеОкна Цикл
		Попытка
			ОкноПриложение.Закрыть();
		Исключение
			ТекстСообщения = "Не смог закрыть окно повторно %1";
			ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ОкноПриложение.Заголовок);
			Сообщить(ТекстСообщения);
		КонецПопытки;

		Если Ванесса.ТекущийTestclientЭтоWebКлиент Тогда
			Ванесса.Sleep(1);
		КонецЕсли;

		ЕслиНаЭкранеДиалогМодальныйДиалогТоНадоЕгоЗакрыть();//диалог мог появиться при закрытии окна.
	КонецЦикла;

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

&НаКлиенте
//И Я закрыл все окна клиентского приложения кроме "Нужное окно"
//@ЯЗакрылВсеОкнаКлиентскогоПриложенияКроме(Парам01)


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

	//Для обхода бага платформы с поиском активных окон на старых версиях платформы.
	ДопПараметры.Вставить("ЗапомнитьАктивноеОкно",Ложь);

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

		Если Кнопка = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Нашли = Истина;
		Прервать;
	КонецЦикла;

	Если НЕ Нашли Тогда //для модальных диалогов
		ТекущаяФорма = НайтиТекущуюФорму();

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

		Если Кнопка <> Неопределено Тогда
			Нашли = Истина;
		КонецЕсли;

	КонецЕсли;

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

						Если Кнопка <> Неопределено Тогда
							Нашли = Истина;
							Прервать;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	Если НЕ Нашли Тогда
		Если ИскатьПоИмени Тогда
			ТекстСообщения = "Кнопка с именем <%1> не найдена.";
		Иначе
			ТекстСообщения = "Кнопка/команда с заголовком <%1> не найдена.";
		КонецЕсли;
		ТекстСообщения = СтрЗаменить(ТекстСообщения,"%1",ИмяКнопки);

		Если ДопПараметры.Свойство("АктивноеОкно") Тогда
			Если ДопПараметры.АктивноеОкно <> Неопределено Тогда
				ТекстСообщения2 = "ТекущееОкно";
				ТекстСообщения = ТекстСообщения + Символы.ПС + "        " + ТекстСообщения2 + "=" + ДопПараметры.АктивноеОкно.Заголовок;
			КонецЕсли;
		КонецЕсли;

		Сообщить(ТекстСообщения);
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;

	ПолучилосьАктивизировать = АктивизироватьКнопку(Кнопка,ТекущаяФорма);

	Если ПолучилосьАктивизировать Тогда
		СделатьДействияПриЗаписиВидео();
		СделатьДействияПриЗаписиHTML();
	КонецЕсли;

	Кнопка.Нажать();

	ДопПараметры = Новый Структура;
	ДопПараметры.Вставить("СбрасыватьЗафиксированнуюФорму",Ложь);
	Ванесса.ОбработатьСменуАктивногоОкна(ДопПараметры);
КонецПроцедуры

&НаКлиенте
//В открытой форме я нажимаю на кнопку "Записать и закрыть"
//@ВОткрытойФормеЯНажимаюНаКнопку(Парам01)

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

//TODO метод использует метаданные Ванесса-АДД и должен быть убран из библиотечного модуля
&НаСервере

Функция ЭлементСправочника1СИменемЗаписалсяКорректноСервер(Наименование)
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	Справочник1.Ссылка
		|ИЗ
		|	Справочник.Справочник1 КАК Справочник1
		|ГДЕ
		|	Справочник1.Наименование = &Наименование";

	Запрос.УстановитьПараметр("Наименование", Наименование);

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

	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Если ВыборкаДетальныеЗаписи.Количество() = 0 Тогда
		Возврат Ложь;
	КонецЕсли;

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Ссылка = ВыборкаДетальныеЗаписи.Ссылка;
		Если Ссылка.Реквизит1 <> Перечисления.Перечисление1.ЗначениеПеречисления1 Тогда
			Сообщить("$Реквизит1: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если Ссылка.Реквизит2 <> Справочники.Справочник2.НайтиПоНаименованию("ТестовыйЭлемент21") Тогда
			Сообщить("$Реквизит2: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если Ссылка.РеквизитЧисло <> 12.34 Тогда
			Сообщить("$РеквизитЧисло: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если Ссылка.РеквизитДата <> '19810408' Тогда
			Сообщить("$РеквизитДата: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если СокрЛП(Ссылка.РеквизитСтрока) <> "тест" Тогда
			Сообщить("$РеквизитСтрока: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если НЕ Ссылка.РеквизитБулево Тогда
			Сообщить("$РеквизитБулево: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если Ссылка.РеквизитПереключатель <> 1 Тогда
			Сообщить("$РеквизитПереключатель: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;

		СтрокаТЧ = Ссылка.ТабличнаяЧасть1[0];

		Если СтрокаТЧ.РеквизитЧисло <> 56.78 Тогда
			Сообщить("$ТЧ Реквизит1: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если СокрЛП(СтрокаТЧ.РеквизитСтрока) <> "ТестСтрока" Тогда
			Сообщить("$ТЧ РеквизитСтрока: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если СтрокаТЧ.РеквизитДата <> '19830911' Тогда
			Сообщить("$ТЧ РеквизитДата: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если СтрокаТЧ.РеквизитСправочник <> Справочники.Справочник2.НайтиПоНаименованию("ТестовыйЭлемент21") Тогда
			Сообщить("$ТЧ РеквизитСправочник: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если НЕ СтрокаТЧ.РеквизитБулево Тогда
			Сообщить("$ТЧ РеквизитБулево: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
		Если СтрокаТЧ.РеквизитСправочникВыборИзФормыСписка <> Справочники.Справочник2.НайтиПоНаименованию("ТестовыйЭлемент21") Тогда
			Сообщить("$ТЧ РеквизитСправочникВыборИзФормыСписка: Значение не верное.");
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;

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

//TODO метод использует метаданные Ванесса-АДД и должен быть убран из библиотечного модуля
&НаКлиенте
//Элемент Справочника1 с именем "Тестовый Элемент 1" записался корректно
//@ЭлементСправочника1СИменемЗаписалсяКорректно(Парам01)

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

&НаКлиенте
//В открытой форме я изменяю флаг с заголовком "Реквизит булево"
//@ВОткрытойФормеЯИзменяюФлагСЗаголовком(Парам01)

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

	Нашли = Ложь;
	МассивФорм = НайтиФормыТекущегоОкна();
	Для каждого ТекущаяФорма Из МассивФорм Цикл

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

		Если ПолеРеквизит = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		ПолеРеквизит.Активизировать();
		СделатьДействияПриЗаписиВидео();
		ПолеРеквизит.УстановитьОтметку();
		СделатьДействияПриЗаписиHTML();

		Нашли = Истина;
		Прервать;
	КонецЦикла;

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

		Сообщить(ТекстСообщения);
		ВызватьИсключение ТекстСообщения;
	КонецЕсли;

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

&НаКлиенте
//В открытой форме я изменяю флаг "Реквизит булево"
//@ВОткрытойФормеЯИзменяюФлаг(Парам01)


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

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

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

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

	Попытка
		ПолеРеквизит.Выбрать();
	Исключение
		Если Не Ванесса.Версия8311ИлиВыше Тогда
			ВызватьИсключение;
		КонецЕсли;
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
//В открытой форме в таблице "ТабличнаяЧасть1" я выбираю значение реквизита "Реквизит справочник выбор из формы списка" из формы списка
//@ВОткрытойФормеВТЧЯВыбираюЗначениеРеквизитаИзФормыСписка(Парам01,Парам02)

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

&НаКлиенте
//В открытой форме в таблице "ТабличнаяЧасть1" я выбираю значение реквизита с именем "Реквизит справочник выбор из формы списка" из формы списка
//@ВОткрытойФормеВТЧЯВыбираюЗначениеРеквизитаСИменемИзФормыСписка(Парам01,Парам02)

Процедура ВОткрытойФормеВТЧЯВыбираюЗначениеРеквизитаСИменемИзФормыСписка(ИмяТЧ,ИмяРеквизита) Экспорт
	ВОткрытойФормеВТЧЯВыбираюЗначениеРеквизитаСЗаголовкомИзФормыСписка(ИмяТЧ,ИмяРеквизита,Истина);
КонецПроцедуры

&НаКлиенте
//В форме "Справочник1" в таблице "ТабличнаяЧасть1" я завершаю редактирование строки
//@ВФормеВТЧЯЗавершаюРедактированиеСтроки(Парам01,Парам02)

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

&НаКлиенте
//В таблице "ТабличнаяЧасть1" я завершаю редактирование строки
//@ВТЧЯЗавершаюРедактированиеСтроки(Парам01)

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

&НаКлиенте
//В таблице "ТабличнаяЧасть1" я завершаю редактирование строки
//@ВТаблицеЯЗавершаюРедактированиеСтроки(Парам01)

Процедура ВТаблицеЯЗавершаюРедактированиеСтроки(ИмяТЧ) Экспорт
	ВТЧЯЗавершаюРедактированиеСтроки(ИмяТЧ);
КонецПроцедуры

&НаКлиенте
//Я завершаю редактирование строки
//@ЯЗавершаюРедактированиеСтроки()

Процедура ЯЗавершаюРедактированиеСтроки() Экспорт
	ТЧ                     =  Контекст.ТекущаяТЧ;
	ТЧ.ЗакончитьРедактированиеСтроки(Ложь);
КонецПроцедуры

&НаКлиенте
//В открытой форме в таблице "ТабличнаяЧасть1" я нажимаю кнопку выбора у реквизита с заголовком "Реквизит1"
//@ВОткрытойФормеВТЧЯНажимаюКнопкуВыбораУРеквизитаСЗаголовком(Парам01,Парам02)

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

	ТЧ = НайтиТЧПоИмени(ИмяТЧ);

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

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

	ПроверитьВидимостьПоляПользователю(ПолеРеквизит,ИмяРеквизита);
	ПолеРеквизит.Активизировать();

	Если НЕ ТЧ.ТекущийРежимРедактирование() Тогда
		ТЧ.ИзменитьСтроку();
	КонецЕсли;

	СделатьДействияПриЗаписиВидео();
	СделатьДействияПриЗаписиHTML();

	Попытка
		ПолеРеквизит.Выбрать();
	Исключение
		Если Не Ванесса.Версия8311ИлиВыше Тогда
			ВызватьИсключение;
		КонецЕсли;
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
//В открытой форме в таблице "ТабличнаяЧасть1" я нажимаю кнопку выбора у реквизита "Реквизит1"
//@ВОткрытойФормеВТЧЯНажимаюКнопкуВыбораУРеквизита(Парам01,Парам02)

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

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

Процедура ВТаблицеЯНажимаюКнопкуОчиститьУПоля(ИмяТЧ,ИмяРеквизита,ИскатьПоИмени = Ложь) Экспорт
	ТЧ = НайтиТЧПоИмени(ИмяТЧ);

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

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

	ПроверитьВидимостьПоляПользователю(ПолеРеквизит,ИмяРеквизита);
	ПолеРеквизит.Активизировать();

	Если НЕ ТЧ.ТекущийРежимРедактирование() Тогда
		ТЧ.ИзменитьСтроку();
	КонецЕсли;

	СделатьДействияПриЗаписиВидео();
	СделатьДействияПриЗаписиHTML();
	ПолеРеквизит.Очистить();
КонецПроцедуры

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

Процедура ВТаблицеЯНажимаюКнопкуОчиститьУПоляСИменем(ИмяТЧ,ИмяРеквизита,ИскатьПоИмени = Ложь) Экспорт
	ВТаблицеЯНажимаюКнопкуОчиститьУПоля(ИмяТЧ,ИмяРеквизита,Истина);
КонецПроцедуры

&НаКлиенте
//И В открытой форме в таблице  "Список" я перехожу на первую строку
//@ВОткрытойФормеВТЧЯПерехожуНаПервуюСтроку(Парам01)

Процедура ВОткрытойФормеВТЧЯПерехожуНаПервуюСтроку(ИмяТЧ) Экспорт
	ТЧ                     =  НайтиТЧПоИмени(ИмяТЧ);
	ТЧ.ПерейтиКПервойСтроке();
КонецПроцедуры

&НаКлиенте
//И В таблице  "Список" я перехожу на первую строку
//@ВТЧЯПерехожуНаПервуюСтроку(Парам01)

Процедура ВТЧЯПерехожуНаПервуюСтроку(ИмяТЧ) Экспорт
	ВОткрытойФормеВТЧЯПерехожуНаПервуюСтроку(ИмяТЧ);
КонецПроцедуры

&НаКлиенте
//И В открытой форме в таблице  "Список" я перехожу на последнюю строку
//@ВОткрытойФормеВТЧЯПерехожуНаПоследнююСтроку(Парам01)

Процедура ВОткрытойФормеВТЧЯПерехожуНаПоследнююСтроку(ИмяТЧ) Экспорт
	ТЧ                     =  НайтиТЧПоИмени(ИмяТЧ);
	ТЧ.ПерейтиКПоследнейСтроке();
КонецПроцедуры

&НаКлиенте
//И В таблице  "Список" я перехожу на последнюю строку
//@ВТЧЯПерехожуНаПоследнююСтроку(Парам01)

Процедура ВТЧЯПерехожуНаПоследнююСтроку(ИмяТЧ) Экспорт
	ВОткрытойФормеВТЧЯПерехожуНаПоследнююСтроку(ИмяТЧ);
КонецПроцедуры

&НаКлиенте
//И В открытой форме в таблице  "Список" я перехожу на одну строку вверх
//@ВОткрытойФормеВТЧЯПерехожуНаОднуСтрокуВверх(Парам01)

Процедура ВОткрытойФормеВТЧЯПерехожуНаОднуСтрокуВверх(ИмяТЧ) Экспорт
	ТЧ                     =  НайтиТЧПоИмени(ИмяТЧ);
	ТЧ.ПерейтиКПредыдущейСтроке();
КонецПроцедуры

&НаКлиенте
//И в таблице  "Список" я перехожу на один уровень вниз
//@ВТаблицеЯПерехожуНаОдинУровеньВниз(Парам01)

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

&НаКлиенте
//И в таблице  "Список" я перехожу на один уровень вверх
//@ВТаблицеЯПерехожуНаОдинУровеньВверх(Парам01)


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

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

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

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

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

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

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

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

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

	Форма = НовыйЭкземпляр.ПолучитьФорму("Форма");
	Ванесса.ПроверитьРавенство(Форма.Открыта(),Ложь,"Мы должны были получить новый экземпляр формы.");
	Форма.ХостСистема = Ванесса;
	Форма.Открыть();
	Контекст.Вставить("ОткрытаяФормаVanessaADD",Форма);
	Контекст.Вставить("ОбработкаОбъектVanessaADD",НовыйЭкземпляр);
КонецПроцедуры

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

	ОбработкаОбъектVanessaADD            = Контекст.ОбработкаОбъектVanessaADD;

	ПутьКФиче = ОбработкаОбъектVanessaADD.КаталогИнструментов + "\features\Support\Templates\" + ИмяФичи + ".feature";
	ФайлПроверкаСуществования = Новый Файл(ПутьКФиче);
	Если НЕ ФайлПроверкаСуществования.Существует() Тогда
		ВызватьИсключение "Файл " + ПутьКФиче + " не существует!";
	КонецЕсли;

	ОбработкаОбъектVanessaADD.КаталогФич = ПутьКФиче;

	ОткрытаяФормаVanessaADD = Контекст.ОткрытаяФормаVanessaADD;

	ОткрытаяФормаVanessaADD.ЗагрузитьФичи();
КонецПроцедуры

//ДеревоТестов заполнилось строками из фичи
//@ДеревоТестовЗаполнилосьСтрокамиИзФичи()
Процедура ДеревоТестовЗаполнилосьСтрокамиИзФичи() Экспорт
	ОбработкаОбъектVanessaADD = Контекст.ОбработкаОбъектVanessaADD;

	Ванесса.ПроверитьНеРавенство(ОбработкаОбъектVanessaADD.ДеревоТестов.Строки.Количество(),0,"В дереве тестов на первом уровне должны быть строки.");

	Ванесса.ПроверитьНеРавенство(ОбработкаОбъектVanessaADD.ДеревоТестов.Строки[0].Строки.Количество(),0,"В дереве тестов на втором уровне должны быть строки.");
КонецПроцедуры


//{ основная процедура для юнит-тестирования 1CUnit
Перем _тестируем; // для тестирования
Перем юТест;

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

	юТест = ЮнитТестирование;

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

	ВсеТесты.Добавить("ТестДолжен_ПроверитьДваПлюсДваРавноЧетыре");

	Возврат ВсеТесты;

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

//{ ОСНОВНОЙ БЛОК

//} КОНЕЦ ОСНОВНОГО БЛОКА

//{ БЛОК ЮНИТ-ТЕСТОВ - сами тесты

Процедура ПередЗапускомТеста() Экспорт

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

Процедура ПослеЗапускаТеста() Экспорт

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

Процедура ТестДолжен_ПроверитьДваПлюсДваРавноЧетыре() Экспорт
	юТест.ПроверитьРавенство(2 + 2, 4);
КонецПроцедуры

_тестируем = Ложь;

//} КОНЕЦ БЛОКА ЮНИТ-ТЕСТОВ


//{ основная процедура для юнит-тестирования 1CUnit
Перем _тестируем; // для тестирования
Перем юТест;

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

	юТест = ЮнитТестирование;

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

	ВсеТесты.Добавить("ТестДолженУпасть");

	Возврат ВсеТесты;

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

//{ ОСНОВНОЙ БЛОК

//} КОНЕЦ ОСНОВНОГО БЛОКА

//{ БЛОК ЮНИТ-ТЕСТОВ - сами тесты

Процедура ПередЗапускомТеста() Экспорт

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

Процедура ПослеЗапускаТеста() Экспорт

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

Процедура ТестДолженУпасть() Экспорт
	юТест.ПроверитьРавенство(2 + 2, 5);
КонецПроцедуры

_тестируем = Ложь;

//} КОНЕЦ БЛОКА ЮНИТ-ТЕСТОВ


Функция СоздатьОбъект_Документ_или_БизнесПроцесс_или_Задача(МенеджерВсехВидов, ПротоДанные, ПротоОбъект)
	ЭтоДокумент = МенеджерВсехВидов = Документы;
	ЭтоБизнесПроцесс = МенеджерВсехВидов = БизнесПроцессы;
	ЭтоЗадача = МенеджерВсехВидов = Задачи;

	Если ЭтоДокумент Тогда
		ПредставлениеМенеджера = "Документы";
	ИначеЕсли ЭтоБизнесПроцесс Тогда
		ПредставлениеМенеджера = "БизнесПроцессы";
	ИначеЕсли ЭтоЗадача Тогда
		ПредставлениеМенеджера = "Задачи";
	Иначе
		ВызватьИсключение "Требуется документ, бизнес-процесс или задача. Неизвестный менеджер "+ПротоОбъект.Тип+"."+ПротоОбъект.Вид+" . Переменная "+ПротоОбъект.ИмяПеременной;
	КонецЕсли;

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

	Если ПротоОбъект.Режимы.ТолькоСоздание И Объект<>Неопределено Тогда
		Возврат ПротоОбъект.Объект;
	КонецЕсли;

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

	Если Объект = Неопределено Тогда
		Объект = НовыйПустойОбъект;
	КонецЕсли;

	//Установка ссылки
	Если Объект <> Неопределено И Объект.ЭтоНовый() Тогда
		Если Не ЗначениеЗаполнено(ПротоОбъект.Объект) Тогда
			ПротоОбъект.Объект = МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор);
		КонецЕсли;
		Объект.УстановитьСсылкуНового(ПротоОбъект.Объект);
	КонецЕсли;

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

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

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

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

	ЗаполнитьОбменДанными(Объект, ПротоДанные, ПротоОбъект);
	ЗаполнитьДополнительныеСвойства(Объект, ПротоДанные, ПротоОбъект);

	РежимЗаписи = Неопределено;
	Если ЭтоДокумент И Не ПротоОбъект.Режимы.Объект Тогда
		РежимЗаписи = РежимЗаписиДокумента.Запись;
		Если ПротоОбъект.Режимы.Проведение Тогда
			РежимЗаписи = РежимЗаписиДокумента.Проведение;
		КонецЕсли;
	КонецЕсли;
	Результат = ЗаписатьОбъектПриНеобходимости(Объект, ПротоОбъект, ПредставлениеМенеджера, Истина, РежимЗаписи);

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