Функция ИзвлечьКомментарииМеждуТокенами(ТаблицаТокенов, ТекстМодуля, ТокенНач, ТокенКон)

	МассивКомментариев = Новый Массив;
	ЕстьПустаяСтрокаПередКомментариями = Ложь;
	ЕстьПустаяСтрокаПослеКомментариев = Ложь;

	ТекИндексТокена = ТокенНач.Индекс + 1;
	ИндексКонец = ТокенКон.Индекс;
	ТекКомментарий = "";
	Пока ТекИндексТокена < ИндексКонец Цикл
		ТекТокен = ТаблицаТокенов[ТекИндексТокена];
		Если ТекТокен.Токен = "ПустаяСтрока" Тогда
			Если ЗначениеЗаполнено(ТекКомментарий) Тогда
				МассивКомментариев.Добавить(ТекКомментарий);
				ТекКомментарий = "";
			ИначеЕсли МассивКомментариев.Количество() = 0 Тогда
				ЕстьПустаяСтрокаПередКомментариями = Истина;
			КонецЕсли;
			ЕстьПустаяСтрокаПослеКомментариев = Истина;
		ИначеЕсли ТекТокен.Токен = "Комментарий" Тогда
			ТекКомментарий = ТекКомментарий
				+ ?(ЗначениеЗаполнено(ТекКомментарий), Символы.ПС, "")
				+ СокрП(Сред(ТекстМодуля, ТекТокен.Позиция, ТекТокен.Длина));
			ЕстьПустаяСтрокаПослеКомментариев = Ложь;
		КонецЕсли;

		ТекИндексТокена = ТекИндексТокена + 1;
	КонецЦикла;

	Если ЗначениеЗаполнено(ТекКомментарий) Тогда
		МассивКомментариев.Добавить(ТекКомментарий);
	КонецЕсли;

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

	Возврат Новый Структура(
		"МассивКомментариев,ЕстьПустаяСтрокаПередКомментариями,ЕстьПустаяСтрокаПослеКомментариев",
		МассивКомментариев,
		ЕстьПустаяСтрокаПередКомментариями,
		ЕстьПустаяСтрокаПослеКомментариев);

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

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

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

	Возврат Неопределено;

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

Функция ИзвлечьТекстМеждуТокенами(ТекстМодуля, ТокенНач, ТокенКон)

	ПозицияТекста = ТокенНач.Позиция + ТокенНач.Длина;
	ДлинаТекста = ТокенКон.Позиция - ПозицияТекста;
	Возврат Сред(ТекстМодуля, ПозицияТекста, ДлинаТекста);

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

Функция ИзвлечьТекстМеждуТокенамиВключительно(ТекстМодуля, ТокенНач, ТокенКон)

	ПозицияТекста = ТокенНач.Позиция;
	ДлинаТекста = ТокенКон.Позиция + ТокенКон.Длина - ПозицияТекста;
	Возврат Сред(ТекстМодуля, ПозицияТекста, ДлинаТекста);

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

Процедура ДобавитьУзелКод(СтрокаДерева, ТекстМодуля, ТокенНач, ТокенКон)

	ТекстКод = ТекстПрограммы(ИзвлечьТекстМеждуТокенами(ТекстМодуля, ТокенНач, ТокенКон));

	Если ЗначениеЗаполнено(ТекстКод) Тогда
		НоваяСтрокаДерева = СтрокаДерева.Строки.Добавить();
		НоваяСтрокаДерева.ТипЭлемента = "Код";
		НоваяСтрокаДерева.Описание = СтрПолучитьСтроку(ТекстКод, 1) + ?(СтрЧислоСтрок(ТекстКод) > 1, " <...>", "");

		НоваяСтрокаДерева.Содержимое = Обработки.ОМ_ОформляторМодулей.КодСтруктураОписания();
		НоваяСтрокаДерева.Содержимое.Тело = ТекстКод;
		НоваяСтрокаДерева.Содержимое.ИнструкцииПрепроцессора = ТекущиеИнструкцииПрепроцессора();
	КонецЕсли;

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

Функция ТекстУзла(Узел, ТекстМодуля)

	Позиция = Узел.Начало.Позиция;
	Длина = Узел.Конец.Позиция + Узел.Конец.Длина - Узел.Начало.Позиция;

	Возврат Сред(ТекстМодуля, Позиция, Длина);

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

Функция ТекстПрограммы(стр)

	ТД_ТекстПодпрограммы = Новый ТекстовыйДокумент;
	ТД_ТекстПодпрограммыРезультат = Новый ТекстовыйДокумент;

	ТД_ТекстПодпрограммы.УстановитьТекст(СокрЛП(стр));
	Для Инд1 = 1 По ТД_ТекстПодпрограммы.КоличествоСтрок() Цикл
		Стр = ТД_ТекстПодпрограммы.ПолучитьСтроку(Инд1);
		Если Лев(Стр, 1) = Символы.Таб Тогда
			Стр = Сред(Стр, 2);
		ИначеЕсли Лев(Стр, 4) = "    " Тогда
			Стр = Сред(Стр, 5);
		КонецЕсли;
		ТД_ТекстПодпрограммыРезультат.ДобавитьСтроку(Стр);
	КонецЦикла;

	Возврат СокрП(ТД_ТекстПодпрограммыРезультат.ПолучитьТекст());

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

Функция ТекстКомментария(стр)

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

	ТД_Текст.УстановитьТекст(стр);
	НачНомер = 1;
	КонНомер = ТД_Текст.КоличествоСтрок();

	Пока НачНомер < КонНомер
		И Не ЗначениеЗаполнено(ТД_Текст.ПолучитьСтроку(НачНомер))
	Цикл
		НачНомер = НачНомер + 1;
	КонецЦикла;
	Пока КонНомер > НачНомер
		И Не ЗначениеЗаполнено(ТД_Текст.ПолучитьСтроку(КонНомер))
	Цикл
		КонНомер = КонНомер - 1;
	КонецЦикла;

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

	Возврат СокрП(ТД_ТекстРезультат.ПолучитьТекст());

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

Функция ОформитьИменаПеременных(ТаблицаПеременных)

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

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

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

#Область РазборИнструкцийПрепроцессора

Функция СтруктураИнструкцийПрепроцессора(ВыражениеИнструкцийПрепроцессора)

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

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

		ТекстКодаВыполненияИнструкцииПрепроцессора = ТекстКодаВыполненияИнструкцииПрепроцессора + "СтруктураВариантовРаботыПредприятия.Вставить(КлючЗначение.Ключ, " + ВыражениеИнструкцийПрепроцессора + ");";
		Выполнить (ТекстКодаВыполненияИнструкцииПрепроцессора);
	КонецЦикла;

	Возврат СтруктураВариантовРаботыПредприятия;

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

Функция ПодготовитьВыражениеИнструкцийПрепроцессора(Знач ВыражениеИнструкцийПрепроцессора)

	ВыражениеИнструкцийПрепроцессора = НРег(ВыражениеИнструкцийПрепроцессора);
	ВыражениеИнструкцийПрепроцессора = СтрЗаменить(ВыражениеИнструкцийПрепроцессора, "наклиенте", "клиент");
	ВыражениеИнструкцийПрепроцессора = СтрЗаменить(ВыражениеИнструкцийПрепроцессора, "насервере", "сервер");
	Возврат ВыражениеИнструкцийПрепроцессора;

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

Функция ТекущиеИнструкцииПрепроцессора()

	Если ЗначениеЗаполнено(СтекИнструкцийПрепроцессора) Тогда
		УсловиеПрепроцессора = "";
		Для Каждого Инструкция Из СтекИнструкцийПрепроцессора Цикл
			УсловиеПрепроцессора = УсловиеПрепроцессора + ?(ЗначениеЗаполнено(УсловиеПрепроцессора), " И ", "") + "(" + СтрокаУсловий(Инструкция) + ")";
		КонецЦикла;

		Возврат СтруктураИнструкцийПрепроцессора(УсловиеПрепроцессора);
	Иначе
		Возврат Обработки.ОМ_ОформляторМодулей.СтруктураИнструкцийПрепроцессораПоУмолчанию();
	КонецЕсли;

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

Функция СтрокаУсловий(МассивУсловий)

	УсловиеСтр = МассивУсловий[0];

	Для ИндексУсловия = 1 По МассивУсловий.ВГраница() Цикл
		УсловиеСтр = УсловиеСтр + ?(ЗначениеЗаполнено(УсловиеСтр), " И ", "") + "НЕ (" + МассивУсловий[ИндексУсловия] + ")";
	КонецЦикла;

	Возврат УсловиеСтр;

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

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

#Область СлужебныеФункции


Функция ИзвлечьКомментарииМеждуТокенами(ТаблицаТокенов, ТекстМодуля, ТокенНач, ТокенКон)

	МассивКомментариев = Новый Массив;
	ЕстьПустаяСтрокаПередКомментариями = Ложь;
	ЕстьПустаяСтрокаПослеКомментариев = Ложь;

	ТекИндексТокена = ТокенНач.Индекс + 1;
	ИндексКонец = ТокенКон.Индекс;
	ТекКомментарий = "";
	Пока ТекИндексТокена < ИндексКонец Цикл
		ТекТокен = ТаблицаТокенов[ТекИндексТокена];
		Если ТекТокен.Токен = "ПустаяСтрока" Тогда
			Если ЗначениеЗаполнено(ТекКомментарий) Тогда
				МассивКомментариев.Добавить(ТекКомментарий);
				ТекКомментарий = "";
			ИначеЕсли МассивКомментариев.Количество() = 0 Тогда
				ЕстьПустаяСтрокаПередКомментариями = Истина;
			КонецЕсли;
			ЕстьПустаяСтрокаПослеКомментариев = Истина;
		ИначеЕсли ТекТокен.Токен = "Комментарий" Тогда
			ТекКомментарий = ТекКомментарий
				+ ?(ЗначениеЗаполнено(ТекКомментарий), Символы.ПС, "")
				+ СокрП(Сред(ТекстМодуля, ТекТокен.Позиция, ТекТокен.Длина));
			ЕстьПустаяСтрокаПослеКомментариев = Ложь;
		КонецЕсли;

		ТекИндексТокена = ТекИндексТокена + 1;
	КонецЦикла;

	Если ЗначениеЗаполнено(ТекКомментарий) Тогда
		МассивКомментариев.Добавить(ТекКомментарий);
	КонецЕсли;

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

	Возврат Новый Структура(
		"МассивКомментариев,ЕстьПустаяСтрокаПередКомментариями,ЕстьПустаяСтрокаПослеКомментариев",
		МассивКомментариев,
		ЕстьПустаяСтрокаПередКомментариями,
		ЕстьПустаяСтрокаПослеКомментариев);

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

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

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

	Возврат Неопределено;

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

Функция ИзвлечьТекстМеждуТокенами(ТекстМодуля, ТокенНач, ТокенКон)

	ПозицияТекста = ТокенНач.Позиция + ТокенНач.Длина;
	ДлинаТекста = ТокенКон.Позиция - ПозицияТекста;
	Возврат Сред(ТекстМодуля, ПозицияТекста, ДлинаТекста);

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

Функция ИзвлечьТекстМеждуТокенамиВключительно(ТекстМодуля, ТокенНач, ТокенКон)

	ПозицияТекста = ТокенНач.Позиция;
	ДлинаТекста = ТокенКон.Позиция + ТокенКон.Длина - ПозицияТекста;
	Возврат Сред(ТекстМодуля, ПозицияТекста, ДлинаТекста);

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

Процедура ДобавитьУзелКод(СтрокаДерева, ТекстМодуля, ТокенНач, ТокенКон)

	ТекстКод = ТекстПрограммы(ИзвлечьТекстМеждуТокенами(ТекстМодуля, ТокенНач, ТокенКон));

	Если ЗначениеЗаполнено(ТекстКод) Тогда
		НоваяСтрокаДерева = НовоеДеревоСтруктурыМодуля(СтрокаДерева);
		НоваяСтрокаДерева.ТипЭлемента = "Код";
		НоваяСтрокаДерева.Описание = СтрПолучитьСтроку(ТекстКод, 1) + ?(СтрЧислоСтрок(ТекстКод) > 1, " <...>", "");

		НоваяСтрокаДерева.Содержимое = КодСтруктураОписания();
		НоваяСтрокаДерева.Содержимое.Тело = ТекстКод;
		НоваяСтрокаДерева.Содержимое.ИнструкцииПрепроцессора = ТекущиеИнструкцииПрепроцессора();
	КонецЕсли;

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

Функция ТекстУзла(Узел, ТекстМодуля)

	Позиция = Узел.Начало.Позиция;
	Длина = Узел.Конец.Позиция + Узел.Конец.Длина - Узел.Начало.Позиция;

	Возврат Сред(ТекстМодуля, Позиция, Длина);

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

Функция ТекстПрограммы(стр)

	ТД_ТекстПодпрограммы = Новый ТекстовыйДокумент;
	ТД_ТекстПодпрограммыРезультат = Новый ТекстовыйДокумент;

	ТД_ТекстПодпрограммы.УстановитьТекст(СокрЛП(стр));
	Для Инд1 = 1 По ТД_ТекстПодпрограммы.КоличествоСтрок() Цикл
		Стр = ТД_ТекстПодпрограммы.ПолучитьСтроку(Инд1);
		Если Лев(Стр, 1) = Символы.Таб Тогда
			Стр = Сред(Стр, 2);
		ИначеЕсли Лев(Стр, 4) = "    " Тогда
			Стр = Сред(Стр, 5);
		КонецЕсли;
		ТД_ТекстПодпрограммыРезультат.ДобавитьСтроку(Стр);
	КонецЦикла;

	Возврат СокрП(ТД_ТекстПодпрограммыРезультат.ПолучитьТекст());

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

Функция ТекстКомментария(стр)

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

	ТД_Текст.УстановитьТекст(стр);
	НачНомер = 1;
	КонНомер = ТД_Текст.КоличествоСтрок();

	Пока НачНомер < КонНомер
		И Не ЗначениеЗаполнено(ТД_Текст.ПолучитьСтроку(НачНомер))
	Цикл
		НачНомер = НачНомер + 1;
	КонецЦикла;
	Пока КонНомер > НачНомер
		И Не ЗначениеЗаполнено(ТД_Текст.ПолучитьСтроку(КонНомер))
	Цикл
		КонНомер = КонНомер - 1;
	КонецЦикла;

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

	Возврат СокрП(ТД_ТекстРезультат.ПолучитьТекст());

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

#Область РазборИнструкцийПрепроцессора

Функция СтруктураИнструкцийПрепроцессора(ВыражениеИнструкцийПрепроцессора)

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

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

		ТекстКодаВыполненияИнструкцииПрепроцессора = ТекстКодаВыполненияИнструкцииПрепроцессора + "СтруктураВариантовРаботыПредприятия.Вставить(КлючЗначение.Ключ, " + ВыражениеИнструкцийПрепроцессора + ");";
		Выполнить (ТекстКодаВыполненияИнструкцииПрепроцессора);
	КонецЦикла;

	Возврат СтруктураВариантовРаботыПредприятия;

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

Функция ПодготовитьВыражениеИнструкцийПрепроцессора(Знач ВыражениеИнструкцийПрепроцессора)

	ВыражениеИнструкцийПрепроцессора = НРег(ВыражениеИнструкцийПрепроцессора);
	ВыражениеИнструкцийПрепроцессора = СтрЗаменить(ВыражениеИнструкцийПрепроцессора, "наклиенте", "клиент");
	ВыражениеИнструкцийПрепроцессора = СтрЗаменить(ВыражениеИнструкцийПрепроцессора, "насервере", "сервер");
	Возврат ВыражениеИнструкцийПрепроцессора;

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

Функция ТекущиеИнструкцииПрепроцессора()

	Если ЗначениеЗаполнено(СтекИнструкцийПрепроцессора) Тогда
		УсловиеПрепроцессора = "";
		Для Каждого Инструкция Из СтекИнструкцийПрепроцессора Цикл
			УсловиеПрепроцессора = УсловиеПрепроцессора + ?(ЗначениеЗаполнено(УсловиеПрепроцессора), " И ", "") + "(" + СтрокаУсловий(Инструкция) + ")";
		КонецЦикла;

		Возврат СтруктураИнструкцийПрепроцессора(УсловиеПрепроцессора);
	Иначе
		Возврат СтруктураИнструкцийПрепроцессораПоУмолчанию();
	КонецЕсли;

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

Функция СтрокаУсловий(МассивУсловий)

	УсловиеСтр = МассивУсловий[0];

	Для ИндексУсловия = 1 По МассивУсловий.ВГраница() Цикл
		УсловиеСтр = УсловиеСтр + ?(ЗначениеЗаполнено(УсловиеСтр), " И ", "") + "НЕ (" + МассивУсловий[ИндексУсловия] + ")";
	КонецЦикла;

	Возврат УсловиеСтр;

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

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

#Область СлужебныеФункции

Функция МногострочноеСокрЛП(Текст)

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

	ТД_Текст.УстановитьТекст(СокрЛП(Текст));
	Для Инд1 = 1 По ТД_Текст.КоличествоСтрок() Цикл
		Стр = СокрЛП(ТД_Текст.ПолучитьСтроку(Инд1));
		ТД_ТекстРезультат.ДобавитьСтроку(Стр);
	КонецЦикла;

	Возврат ТД_ТекстРезультат.ПолучитьТекст();

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


Функция ПолучитьМетаданныеНаСервере(Знач ОписанияРазделов)
	Результат = Новый Структура;

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

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

			МассивОбъектов.Добавить(Структура);
		КонецЦикла;
	КонецЦикла;

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

&НаКлиенте

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

	Результат.Вставить("СтандартныеРеквизиты", Новый Структура);
	Возврат Результат;

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

&НаКлиенте

Процедура ЗаполнитьТипыСвойств(ЭлементАСД)
	Если НЕ ЭлементАСД.Свойство("НаборСвойств") Тогда
		Возврат;
	КонецЕсли;

	Если ПустаяСтрока(ЭлементАСД.ТипЭлемента) Тогда
		Возврат;
	КонецЕсли;

	ЕстьСвойствоПоТипу = мВсеСвойства.Свойство(ЭлементАСД.ТипЭлемента);
	Если ЕстьСвойствоПоТипу Тогда
		ВсеСвойстваПоТипу = мВсеСвойства[ЭлементАСД.ТипЭлемента];
	КонецЕсли;

	ЕстьСвойствоПоВиду = ВсеСвойстваПоТипу.Свойство(ЭлементАСД.ВидЭлемента);
	Если ЕстьСвойствоПоВиду Тогда
		ВсеСвойстваПоВиду = ВсеСвойстваПоТипу[ЭлементАСД.ВидЭлемента];
	КонецЕсли;

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

		Если НЕ ЕстьСвойствоПоВиду Тогда
			Продолжить;
		КонецЕсли;

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

		ОписаниеСвойства = ВсеСвойстваПоВиду.ТипыСвойств[ИмяСвойства];

		Если НЕ ЭтоКорректноеЗначение(ЗначениеСвойства, ОписаниеСвойства) Тогда
			Продолжить;
		КонецЕсли;

		ЭлементАСД.ТипыСвойств.Вставить(ИмяСвойства, ОписаниеСвойства.ТипЗначения);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте

Функция ЭтоКорректноеЗначение(Значение, ОписаниеСвойства)
	Если ОписаниеСвойства.ТипЗначения = "СписокЗначений" Тогда
		Возврат Истина;
	КонецЕсли;

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

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

	Если ОписаниеСвойства.ТипЗначения = "Цвет" Тогда
		Возврат Истина;
	КонецЕсли;

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

	Если ОписаниеСвойства.ТипЗначения = "Булево" ИЛИ ОписаниеСвойства.ТипЗначения = "БулевоНеопределено" Тогда
		Возврат ЭтоБулево(Значение);
	КонецЕсли;

	Возврат ОписаниеСвойства.ЗначенияАнгл.Свойство(Значение);
КонецФункции

&НаКлиенте

Функция ЭтоЧисло(Знач Значение)
	Если Значение = "0" Тогда
		Возврат Истина;
	КонецЕсли;

	ОписаниеЧисла = Новый ОписаниеТипов("Число");

	Возврат ОписаниеЧисла.ПривестиЗначение(Значение) <> 0;
КонецФункции

&НаКлиенте

Функция ЭтоБулево(Знач Значение)
	ДопустимыеЗначения = СтрРазделить("да,нет,0,1,истина,ложь", ",");

	Возврат ДопустимыеЗначения.Найти(НРег(Значение)) <> Неопределено;
КонецФункции

&НаКлиенте

Функция ПолучитьЭлементПоУИД(ОписаниеЭлементов, УИД) Экспорт
	Если ОписаниеЭлементов.УИД = УИД Тогда
		Возврат ОписаниеЭлементов;
	КонецЕсли;

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

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

	Возврат Неопределено;
КонецФункции

&НаСервере

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

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

&НаСервере

Функция ПолучитьСвойстваНаСервере()
	МаксимальноеКоличествоЗначений = 6;

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

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

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

	ТаблицаЗначений = Построитель.Результат.Выгрузить();

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

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

		ОписаниеСвойства = ПолучитьСтруктуруСвойства();

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

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

		КонецЕсли;

		Если ОписаниеСвойства.ТипЗначения = "БулевоНеопределено" Тогда
			ОписаниеСвойства.ТипЗначения = "Булево";
		КонецЕсли;

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

			ОписаниеСвойства.ПредставленияЗначений.Вставить(ТекущееЗначение, СтрокаТаблицы["ПредставлениеЗначения" + Строка(Сч)]);
		КонецЦикла;

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

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

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

&НаСервере

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

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

&НаСервере


Функция ПоложениеЗаголовка(ПоложениеЗаголовка) Экспорт

	Свойство("ПоложениеЗаголовка", ПоложениеЗаголовка);

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

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

Функция ПоложениеКартинки(ПоложениеКартинки) Экспорт

	Свойство("ПоложениеКартинки", ПоложениеКартинки);

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

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

Функция ПоложениеКоманднойПанели(ПоложениеКоманднойПанели) Экспорт

	Свойство("ПоложениеКоманднойПанели", ПоложениеКоманднойПанели);

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

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

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

	Свойство("ПоложениеСостоянияПросмотра", ПоложениеСостоянияПросмотра);

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

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

Функция ПоложениеСтрокиПоиска(ПоложениеСтрокиПоиска) Экспорт

	Свойство("ПоложениеСтрокиПоиска", ПоложениеСтрокиПоиска);

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

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

Функция ПоложениеУправленияПоиском(ПоложениеУправленияПоиском) Экспорт

	Свойство("ПоложениеУправленияПоиском", ПоложениеУправленияПоиском);

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

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

Функция Пометка(Пометка) Экспорт

	Свойство("Пометка", Пометка);

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

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

Функция ПредупреждениеПриРедактировании(ПредупреждениеПриРедактировании) Экспорт

	Свойство("ПредупреждениеПриРедактировании", ПредупреждениеПриРедактировании);

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

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

Функция ПропускатьПриВводе(ПропускатьПриВводе) Экспорт

	Свойство("ПропускатьПриВводе", ПропускатьПриВводе);

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

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

Функция ПутьКДанным(ПутьКДанным) Экспорт

	Свойство("ПутьКДанным", ПутьКДанным);

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

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

Функция ПутьКДаннымКартинкиСтроки(ПутьКДаннымКартинкиСтроки) Экспорт

	Свойство("ПутьКДаннымКартинкиСтроки", ПутьКДаннымКартинкиСтроки);

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

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

Функция ПутьКДаннымПодвала(ПутьКДаннымПодвала) Экспорт

	Свойство("ПутьКДаннымПодвала", ПутьКДаннымПодвала);

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

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

Функция РазрешитьИзменениеСостава(РазрешитьИзменениеСостава) Экспорт

	Свойство("РазрешитьИзменениеСостава", РазрешитьИзменениеСостава);

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

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

Функция РазрешитьНачалоПеретаскивания(РазрешитьНачалоПеретаскивания) Экспорт

	Свойство("РазрешитьНачалоПеретаскивания", РазрешитьНачалоПеретаскивания);

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

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

Функция РазрешитьПеретаскивание(РазрешитьПеретаскивание) Экспорт

	Свойство("РазрешитьПеретаскивание", РазрешитьПеретаскивание);

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

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

Функция РастягиватьПоВертикали(РастягиватьПоВертикали) Экспорт

	Свойство("РастягиватьПоВертикали", РастягиватьПоВертикали);

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

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

Функция РастягиватьПоГоризонтали(РастягиватьПоГоризонтали) Экспорт

	Свойство("РастягиватьПоГоризонтали", РастягиватьПоГоризонтали);

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

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

Функция РасширеннаяПодсказка(РасширеннаяПодсказка) Экспорт

	Свойство("РасширеннаяПодсказка", РасширеннаяПодсказка);

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

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

Функция РежимВводаСтрок(РежимВводаСтрок) Экспорт

	Свойство("РежимВводаСтрок", РежимВводаСтрок);

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

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

Функция РежимВыбора(РежимВыбора) Экспорт

	Свойство("РежимВыбора", РежимВыбора);

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

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

Функция РежимВыделения(РежимВыделения) Экспорт

	Свойство("РежимВыделения", РежимВыделения);

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

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

Функция РежимВыделенияСтроки(РежимВыделенияСтроки) Экспорт

	Свойство("РежимВыделенияСтроки", РежимВыделенияСтроки);

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

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

Функция РежимРедактирования(РежимРедактирования) Экспорт

	Свойство("РежимРедактирования", РежимРедактирования);

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

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

Функция Родитель(Родитель) Экспорт

	Свойство("Родитель", Родитель);

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

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

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

	Свойство("СостояниеПросмотра", СостояниеПросмотра);

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

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

Функция СочетаниеКлавиш(СочетаниеКлавиш) Экспорт

	Свойство("СочетаниеКлавиш", СочетаниеКлавиш);

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

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

Функция СпособПеретаскиванияФайлов(СпособПеретаскиванияФайлов) Экспорт

	Свойство("СпособПеретаскиванияФайлов", СпособПеретаскиванияФайлов);

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

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

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

	Свойство("СтрокаПоиска", СтрокаПоиска);

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

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

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

	Свойство("ТекстПодвала", ТекстПодвала);

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

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

Функция ТекущаяСтрока(ТекущаяСтрока) Экспорт

	Свойство("ТекущаяСтрока", ТекущаяСтрока);

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

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

Функция ТекущиеДанные(ТекущиеДанные) Экспорт

	Свойство("ТекущиеДанные", ТекущиеДанные);

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

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

Функция ТекущийРодитель(ТекущийРодитель) Экспорт

	Свойство("ТекущийРодитель", ТекущийРодитель);

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

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

Функция ТолькоВоВсехДействиях(ТолькоВоВсехДействиях) Экспорт

	Свойство("ТолькоВоВсехДействиях", ТолькоВоВсехДействиях);

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

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

Функция ТолькоПросмотр(ТолькоПросмотр) Экспорт

	Свойство("ТолькоПросмотр", ТолькоПросмотр);

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

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

Функция УникальностьКоманды(УникальностьКоманды) Экспорт

	Свойство("УникальностьКоманды", УникальностьКоманды);

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

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

Функция УправлениеПоиском(УправлениеПоиском) Экспорт

	Свойство("УправлениеПоиском", УправлениеПоиском);

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

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

Функция Фигура(Фигура) Экспорт

	Свойство("Фигура", Фигура);

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

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

Функция ФиксацияВТаблице(ФиксацияВТаблице) Экспорт

	Свойство("ФиксацияВТаблице", ФиксацияВТаблице);

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

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

Функция ЦветРамки(ЦветРамки) Экспорт

	Свойство("ЦветРамки", ЦветРамки);

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

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

Функция ЦветТекста(ЦветТекста) Экспорт

	Свойство("ЦветТекста", ЦветТекста);

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

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

Функция ЦветТекстаЗаголовка(ЦветТекстаЗаголовка) Экспорт

	Свойство("ЦветТекстаЗаголовка", ЦветТекстаЗаголовка);

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

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

Функция ЦветТекстаПодвала(ЦветТекстаПодвала) Экспорт

	Свойство("ЦветТекстаПодвала", ЦветТекстаПодвала);

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

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

Функция ЦветФона(ЦветФона) Экспорт

	Свойство("ЦветФона", ЦветФона);

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

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

Функция ЦветФонаЗаголовка(ЦветФонаЗаголовка) Экспорт

	Свойство("ЦветФонаЗаголовка", ЦветФонаЗаголовка);

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

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

Функция ЦветФонаПодвала(ЦветФонаПодвала) Экспорт

	Свойство("ЦветФонаПодвала", ЦветФонаПодвала);

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

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

Функция ЧередованиеЦветовСтрок(ЧередованиеЦветовСтрок) Экспорт

	Свойство("ЧередованиеЦветовСтрок", ЧередованиеЦветовСтрок);

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

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

Функция Шапка(Шапка) Экспорт

	Свойство("Шапка", Шапка);

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

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

Функция Ширина(Ширина) Экспорт

	Свойство("Ширина", Ширина);

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

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

Функция Шрифт(Шрифт) Экспорт

	Свойство("Шрифт", Шрифт);

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

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

Функция ШрифтЗаголовка(ШрифтЗаголовка) Экспорт

	Свойство("ШрифтЗаголовка", ШрифтЗаголовка);

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

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

Функция ШрифтПодвала(ШрифтПодвала) Экспорт

	Свойство("ШрифтПодвала", ШрифтПодвала);

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

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

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

#Область Элементы_Вспомогательные__У

Функция ТекущийЭлемент(Имя) Экспорт

	Элемент = Элементы.Найти(Имя, "Имя");

	Если Элемент = Неопределено Тогда

		ЭлементФормы = Форма.Элементы.Найти(Имя);

		Если ЭлементФормы = Неопределено Тогда
			ВызватьИсключение "Элемент не найден " + Имя;
		Иначе

			ТекущийЭлемент = ПараметрыСозданияЭлементов();
			ТекущийЭлемент.Имя = Имя;

			Элемент = Элементы.Добавить();
			Элемент.Имя = Имя;
			Элемент.Параметры = ТекущийЭлемент;
			Элемент.ЭлементФормы = ЭлементФормы;

		КонецЕсли;
	Иначе
		ТекущийЭлемент = Элемент.Параметры;
	КонецЕсли;

	ТекущийПоток = ТекущийЭлемент;

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

КонецФункции // ТекущийЭлемент

Функция СоздатьЭлементы()

	Для Каждого Элемент из Элементы Цикл
		Если Не Элемент.Обработан = Истина Тогда
			СоздатьЭлемент(Элемент);
		КонецЕсли;
	КонецЦикла;

	ТаблицаЭлементов();

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

КонецФункции // СоздатьЭлементы()


Функция СоздатьЭлемент(Элемент)

	ПараметрыСоздания = Элемент.Параметры;

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

	Место = НайтиЭлемент(ПараметрыСоздания.Место);

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

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

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

	Если не Место = Неопределено Тогда
		Форма.Элементы.Переместить(НовыйЭлемент, Родитель, Место);
	КонецЕсли;

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

	//Прочие свойства
	СтандартныеСвойства = ПараметрыСозданияЭлементов();
	Для Каждого ТекСвойство из ПараметрыСоздания Цикл
		Если СтандартныеСвойства.Свойство(ТекСвойство.Ключ) = Ложь Тогда
			ПрисвоитьСвойство(НовыйЭлемент, ТекСвойство);
		КонецЕсли;
	КонецЦикла;

	Элемент.ЭлементФормы = НовыйЭлемент;
	Элемент.Обработан = Истина;

	Возврат НовыйЭлемент;

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

Функция ПрисвоитьСвойство(ТекЭлемент, ТекСвойство)

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

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

Функция НайтиЭлемент(Имя)

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

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

	//Ищем в программных элементах
	ПрограммныйЭлемент = Элементы.Найти(Имя, "Имя");

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

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

КонецФункции // НайтиЭлемент()

Процедура ТаблицаЭлементов()

	Элементы = Новый ТаблицаЗначений;
	Элементы.Колонки.Добавить("Имя");
	Элементы.Колонки.Добавить("ЭлементФормы");
	Элементы.Колонки.Добавить("Параметры");
	Элементы.Колонки.Добавить("Обработан");

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

Функция ПараметрыСозданияЭлементов()

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

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

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

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

Процедура ПроверитьТекущийЭлемент()

	Если ТекущийЭлемент = Неопределено Тогда
		ВызватьИсключение "Элемент не инициализирован";
	КонецЕсли;

	Если НЕ ТекущийЭлемент = ТекущийПоток Тогда
		ВызватьИсключение "Обработчик не применим к команде";
	КонецЕсли;

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

Функция ПутьРеквизита(_ПутьРеквизита = "") Экспорт

	ПутьРеквизита = _ПутьРеквизита;

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

КонецФункции // ПутьРеквизита()

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

#Область Команды_Свойства__С

Функция ИзменяетСохраняемыеДанные(ИзменяетСохраняемыеДанные) Экспорт

	Свойство("ИзменяетСохраняемыеДанные", ИзменяетСохраняемыеДанные);

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

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

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

#Область Команды_Вспомогательные__У

Функция ТекущаяКоманда(Имя) Экспорт

	Команда = Команды.Найти(Имя, "Имя");

	Если Команда = Неопределено Тогда

		КомандаФормы = Форма.Команды.Найти(Имя);

		Если КомандаФормы = Неопределено Тогда
			ВызватьИсключение "Команда не найдена " + Имя;
		Иначе

			ТекущаяКоманда = ПараметрыСозданияКоманды();
			ТекущаяКоманда.Имя = Имя;

			Элемент = Команды.Добавить();
			Элемент.Имя = Имя;
			Элемент.Параметры = ТекущийЭлемент;
			Элемент.КомандаФормы = КомандаФормы;

		КонецЕсли;
	Иначе
		ТекущийЭлемент = Элемент.Параметры;
	КонецЕсли;

	ТекущийПоток = ТекущийЭлемент;

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

КонецФункции // ТекущийЭлемент

Функция СоздатьКоманды()

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

	ТаблицаКоманд();

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

КонецФункции // СоздатьКоманды()

Функция СоздатьКоманду(Команда)

	ПараметрыСоздания = Команда.Параметры;

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

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

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

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

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

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

	Команда.КомандаФормы = НоваяКоманда;
	Команда.Обработан = Истина;

	Возврат НоваяКоманда;

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

Процедура ТаблицаКоманд()

	Команды = Новый ТаблицаЗначений;
	Команды.Колонки.Добавить("Имя");
	Команды.Колонки.Добавить("КомандаФормы");
	Команды.Колонки.Добавить("Параметры");
	Команды.Колонки.Добавить("Обработан");

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

Функция ПараметрыСозданияКоманды()

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

	Результат.Вставить("Имя");
	Результат.Вставить("Действие");
	Результат.Вставить("ИзменяетСохраняемыеДанные");
	Результат.Вставить("Заголовок");
	Результат.Вставить("Картинка");
	Результат.Вставить("Подсказка");
	Результат.Вставить("СочетаниеКлавиш");

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

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

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

#Область Общие_Вспомогательные__О

Процедура ПроверитьТекущийПоток()

	Если ТекущийПоток = Неопределено Тогда
		ВызватьИсключение "Элемент не инициализирован";
	КонецЕсли;

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

Функция Применить() Экспорт

	СоздатьРеквизиты();
	СоздатьКоманды();
	СоздатьЭлементы();

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

КонецФункции // Применить()

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


#Использовать reflector

Перем _Рефлектор;

Функция ОбработатьЖелудь(Желудь, ОпределениеЖелудя) Экспорт // BSLLS:UnusedParameters-off

	Методы = ОпределениеЖелудя.НайтиМетодыСАннотациями("ФинальныйШтрих");

	Для Каждого Метод Из Методы Цикл
		_Рефлектор.ВызватьМетод(Желудь, Метод.Имя, Новый Массив());
	КонецЦикла;

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

&Напильник
&Порядок(999999)
Процедура ПриСозданииОбъекта()
	_Рефлектор = Новый Рефлектор();
КонецПроцедуры


#Использовать reflector

Процедура ПриДобавленииОпределенияЖелудя(Знач ОпределениеЖелудя) Экспорт

	ЭтоЗаготовка = ОпределениеЖелудя.Прозвища().Найти("Заготовка") <> Неопределено;
	Если НЕ ЭтоЗаготовка Тогда
		Возврат;
	КонецЕсли;

	РефлекторОбъекта = Новый РефлекторОбъекта(ОпределениеЖелудя.ТипЖелудя());

	Ожидаем
		.Что(
			РефлекторОбъекта.ЕстьПроцедура("ПриИнициализацииПоделки", 1),
			"Заготовка должна иметь процедуру ПриИнициализацииПоделки(Поделка)"
		)
		.ЭтоИстина();

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

&Приемка
Процедура ПриСозданииОбъекта()

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


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

	мОбъект = РеквизитФормыВЗначение("Объект");
	мОбъект.ДобавитьМеню(ЭтаФорма,"Graphs");

	ЭтаФорма.КоманднаяПанель.Видимость = Ложь;
	ЭтаФорма.АвтоЗаголовок = Ложь;
	ЭтаФорма.Заголовок = "Graphs";

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

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)
	ЗагрузитьНастройкиПользователя();
	СформироватьДиаграммы();
КонецПроцедуры

&НаКлиенте

Процедура КнопкаМеню(Команда)
	ИмяКоманды = Команда.Имя;
	мПараметры = новый Структура("Проверка,ТестируемыйКлиент",Объект.Проверка,Объект.ТестируемыйКлиент);
	ОткрытьФорму("ВнешняяОбработка.AllureSkin.Форма."+ИмяКоманды,мПараметры,ЭтаФорма,ЭтаФорма.УникальныйИдентификатор,ЭтаФорма.Окно);
КонецПроцедуры

&НаСервере

Процедура СформироватьДиаграммы()

	Объект.Проверка = ПолучитьПоследнююПроверкуДляТестируемогоКлиента(Объект.ТестируемыйКлиент);

	СформироватьДиаграммуСтатусы();
	СформироватьДиаграммуПродолжительность();
	СформироватьДиаграммуСерьезностьДефектов();
	СформироватьДиаграммуСоотношениеТестов();

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

&НаСервере

Процедура СформироватьДиаграммуСтатусы()

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

	Диаграмма_Статус.Очистить();

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

	Диаграмма_Статус.ТипДиаграммы=ТипДиаграммы[ВидГрафика_Статус];
	СерияПадения = Диаграмма_Статус.УстановитьСерию("Падения");
	СерияОшибки = Диаграмма_Статус.УстановитьСерию("Ошибки");
	СерияПропуски = Диаграмма_Статус.УстановитьСерию("Пропуски");
	СерияУспешно = Диаграмма_Статус.УстановитьСерию("Успешно");

	КоличествоПровалов = 0;
	КоличествоОшибок = 0;
	КоличествоПропущенных = 0;
	КоличествоУспешных = 0;
	КоличествоТестовыхСлучаев = 1;

	ТочкаДиаграммы = Диаграмма_Статус.УстановитьТочку(0);

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

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

	Если Выборка.Следующий() Тогда
		КоличествоТестовыхСлучаев = Выборка.КоличествоТестовыхСлучаев;
		Если КоличествоТестовыхСлучаев<>0 Тогда
			КоличествоПровалов = Выборка.КоличествоПровалов/КоличествоТестовыхСлучаев*100;
			КоличествоОшибок = Выборка.КоличествоОшибок/КоличествоТестовыхСлучаев*100;
			КоличествоПропущенных = Выборка.КоличествоПропущенных/КоличествоТестовыхСлучаев*100;
			КоличествоУспешных = Выборка.КоличествоУспешных/КоличествоТестовыхСлучаев*100;
		КонецЕсли;
	КонецЕсли;

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

	СерияПадения.Цвет = новый Цвет(255,50,50);
	СерияОшибки.Цвет = новый Цвет(255,165,15);
	СерияУспешно.Цвет = новый Цвет(50,195,50);
	СерияПропуски.Цвет = новый Цвет(195,195,195);

	Диаграмма_Статус.ВидПодписей=ВидПодписейКДиаграмме.СерияПроцент;

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

&НаСервере


Процедура НайтиСопоставленияСервер()

	КешТестов = новый Соответствие;
	КешПроверок = новый Соответствие;
	КешТестируемыхКлиентов = новый Соответствие;

	Для каждого стр из ТаблицаТестов Цикл

		Если НЕ ЗначениеЗаполнено(стр.Проверка) Тогда

			Проверка = КешПроверок.Получить(стр.НомерПроверки);

			Если Проверка=Неопределено Тогда

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

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

				КешПроверок.Вставить(стр.НомерПроверки,Проверка);
				стр.Проверка = Проверка;

			Иначе
				стр.Проверка = Проверка;
			КонецЕсли;

		КонецЕсли;

		Тест = КешТестов.Получить(стр.НаименованиеТеста);

		Если Тест = Неопределено Тогда

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

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

			Если НЕ ЗначениеЗаполнено(Тест) Тогда
				Тест = стр.НаименованиеТеста;
			КонецЕсли;
			КешТестов.Вставить(стр.НаименованиеТеста,Тест);
			стр.Тест = Тест;

		Иначе
			стр.Тест = Тест;
		КонецЕсли;

		Если НЕ ЗначениеЗаполнено(стр.ТестируемыйКлиент) Тогда

			ТестируемыйКлиент = КешТестируемыхКлиентов.Получить(стр.СтрокаПодключения);

			Если ТестируемыйКлиент= Неопределено Тогда

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

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

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

			Иначе
				стр.ТестируемыйКлиент = ТестируемыйКлиент;
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;

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

&НаСервере


Процедура ВыполнениеДействийЗаданийИзПуллаПоТипуЗапуститьПриложение(Знач ВыборкаДетальная) Экспорт

	Сообщение = "";

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

	МенеджерЗаписи.Прочитать();

	// если нет данных после чтения
	МенеджерЗаписи.Задание 				= ВыборкаДетальная.Задание;
	МенеджерЗаписи.ТестируемыйКлиент 	= ВыборкаДетальная.ТестируемыйКлиент;
	МенеджерЗаписи.ПорядокВыполнения 	= ВыборкаДетальная.ПорядокВыполнения;
	МенеджерЗаписи.ПодчиненноеЗадание 	= ВыборкаДетальная.ПодчиненноеЗадание;
	МенеджерЗаписи.Действие				= ВыборкаДетальная.Действие;
	МенеджерЗаписи.Проверка 			= ВыборкаДетальная.Проверка;

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

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

	Если ЗначениеЗаполнено(СтрокаЗапуска) Тогда
		Если СтруктураДействия.ИспользоватьКомандуПлатформыЗапуститьПриложение=Истина Тогда
			ЗапуститьПриложение(СтрокаЗапуска);
			МенеджерЗаписи.Статус = Перечисления.СтатусыЗаданий.Успешно;
			МенеджерЗаписи.Сообщение = "Запущено приложение типовой командой платформы ""ЗапуститьПриложение"".";
			УстановитьЗначениеПеременной(ВыборкаДетальная.Задание,Справочники.ИменаПеременных.PID,0,ВыборкаДетальная.Проверка);
		Иначе
			Если ЗначениеЗаполнено(СтруктураДействия.РабочееМесто) Тогда
				СтруктураКомпьютера = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтруктураДействия.РабочееМесто,"ИмяКомпьютера,IPv4");
				Компьютер = "";
				Если ЗначениеЗаполнено(СтруктураКомпьютера.IPv4) Тогда
					Компьютер = СтруктураКомпьютера.IPv4;
				ИначеЕсли ЗначениеЗаполнено(СтруктураКомпьютера.ИмяКомпьютера) Тогда
					Компьютер = СтруктураКомпьютера.ИмяКомпьютера;
				Иначе
					Сообщение = "В настройках выбранного рабочего места, не указаны 'ИмяКомпьютера' or 'IPv4'. Не могу запустить удаленно!";
				КонецЕсли;
				Если ЗначениеЗаполнено(Компьютер) Тогда
					PID = ПланировщикЗаданийКлиентСервер.ЗапуститьПриложениеУдаленно(СтрокаЗапуска,Компьютер,Сообщение);
				КонецЕсли;
			Иначе
				PID = ПланировщикЗаданийКлиентСервер.ЗапуститьПриложениеЛокально(СтрокаЗапуска,Сообщение);
			КонецЕсли;

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

	МенеджерЗаписи.ДополнительноеСообщение = СтрокаЗапуска;
	МенеджерЗаписи.ЭтапВыполнен = Истина;
	МенеджерЗаписи.ДатаВыполнения = ТекущаяДата();
	МенеджерЗаписи.ДатаВыполненияСек = ПланировщикЗаданийКлиентСервер.ПреобразоватьДатуВСек(МенеджерЗаписи.ДатаВыполнения);

	МенеджерЗаписи.Записать(Истина);

	СоздатьЗаписьЛогВыполненныхЗаданий(ВыборкаДетальная.Задание, ВыборкаДетальная.Сборка, МенеджерЗаписи.ДатаВыполнения, МенеджерЗаписи);

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

Процедура ВыполнениеДействийЗаданийИзПуллаПоТипуЗакрытьПриложение(Знач ВыборкаДетальная) Экспорт

	Сообщение = "";
	PID = -1;

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

	МенеджерЗаписи.Прочитать();

	МенеджерЗаписи.Задание 				= ВыборкаДетальная.Задание;
	МенеджерЗаписи.ТестируемыйКлиент 	= ВыборкаДетальная.ТестируемыйКлиент;
	МенеджерЗаписи.ПорядокВыполнения 	= ВыборкаДетальная.ПорядокВыполнения;
	МенеджерЗаписи.ПодчиненноеЗадание 	= ВыборкаДетальная.ПодчиненноеЗадание;
	МенеджерЗаписи.Действие 			= ВыборкаДетальная.Действие;
	МенеджерЗаписи.Проверка 			= ВыборкаДетальная.Проверка;

	PID = ПолучитьЗначениеПеременной(ВыборкаДетальная.Задание,Справочники.ИменаПеременных.PID,ВыборкаДетальная.Проверка);

	Если PID=Неопределено или pid=-1 Тогда
		МенеджерЗаписи.Статус = Перечисления.СтатусыЗаданий.Успешно;
		МенеджерЗаписи.Сообщение = "Информация о запуске приложения отсутсвует. Закрытие не требуется.";
	Иначе
		Результат = ПланировщикЗаданийКлиентСервер.ЗавершитьПроцессЛокально(PID,Сообщение);

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

	МенеджерЗаписи.ЭтапВыполнен = Истина;
	МенеджерЗаписи.ДатаВыполнения = ТекущаяДата();
	МенеджерЗаписи.ДатаВыполненияСек = ПланировщикЗаданийКлиентСервер.ПреобразоватьДатуВСек(МенеджерЗаписи.ДатаВыполнения);

	МенеджерЗаписи.Записать(Истина);

	СоздатьЗаписьЛогВыполненныхЗаданий(ВыборкаДетальная.Задание, ВыборкаДетальная.Сборка, МенеджерЗаписи.ДатаВыполнения, МенеджерЗаписи);

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


// Программно размещает элемент на форме
// СтруктураЭлемента может содержать параметры:
//  ИмяРодителя - Имя элемента-родителя добавляемого элемента. Если не указан - добавляется на верхний уровень
//  ИмяСледующегоЭлемента - Имя элемента, перед которым мы вставляем новый элемент. Если не указан - добавляется в конец
// Прочие параметры совпадают с именами свойств добавляемого элемента(Видимость, ширина, и т.п.)
//
// Параметры:
//  Форма - УправляемаяФорма - Форма, на которой размещается элемент
//  Имя	- Строка - Уникальное имя элемента формы
//  Тип	- Тип - Тип добавляемого элемента (Поле формы, группа формы, таблица формы и т.п.)
//  СтруктураЭлемента - Структура - Структура, содержащая параметры создаваемого элемента
//
// Возвращаемое значение:
//  ЭлементФормы - Добавленный элемент
//
Функция ВставитьЭлемент(Форма, Имя, Тип, СтруктураЭлемента) Экспорт

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

	СледующийЭлемент=Неопределено;
	ИмяСледующегоЭлемента="";
	Если СтруктураЭлемента.Свойство("ИмяСледующегоЭлемента", ИмяСледующегоЭлемента)
		И ЗначениеЗаполнено(ИмяСледующегоЭлемента) Тогда
		СледующийЭлемент=Форма.Элементы[ИмяСледующегоЭлемента];
	КонецЕсли;

	Элемент=Форма.Элементы.Вставить(Имя, Тип, Родитель, СледующийЭлемент);

	ЗаполнитьЗначенияСвойств(Элемент,СтруктураЭлемента);

	Возврат Элемент;

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

// Программно удаляет элемент с формы, не может удалять элементы добавленные конструктором через конфигуратор
//
// Параметры:
//  Форма - УправляемаяФорма - Форма, на которой размещается элемент
//  Имя	- Строка - Уникальное имя элемента формы
//
Процедура УдалитьЭлемент(Форма, Имя) Экспорт

	Элемент = Форма.Элементы.Найти(Имя);
	Если НЕ Элемент=Неопределено Тогда
		Форма.Элементы.Удалить(Элемент);
	КонецЕсли;

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

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

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

	Возврат ВставитьЭлемент(Форма, Имя, Тип, СтруктураЭлемента);

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

// Программно првоеряет наличие реквизиты
//
// Параметры:
//  Форма - УправляемаяФорма - Форма, на которой размещается элемент
//  Имя	- Строка - Уникальное имя элемента формы
//
// Возвращаемое значение:
//  РеквизитНайден - Найден или нет реквизит (Истина, Ложь)
//
Функция ЕстьРеквизит(Форма, Имя) Экспорт

	РеквизитНайден=Ложь;

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

	Возврат РеквизитНайден;

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


Функция СоздатьНовоеРабочееМесто(ИмяКомпьютера,ОперационнаяСистема,КаталогПоУмолчанию,Пользователь) Экспорт

	РезультатОперации = Ложь;
	УстановитьПривилегированныйРежим(Истина);

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

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

		РабочееМестоОбъект = Справочники.РабочиеМеста.СоздатьЭлемент();
		РабочееМестоОбъект.ИмяКомпьютера = ИмяКомпьютера;
		РабочееМестоОбъект.ОперационнаяСистема = ОперационнаяСистема;

		Попытка
			РабочееМестоОбъект.Записать();
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;

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

		МенеджерНабораЗаписей.Записать();

	КонецЕсли;

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

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


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

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

	СтруктураДанных = новый Структура;
	СтруктураДанных.Вставить("Проверка",Строка(Проверка));
	СтруктураДанных.Вставить("ДатаНачала",Проверка.ДатаНачала);
	СтруктураДанных.Вставить("ДатаНачалаСтрокой",Строка(Формат(Проверка.ДатаНачала,"ДЛФ=DDT")));
	СтруктураДанных.Вставить("ТестируемыйКлиентID",ТестируемыйКлиент.ID);
	СтруктураДанных.Вставить("ТестируемыйКлиентПредставление",ТестируемыйКлиент.Наименование);
	СтруктураДанных.Вставить("ТипОбъекта","Таблица");
	СтруктураДанных.Вставить("ПолеФильтра","ИндексКартинки");
	СтруктураДанных.Вставить("МассивСтрокТаблицы",новый Массив);
	СтруктураДанных.Вставить("МассивКолонок",новый Массив);

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

	Запрос.УстановитьПараметр("ТестируемыйКлиент",ТестируемыйКлиент);
	Запрос.УстановитьПараметр("Тест",Тест);
	Запрос.УстановитьПараметр("Проверка",Проверка);
	Запрос.УстановитьПараметр("Порядок",0);

	Таблица = Запрос.Выполнить().Выгрузить();

	Если Таблица.Количество()=0 Тогда
		Запрос.УстановитьПараметр("Порядок",1);
		Таблица = Запрос.Выполнить().Выгрузить();
	КонецЕсли;

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

		Если врег(колонка.Имя)=врег("КоличествоПровалов") Тогда
			СтруктураКолонки.Вставить("ИмяКартинкиЗаголовка","FailedQuad_32x33");
		ИначеЕсли врег(колонка.Имя)=врег("КоличествоОшибок") Тогда
			СтруктураКолонки.Вставить("ИмяКартинкиЗаголовка","BrokenQuad_32x32");
		ИначеЕсли врег(колонка.Имя)=врег("КоличествоПропущенных") Тогда
			СтруктураКолонки.Вставить("ИмяКартинкиЗаголовка","SkippedQuad_32x35");
		КонецЕсли;
		СтруктураДанных.МассивКолонок.Добавить(СтруктураКолонки);
	КонецЦикла;

	// данные
	Для каждого стр из Таблица Цикл

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

	КонецЦикла;

	Возврат СтруктураДанных;

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

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


Функция	мСценРедактор_ПолучитьМассивСтруктурДоступныхТиповОбъектовТестируемогоПриложения()

	ДоступныеЭлементыТестируемогоИнтерфейсаМассив = новый Массив;

	// FormField
	стр_н = новый Структура;
	стр_н.Вставить("Имя","FormField");
	стр_н.Вставить("Синоним","Поле формы");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// FormItemAddition
	стр_н = новый Структура;
	стр_н.Вставить("Имя","FormItemAddition");
	стр_н.Вставить("Синоним","Дополнение элемента формы");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// FormDecoration
	стр_н = новый Структура;
	стр_н.Вставить("Имя","FormDecoration");
	стр_н.Вставить("Синоним","Декорация формы");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// FormButton
	стр_н = новый Структура;
	стр_н.Вставить("Имя","FormButton");
	стр_н.Вставить("Синоним","Кнопка формы");
	стр_н.Вставить("ДоступныеКоманды","Активизировать Нажать");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// FormGroup
	стр_н = новый Структура;
	стр_н.Вставить("Имя","FormGroup");
	стр_н.Вставить("Синоним","Группа формы");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// FormTable
	стр_н = новый Структура;
	стр_н.Вставить("Имя","FormTable");
	стр_н.Вставить("Синоним","Таблица формы");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// CommandInterfaceButton
	стр_н = новый Структура;
	стр_н.Вставить("Имя","CommandInterfaceButton");
	стр_н.Вставить("Синоним","Кнопка командного интерфейса");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// CommandInterfaceGroup
	стр_н = новый Структура;
	стр_н.Вставить("Имя","CommandInterfaceGroup");
	стр_н.Вставить("Синоним","Группа командного интерфейса");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	//// FormField
	//стр_н = новый Структура;
	//стр_н.Вставить("Имя","");
	//стр_н.Вставить("Синоним","<любой>");
	//ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	Возврат ДоступныеЭлементыТестируемогоИнтерфейсаМассив;

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

&НаКлиенте

Функция	мСценРедактор_ПолучитьМассивСтруктурТиповОбъектовТестируемогоПриложения()

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

	// ClientApplicationWindow
	стр_н = новый Структура;
	стр_н.Вставить("Имя","ClientApplicationWindow");
	стр_н.Вставить("Синоним","Окно клиентского приложения");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// CommandInterface
	стр_н = новый Структура;
	стр_н.Вставить("Имя","CommandInterface");
	стр_н.Вставить("Синоним","Командный интерфейс");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// CommandInterface
	стр_н = новый Структура;
	стр_н.Вставить("Имя","Form");
	стр_н.Вставить("Синоним","Форма");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	Возврат ДоступныеЭлементыТестируемогоИнтерфейсаМассив;

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

&НаКлиенте

Функция	мСценРедактор_ПолучитьМассивСтруктурТиповОбъектовТестируемогоПриложенияAutomationUI()

	ДоступныеЭлементыТестируемогоИнтерфейсаМассив = новый Массив;

	// Любой
	стр_н = новый Структура;
	стр_н.Вставить("Имя","");
	стр_н.Вставить("Синоним","Произвольный - other");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// Window
	стр_н = новый Структура;
	стр_н.Вставить("Имя","window");
	стр_н.Вставить("Синоним","window - окно");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// Button
	стр_н = новый Структура;
	стр_н.Вставить("Имя","button");
	стр_н.Вставить("Синоним","Button - кнопка");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// CheckBox
	стр_н = новый Структура;
	стр_н.Вставить("Имя","checkbox");
	стр_н.Вставить("Синоним","CheckBox - переключатель");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// Edit
	стр_н = новый Структура;
	стр_н.Вставить("Имя","edit");
	стр_н.Вставить("Синоним","Edit - ввод текста");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// TabItem
	стр_н = новый Структура;
	стр_н.Вставить("Имя","tabitem");
	стр_н.Вставить("Синоним","TabItem - элемент вкладки");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// Text
	стр_н = новый Структура;
	стр_н.Вставить("Имя","text");
	стр_н.Вставить("Синоним","Text - текст");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// RadioButton
	стр_н = новый Структура;
	стр_н.Вставить("Имя","radiobutton");
	стр_н.Вставить("Синоним","RadioButton - радио кнопка");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// Pane
	стр_н = новый Структура;
	стр_н.Вставить("Имя","pane");
	стр_н.Вставить("Синоним","Pane - панель");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// MenuItem
	стр_н = новый Структура;
	стр_н.Вставить("Имя","menuitem");
	стр_н.Вставить("Синоним","MenuItem - элемент меню");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// Custom
	стр_н = новый Структура;
	стр_н.Вставить("Имя","custom");
	стр_н.Вставить("Синоним","Custom - пользовательский");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	Возврат ДоступныеЭлементыТестируемогоИнтерфейсаМассив;

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

&НаКлиенте

Функция	мСценРедактор_ПолучитьМассивСтруктурТиповОбъектовТестируемогоПриложенияSelenium()

	ДоступныеЭлементыТестируемогоИнтерфейсаМассив = новый Массив;

	// div
	стр_н = новый Структура;
	стр_н.Вставить("Имя","div");
	стр_н.Вставить("Синоним","div - слой");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// input
	стр_н = новый Структура;
	стр_н.Вставить("Имя","input");
	стр_н.Вставить("Синоним","input - ввод");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// a
	стр_н = новый Структура;
	стр_н.Вставить("Имя","a");
	стр_н.Вставить("Синоним","a - ссылка");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// span
	стр_н = новый Структура;
	стр_н.Вставить("Имя","span");
	стр_н.Вставить("Синоним","span - контейнер");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// textarea
	стр_н = новый Структура;
	стр_н.Вставить("Имя","textarea");
	стр_н.Вставить("Синоним","textarea - область текста");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// img
	стр_н = новый Структура;
	стр_н.Вставить("Имя","img");
	стр_н.Вставить("Синоним","img - картинка");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// li
	стр_н = новый Структура;
	стр_н.Вставить("Имя","li");
	стр_н.Вставить("Синоним","li - элент списка");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// td
	стр_н = новый Структура;
	стр_н.Вставить("Имя","td");
	стр_н.Вставить("Синоним","td - ячейка таблицы");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	// другой
	стр_н = новый Структура;
	стр_н.Вставить("Имя","");
	стр_н.Вставить("Синоним","произвольный");
	ДоступныеЭлементыТестируемогоИнтерфейсаМассив.Добавить(стр_н);

	Возврат ДоступныеЭлементыТестируемогоИнтерфейсаМассив;

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

// Функция - получить массив структур серьезности дефектов
//
// Возвращаемое значение:
//  массив - список серьезности значений
//
&НаКлиенте


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

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

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

// Получить структуру параметров входа
//
// Параметры:
//  ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - ссылка на поток, параметры которого получаем.
//  ЗаполнятьПоУмолчанию - Булево - добавлять ли в возвращаемую структуру значения по умолчанию
//    - Ложь - возвращает структуру вида ИмяПараметра<Строка>:ТипЗначения<ПеречислениеСсылка.пбп_ТипыJSON>
//    - Истина - возвращает структуру вида ИмяПараметра<Строка>:ЗначениеПоУмолчанию<Строка>
//
// Возвращаемое значение:
//   - Структура
//
Функция ПолучитьСтруктуруПараметровВхода(ИнтеграционныйПоток, ЗаполнятьПоУмолчанию = Ложь) Экспорт

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

	Запрос.УстановитьПараметр("ИнтеграционныйПоток", ИнтеграционныйПоток);

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

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

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

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

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

	КонецЦикла;

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

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

// Получает структуру параметров метода интеграции со значениями по умолчанию
//
// Параметры:
//  Значение - СправочникСсылка.пбп_МетодыИнтеграции - ссылка на метод, параметры которого получаем.
//  ТипJSON - ПеречислениеСсылка.пбп_ТипыJSON - добавлять ли в возвращаемую структуру значения по умолчанию
//
// Возвращаемое значение:
//   - Строка - приведенное к JSON поле типа
//
Функция ПривестиЗначениеПоУмолчаниюREST(Значение, ТипJSON) Экспорт

	Если Не ЗначениеЗаполнено(Значение) Тогда
		Если ТипJSON = Перечисления.пбп_ТипыJSON.Строка Тогда
			Возврат "";
		ИначеЕсли ТипJSON = Перечисления.пбп_ТипыJSON.Число Тогда
			Возврат 0;
		Иначе
			Возврат "null";
		КонецЕсли;
	КонецЕсли;

	Если ТипJSON = Перечисления.пбп_ТипыJSON.Булево Тогда
		ПреобразованноеЗначение = ?(Значение, "true", "false");
	ИначеЕсли ТипJSON = Перечисления.пбп_ТипыJSON.Дата Тогда
		ПреобразованноеЗначение = Формат(Значение, "ДФ=yyyy-MM-dd");
	ИначеЕсли ТипJSON = Перечисления.пбп_ТипыJSON.Число Тогда
		ПреобразованноеЗначение = Формат(Значение, "ЧГ=0");
	ИначеЕсли ТипJSON = Перечисления.пбп_ТипыJSON.Строка Тогда
		ПреобразованноеЗначение = Значение;
	Иначе
		ПреобразованноеЗначение = "";
	КонецЕсли;

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

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

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

#КонецЕсли


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

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

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

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

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

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

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

		Если ЗначениеЗаполнено(ПользовательскаяФункцияДоИзменения)
			И Не ЗначениеЗаполнено(ПользовательскаяФункция) Тогда
			УдалитьРегламентноеЗаданиеПоКлючу(Истина);
		КонецЕсли;

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

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

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

	Если ПометкаУдаления И Не ПустаяСтрока(КлючРегламентногоЗадания) Тогда
		УдалитьРегламентноеЗаданиеПоКлючу(Ложь);
	КонецЕсли;

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

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

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

Процедура ОбновитьПараметрыРегламентногоЗадания()

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

	Если МассивРегламентныхЗаданий.Количество() Тогда
		РегламентноеЗадание = МассивРегламентныхЗаданий[0];

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

		РегламентноеЗадание.Параметры = ПараметрыРегламентногоЗадания;
		РегламентноеЗадание.Записать();
	КонецЕсли;

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

Процедура УдалитьРегламентноеЗаданиеПоКлючу(ПользовательскаяФункция)

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

		Если МассивРегламентныхЗаданий.Количество() Тогда
			РегламентноеЗадание = МассивРегламентныхЗаданий[0];
			пбп_Переадресация.УдалитьЗадание(РегламентноеЗадание.УникальныйИдентификатор);
		КонецЕсли;
	Иначе
		ДанныеРеглЗадания = Неопределено;
		Если Метаданные.РегламентныеЗадания.Найти(КлючРегламентногоЗадания) <> Неопределено Тогда
			ДанныеРеглЗадания = Метаданные.РегламентныеЗадания[КлючРегламентногоЗадания];
		КонецЕсли;

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

		МассивРегламентныхЗаданий = пбп_Переадресация.НайтиЗадания(ОтборЗадания);

		Если МассивРегламентныхЗаданий.Количество() Тогда
			// Для предопределенного восстанавливаем настройки из конфигуратора
			Если ДанныеРеглЗадания.Предопределенное Тогда
				РегламентноеЗадание = МассивРегламентныхЗаданий[0];
				РегламентноеЗадание.Использование	= ДанныеРеглЗадания.Использование;
				Если ДанныеРеглЗадания.Расписание <> Неопределено Тогда
					РегламентноеЗадание.Расписание	= ДанныеРеглЗадания.Расписание;
				Иначе
					РегламентноеЗадание.Расписание	= Новый РасписаниеРегламентногоЗадания;
				КонецЕсли;
				РегламентноеЗадание.Записать();
			Иначе
				РегламентноеЗадание = МассивРегламентныхЗаданий[0];
				пбп_Переадресация.УдалитьЗадание(РегламентноеЗадание.УникальныйИдентификатор);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

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

Функция ПолучитьУникальныйИдентификаторТекущейНастройки()

	Возврат Строка(Ссылка.УникальныйИдентификатор());

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли


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

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

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПриСозданииНаСервере(ЭтотОбъект);
	// Конец пбп_ПредопределенныеЗначения

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

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначенияКлиент.ОбработкаОповещения(ИмяСобытия, Элементы.Список);
	// Конец пбп_ПредопределенныеЗначения

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

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

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

// пбп_ПредопределенныеЗначения
&НаКлиенте
Процедура Подключаемый_ПредопределенныеВыполнитьКоманду(Команда)
	пбп_ПредопределенныеЗначенияКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры
// Конец пбп_ПредопределенныеЗначения

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


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

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

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

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

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

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

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

	// пбп_ПредопределенныеЗначения
	пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
	// Конец пбп_ПредопределенныеЗначения

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

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

#КонецЕсли


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

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

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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	Представление = СтрШаблон("%1 от %2",
		Данные.Ссылка.ИнтеграционныйПоток.Наименование,
		Данные.Ссылка.ДатаИнтеграции);

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

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

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

// Процедура очищает записи в справочнике старше чем установленное в предопределенном значении количество дней
Процедура ОчиститьИсториюИнтеграции() Экспорт

	Источник = ПланыВидовХарактеристик.пбп_ПредопределенныеЗначения;

	КолДнейХраненияИстории = пбп_ПредопределенныеЗначения.ПредопределенныйЭлемент(Источник,
		"КолДнейХраненияИсторииИнтеграции");
	КоличествоДнейХранения = пбп_ПредопределенныеЗначения.ЗначениеПредопределенногоЭлемента(Источник,
		КолДнейХраненияИстории);

	КолДнейХраненияОшибок = пбп_ПредопределенныеЗначения.ПредопределенныйЭлемент(Источник,
		"КолДнейХраненияОшибокИсторииИнтеграции");
	КоличествоДнейХраненияОшибок = пбп_ПредопределенныеЗначения.ЗначениеПредопределенногоЭлемента(Источник,
		КолДнейХраненияОшибок);

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ИсторияИнтеграции.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.пбп_ИсторияИнтеграции КАК ИсторияИнтеграции
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.пбп_ИнтеграционныеПотоки КАК ИнтеграционныеПотоки
	|		ПО ИсторияИнтеграции.ИнтеграционныйПоток = ИнтеграционныеПотоки.Ссылка
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.пбп_ОжиданиеАсинхронныхВызовов КАК ОжиданиеАсинхронныхВызовов
	|		ПО ИсторияИнтеграции.Ссылка = ОжиданиеАсинхронныхВызовов.ИсходящееСообщение
	|		И НЕ ОжиданиеАсинхронныхВызовов.Статус = ЗНАЧЕНИЕ(Перечисление.пбп_СтатусыАсинхронныхВызовов.Успешно)
	|ГДЕ
	|	(ИсторияИнтеграции.Ошибка
	|				И ВЫБОР
	|					КОГДА ИнтеграционныеПотоки.КоличествоДнейХраненияОшибок <> 0
	|						ТОГДА ИсторияИнтеграции.ДатаИнтеграции < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -ИнтеграционныеПотоки.КоличествоДнейХраненияОшибок)
	|					ИНАЧЕ ВЫБОР
	|							КОГДА &ДнейХраненияОшибок = 0
	|								ТОГДА ЛОЖЬ
	|							ИНАЧЕ ИсторияИнтеграции.ДатаИнтеграции < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -&ДнейХраненияОшибок)
	|						КОНЕЦ
	|				КОНЕЦ
	|			ИЛИ НЕ ИсторияИнтеграции.Ошибка
	|				И ВЫБОР
	|					КОГДА ИнтеграционныеПотоки.КоличествоДнейХранения <> 0
	|						ТОГДА ИсторияИнтеграции.ДатаИнтеграции < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -ИнтеграционныеПотоки.КоличествоДнейХранения)
	|					ИНАЧЕ ВЫБОР
	|							КОГДА &ДнейХранения = 0
	|								ТОГДА ЛОЖЬ
	|							ИНАЧЕ ИсторияИнтеграции.ДатаИнтеграции < ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -&ДнейХранения)
	|						КОНЕЦ)
	|	И НЕ ОжиданиеАсинхронныхВызовов.ИсходящееСообщение ЕСТЬ NULL";

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

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

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

	Попытка

		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

			ЗаписьИсторииОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
			ЗаписьИсторииОбъект.Удалить();

		КонецЦикла;

	Исключение

		ИмяСобытия = НСтр("ru = 'Очистка истории интеграции'");
		ЗаголовокОшибки = СтрШаблон("Не удалось удалить запись истории интеграции %1", ВыборкаДетальныеЗаписи.Ссылка);

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

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

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

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

#КонецЕсли


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

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

#Область СлужебныйПрограммныйИнтерфейс

Функция ПолучитьДанныеФайлаСообщения() Экспорт

	Возврат ФайлСообщения.Получить();

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

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

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

Процедура ПередУдалением(Отказ)

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

	ОбменДанными.Загрузка = Истина;
	ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'; en = 'Invalid object call on client.'");
#КонецЕсли


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

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

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

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

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

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

	НастроитьДоступностьСсылкиНастройкиРасписания();

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

&НаКлиенте
Процедура ИспользоватьРегламентноеЗаданиеПриИзменении(Элемент)

	НастроитьДоступностьСсылкиНастройкиРасписания();
	ИспользоватьРегламентноеЗаданиеПриИзмененииНаСервере();

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

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

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

&НаКлиенте
Процедура НастроитьРасписаниеРегламентногоЗадания(Команда)

	Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеРегламентногоЗадания);
	ОписаниеОповещения = Новый ОписаниеОповещения("РедактированиеРасписанияРегламентногоЗаданияЗавершение", ЭтотОбъект);
	Диалог.Показать(ОписаниеОповещения);

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

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

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

&НаСервере
Функция ПолучитьРегламентноеЗадание()

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

	Если МассивРегламентныхЗаданий.Количество() Тогда
		РегламентноеЗадание = МассивРегламентныхЗаданий[0];
	Иначе
		ПараметрыЗадания.Вставить("Использование"	, Истина);
		ПараметрыЗадания.Вставить("Расписание"		, Новый РасписаниеРегламентногоЗадания());

		РегламентноеЗадание = пбп_Переадресация.ДобавитьЗадание(ПараметрыЗадания);
	КонецЕсли;

	Возврат РегламентноеЗадание;

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

&НаКлиенте
Процедура НастроитьДоступностьСсылкиНастройкиРасписания()

	Элементы.НастроитьРасписаниеРегламентногоЗадания.Доступность = ИспользоватьРегламентноеЗадание;

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

&НаСервере
Процедура ИспользоватьРегламентноеЗаданиеПриИзмененииНаСервере()

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

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

&НаКлиенте
Процедура РедактированиеРасписанияРегламентногоЗаданияЗавершение(Расписание, ДополнительныеПараметры) Экспорт

	Если Расписание <> Неопределено Тогда
		РасписаниеРегламентногоЗадания = Расписание;
		ЗаписатьРегламентноеЗаданиеПослеИзмененияРасписания();
	КонецЕсли;

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

&НаСервере
Процедура ЗаписатьРегламентноеЗаданиеПослеИзмененияРасписания()

	РегламентноеЗадание					= ПолучитьРегламентноеЗадание();
	РегламентноеЗадание.Расписание		= РасписаниеРегламентногоЗадания;
	РегламентноеЗадание.Использование	= ИспользоватьРегламентноеЗадание;
	РегламентноеЗадание.Записать();

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

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