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

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

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

	ОбновитьДоступностьРедактированияФормы();
	ОформлениеВидимостиАвторизацииWindows();
	ОформлениеВидимостиАвторизации1С();
	//Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
	ОбновитьТаблицуРолей();
    // TODO: допиши оставшуюся часть

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

	Если ЗначениеЗаполнено(Объект.Комментарий) Тогда
		Элементы.СтраницаКомментарий.Картинка = БиблиотекаКартинок.Карандаш_16х16;
	КонецЕсли;

	ОбновитьДоступностьРедактированияФормы();
	ОформлениеВидимостиАвторизацииWindows();
	ОформлениеВидимостиАвторизации1С();
	//Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
	ОбновитьТаблицуРолей();
	//КонецЕсли;

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

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

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

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
		Если Объект.АутентификацияСтандартная=Истина Тогда
		Если НЕ ЗначениеЗаполнено(Пароль1С) Тогда
			Отказ = Истина;
			Сообщить("Не заполнен пароль 1С");
			Возврат;
		КонецЕсли;
		Если СтрДлина(Пароль1С)<5 Тогда
			Отказ= Истина;
			Сообщить("Длина пароля должна быть не менее 5 символов");
			Возврат;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

	ТекущийОбъект.Пароль1С = новый ХранилищеЗначения(Пароль1С);
	ТекущийОбъект.ДополнительныеСвойства.Вставить("ТаблицаПрав",Права.Выгрузить());

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

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

	ОбновитьДоступностьРедактированияФормы();

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

&НаКлиенте
Процедура АутентификацияОСПриИзменении(Элемент)
	ОформлениеВидимостиАвторизацииWindows();
КонецПроцедуры

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

&НаСервере
Процедура ОбновитьТаблицуРолей()

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

	// проставим установленные
	ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Объект.ИдентификаторПользователяИБ);
	Если НЕ ПользовательИБ=Неопределено Тогда
		Для каждого стр из ПользовательИБ.Роли Цикл
			мОтбор = новый Структура("Имя",стр.Имя);
			н_строки = Права.НайтиСтроки(мОтбор);
			Если н_строки.Количество()=1 Тогда
				н_строки[0].Выбрана = Истина;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

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

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

	Если ЗначениеЗаполнено(Объект.Комментарий) Тогда
		Элементы.СтраницаКомментарий.Картинка = БиблиотекаКартинок.Карандаш_16х16;
	Иначе
		Элементы.СтраницаКомментарий.Картинка = новый Картинка;
	КонецЕсли;

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

&НаСервере
Процедура ОбновитьДоступностьРедактированияФормы()

	ПолныйДоступ = Ложь;

	ТекущийПользователь = ПользователиКлиентСервер.ТекущийПользователь();
	ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ТекущийПользователь.ИдентификаторПользователяИБ);
	Если НЕ ПользовательИБ=Неопределено Тогда
		Для каждого стр из ПользовательИБ.Роли Цикл
			Если стр.Имя="ПолныеПрава" Тогда
				ПолныйДоступ = Истина;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

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

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

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

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

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

&НаКлиенте
Процедура Аутентификация1СПриИзменении(Элемент)
	ОформлениеВидимостиАвторизации1С();
КонецПроцедуры

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

&НаКлиенте
Процедура ПодтверждениеПароля1СПриИзменении(Элемент)
	ПоследнееПодтверждение = "";
	ПроверитьПодтверждениеПароля();
КонецПроцедуры

&НаКлиенте
Процедура ПодтверждениеПароля1СИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
	ПроверитьПодтверждениеПароля(Элемент);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьПодтверждениеПароля(ПолеПароля = Неопределено)

	ПарольСовпадает = Ложь;

	Если ПолеПароля = Элементы.Пароль1С
	       Тогда

		ПарольСовпадает = (ПолеПароля.ТекстРедактирования = ПодтверждениеПароля1С);

	ИначеЕсли ПолеПароля = Элементы.ПодтверждениеПароля1С Тогда
		ПарольСовпадает = (ПодтверждениеПароля1С = ПолеПароля.ТекстРедактирования);

	Иначе
		ПарольСовпадает = (Пароль1С = ПодтверждениеПароля1С);
	КонецЕсли;

	Элементы.ГруппаОшибки.ТекущаяСтраница = ?(ПарольСовпадает,
		Элементы.СтраницаПустая, Элементы.СтраницаОшибка);

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПроверитьПодтверждениеПароля();
	ОбновитьОтображениеНедействителен();
КонецПроцедуры

&НаКлиенте
Процедура НедействителенПриИзменении(Элемент)
	ОбновитьОтображениеНедействителен();
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьОтображениеНедействителен()
	Элементы.СтраницыНастроек.ТолькоПросмотр = Объект.Недействителен;
КонецПроцедуры

&НаКлиенте
Процедура АватарНажатие(Элемент, СтандартнаяОбработка)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите картинку аватара";
	Диалог.ПолноеИмяФайла = "";
	Фильтр = "PNG-файл (*.png)|*.png";
	Диалог.Фильтр = Фильтр;
	Диалог.МножественныйВыбор = Ложь;
	ЗагрузкаАватара = новый ОписаниеОповещения("ЗагрузкаАватара",ЭтотОбъект);
	Диалог.Показать(ЗагрузкаАватара);

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

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

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

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

&НаКлиенте
Процедура НаименованиеПриИзменении(Элемент)
	Если НЕ ЗначениеЗаполнено(Объект.НаименованиеСокращенное) Тогда
		Объект.НаименованиеСокращенное = СценарноеТестированиеКлиентСервер.СформироватьАвтоматическиИдентификаторТеста(Объект.Наименование);
	КонецЕсли;
КонецПроцедуры


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

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

Процедура ПоказатьПодтверждениеЗакрытияФормы(ОповещениеСохранитьИЗакрыть, Отказ, ТекстПредупреждения = "")
Экспорт

	Форма = ОповещениеСохранитьИЗакрыть.Модуль;
	Если Не Форма.Модифицированность Тогда
		Возврат;
	КонецЕсли;

	Отказ = Истина;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПоказатьПодтверждениеЗакрытияФормы(ОповещениеСохранитьИЗакрыть, Отказ, ТекстПредупреждения = "") Экспорт

	Форма = ОповещениеСохранитьИЗакрыть.Модуль;
	Если Не Форма.Модифицированность Тогда
		Возврат;
	КонецЕсли;

	Отказ = Истина;

	Параметры = Новый Структура();
	Параметры.Вставить("ОповещениеСохранитьИЗакрыть", ОповещениеСохранитьИЗакрыть);
	Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения);

	ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеФормыСейчас", 0.1, Истина);

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

// Задает вопрос о продолжении действия, ведущего к закрытию формы.
// Для использования в обработчиках события ПередЗакрытием модулей форм.
//
// Параметры:
//  Форма                        - УправляемаяФорма - форма, которая вызывает диалог предупреждения.
//  Отказ                        - Булево - возвращаемый параметр, признак отказа от выполняемого действия.
//  ТекстПредупреждения          - Строка - текст предупреждения, выводимый пользователю.
//  ИмяРеквизитаЗакрытьФормуБезПодтверждения - Строка - имя реквизита, содержащего в себе признак того, нужно
//                                 выводить предупреждение или нет.
//  ОписаниеОповещенияЗакрыть    - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку да.
//
// Пример:
//  ТекстПредупреждения = НСтр("ru = 'Закрыть помощник?'");
//  ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(
//      ЭтотОбъект, Отказ, ТекстПредупреждения, "ЗакрытьФормуБезПодтверждения");
//

Процедура ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(Форма, Отказ, ТекстПредупреждения,
	ИмяРеквизитаЗакрытьФормуБезПодтверждения, ОписаниеОповещенияЗакрыть = Неопределено) Экспорт

	Если Форма[ИмяРеквизитаЗакрытьФормуБезПодтверждения] Тогда
		Возврат;
	КонецЕсли;

	Отказ = Истина;

	Параметры = Новый Структура();
	Параметры.Вставить("Форма", Форма);
	Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения);
	Параметры.Вставить("ИмяРеквизитаЗакрытьФормуБезПодтверждения", ИмяРеквизитаЗакрытьФормуБезПодтверждения);
	Параметры.Вставить("ОписаниеОповещенияЗакрыть", ОписаниеОповещенияЗакрыть);

	ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеПроизвольнойФормыСейчас", 0.1, Истина);

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

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

// Возвращает ссылку на общий модуль по имени.
//
// Параметры:
//  Имя          - Строка - имя общего модуля, например:
//                 "ОбщегоНазначения",
//                 "ОбщегоНазначенияКлиент".
//
// Возвращаемое значение:
//  ОбщийМодуль.
//

Функция ОбщийМодуль(Имя) Экспорт

	Модуль = Вычислить(Имя);

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

	Возврат Модуль;

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

////////////////////////////////////////////////////////////////////////////////
// Функции для обработки действий пользователя в процессе редактирования
// многострочного текста, например комментария в документах.

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

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

	Если Заголовок = Неопределено Тогда
		ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст,,, Истина);
	Иначе
		ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст, Заголовок,, Истина);
	КонецЕсли;

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для выполнения резервного копирования в пользовательском режиме.

// ИспользованиеМодальности

////////////////////////////////////////////////////////////////////////////////
// Устаревшие процедуры и функции, использующие модальные окна.

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


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

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

Функция ИмяФункции(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт

	Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0.0", СтрокаВерсии1);
	Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0.0", СтрокаВерсии2);
	Версия1 = СтрРазделить(Строка1, ".");
	Если Версия1.Количество() <> 4 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1);
	КонецЕсли;
	Версия2 = СтрРазделить(Строка2, ".");
	Если Версия2.Количество() <> 4 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
	    	НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2);
	КонецЕсли;

	Результат = 0;
	Для Разряд = 0 По 3 Цикл
		Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
		Если Результат <> 0 Тогда
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

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

// Сравнить две строки версий.
//
// Параметры:
//  СтрокаВерсии1  - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.
//  СтрокаВерсии2  - Строка - второй сравниваемый номер версии.
//
// Возвращаемое значение:
//   Число   - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//

Функция СравнитьВерсииБезНомераСборки(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт

	Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0", СтрокаВерсии1);
	Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0", СтрокаВерсии2);
	Версия1 = СтрРазделить(Строка1, ".");
	Если Версия1.Количество() <> 3 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1);
	КонецЕсли;
	Версия2 = СтрРазделить(Строка2, ".");
	Если Версия2.Количество() <> 3 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
	    	НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2);
	КонецЕсли;

	Результат = 0;
	Для Разряд = 0 По 2 Цикл
		Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
		Если Результат <> 0 Тогда
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

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

// Сравнить две строки версий.
//
// Параметры:
//  СтрокаВерсии1  - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.
//  СтрокаВерсии2  - Строка - второй сравниваемый номер версии.
//
// Возвращаемое значение:
//   Число   - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//

Функция СравнитьВерсииРазныеФорматы(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт

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

	Если Версия1.Количество()<>Версия2.Количество() Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
	    	НСтр("ru = 'Форматы параметров СтрокаВерсии1(%1) и СтрокаВерсии2(%2) не совпадают!'"), СтрокаВерсии1,СтрокаВерсии2);
	КонецЕсли;

	Результат = 0;

	Для Разряд = 0 По Версия1.ВГраница() Цикл
		Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
		Если Результат <> 0 Тогда
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

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

// Дополняет структуру значениями из другой структуры.
//
// Параметры:
//   Приемник - Структура - коллекция, в которую будут добавляться новые значения.
//   Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения.
//   Заменять - Булево, Неопределено - Что делать в местах пересечения ключей источника и приемника:
//                                       Истина - Заменять значения приемника (самый быстрый способ),
//                                       Ложь   - Не заменять значения приемника (пропускать),
//                                       Неопределено - Значение по умолчанию. Бросать исключение.
//

Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт

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

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

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

// Возвращает Истина, если включен режим отладки.

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

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

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

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

Процедура Проверить(Знач Условие, Знач Сообщение = "", Знач КонтекстПроверки = "") Экспорт

	Если Не РежимОтладки() Тогда
		Возврат;
	КонецЕсли;

	Если Условие <> Истина Тогда
		Если ПустаяСтрока(Сообщение) Тогда
			ТекстИсключения = НСтр("ru = 'Недопустимая операция'"); // Assertion failed
		Иначе
			ТекстИсключения = Сообщение;
		КонецЕсли;
		Если Не ПустаяСтрока(КонтекстПроверки) Тогда
			ТекстИсключения = ТекстИсключения + " " +
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в %1'"), КонтекстПроверки);
		КонецЕсли;
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;

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

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

[Assistant] Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2)


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

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

#Область ОбновлениеИБ
// Выполнить экспортную процедуру без параметров по имени.
//
// Параметры
//  ИмяЭкспортнойПроцедуры – Строка    – имя экспортной процедуры в формате
//										 <имя объекта>.<имя процедуры>, где <имя объекта> - это
// 										 общий модуль или модуль менеджера объекта.
//
// Пример:
//  ИмяФункции("МойОбщийМодуль.МояПроцедура");
//
Процедура ВыполнитьБезопасно(Знач ИмяЭкспортнойПроцедуры) Экспорт

	// Проверка предусловий на формат ИмяЭкспортнойПроцедуры.
	ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяЭкспортнойПроцедуры, ".");
	Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
			ИмяЭкспортнойПроцедуры);
	КонецЕсли;

	ИмяОбъекта = ЧастиИмени[0];
	Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
			ИмяЭкспортнойПроцедуры);
	КонецЕсли;

	Если ЧастиИмени.Количество() = 3 Тогда
		ДопустимыеИменаТипов = Новый Массив;
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаКонстанты()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыСведений()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыНакопления()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыБухгалтерии()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыРасчета()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаСправочники()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаДокументы()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаБизнесПроцессы()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаЗадачи()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыСчетов()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыОбмена()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыВидовХарактеристик()));
		ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыВидовРасчета()));
		ИмяТипа = ВРег(ЧастиИмени[0]);
		Если ДопустимыеИменаТипов.Найти(ИмяТипа) = Неопределено Тогда
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
				ИмяЭкспортнойПроцедуры);
		КонецЕсли;
	КонецЕсли;

	Выполнить ИмяЭкспортнойПроцедуры + "();";

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

// Имена типов.

// Функция-свойство: возвращает значение для идентификации общего типа "Регистры сведений"
//
// Тип: Строка
//
Функция ИмяТипаРегистрыСведений() Экспорт

	Возврат "РегистрыСведений";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Регистры накопления"
//
// Тип: Строка
//
Функция ИмяТипаРегистрыНакопления() Экспорт

	Возврат "РегистрыНакопления";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Регистры бухгалтерии"
//
// Тип: Строка
//
Функция ИмяТипаРегистрыБухгалтерии() Экспорт

	Возврат "РегистрыБухгалтерии";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Регистры расчета"
//
// Тип: Строка
//
Функция ИмяТипаРегистрыРасчета() Экспорт

	Возврат "РегистрыРасчета";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Документы"
//
// Тип: Строка
//
Функция ИмяТипаДокументы() Экспорт

	Возврат "Документы";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Справочники"
//
// Тип: Строка
//
Функция ИмяТипаСправочники() Экспорт

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

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

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

	Возврат "ПланыОбмена";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Планы видов характеристик"
//
// Тип: Строка
//
Функция ИмяТипаПланыВидовХарактеристик() Экспорт

	Возврат "ПланыВидовХарактеристик";

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

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

	Возврат "БизнесПроцессы";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Задачи"
//
// Тип: Строка
//
Функция ИмяТипаЗадачи() Экспорт

	Возврат "Задачи";

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

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

	Возврат "ПланыСчетов";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Планы видов расчета"
//
// Тип: Строка
//
Функция ИмяТипаПланыВидовРасчета() Экспорт

	Возврат "ПланыВидовРасчета";

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

// Функция-свойство: возвращает значение для идентификации общего типа "Константы"
//
// Тип: Строка
//
Функция ИмяТипаКонстанты() Экспорт

	Возврат "Константы";

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

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

Функция ПолучитьКонстанту(ИмяКонстанты = "") Экспорт
	УстановитьПривилегированныйРежим(Истина);
	Возврат Константы[ИмяКонстанты].Получить();
КонецФункции // ()

[Assistant] Процедура ВыполнитьБезопасно(Знач ИмяЭкспортнойПроцедуры)


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

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

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

	НавигационнаяСсылка = Контекст.НавигационнаяСсылка;

	Если РасширениеПодключено Тогда

		Оповещение          = Контекст.Оповещение;
		ДождатьсяЗавершения = (Оповещение <> Неопределено);

		Оповещение = Новый ОписаниеОповещения("ОткрытьНавигационнуюСсылкуПослеЗапускаПриложения", ЭтотОбъект, Контекст,
			"ОткрытьНавигационнуюСсылкуПриОбработкеОшибки", ЭтотОбъект);
    // TODO: допиши оставшуюся часть

[Assistant]
#Область ОткрытьНавигационнуюСсылку

// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт

	НавигационнаяСсылка = Контекст.НавигационнаяСсылка;

	Если РасширениеПодключено Тогда

		Оповещение          = Контекст.Оповещение;
		ДождатьсяЗавершения = (Оповещение <> Неопределено);

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

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

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

// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуПослеЗапускаПриложения(КодВозврата, Контекст) Экспорт

	Оповещение = Контекст.Оповещение;

	Если Оповещение <> Неопределено Тогда
		ПриложениеЗапущено = (КодВозврата = 0 Или КодВозврата = Неопределено);
		ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
	КонецЕсли;

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

// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт

	СтандартнаяОбработка = Ложь;
	ОткрытьНавигационнуюСсылкуОповеститьОбОшибке("", Контекст);

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

// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст) Экспорт

	Оповещение = Контекст.Оповещение;

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

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

// Проверяет, является ли переданная строка веб ссылкой.
//
// Параметры:
//  Строка - Строка - переданная ссылка.
//
Функция ЭтоВебСсылка(Строка) Экспорт

	Возврат СтрНачинаетсяС(Строка, "http://")  // обычное соединение.
		Или СтрНачинаетсяС(Строка, "https://");// защищенное соединение.

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

// Проверяет, является ли переданная строка ссылкой на встроенную справку.
//
// Параметры:
//  Строка - Строка - переданная ссылка.
//
Функция ЭтоСсылкаНаСправку(Строка) Экспорт

	Возврат СтрНачинаетсяС(Строка, "v8help://");

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

// Проверяет, является ли переданная строка допустимой ссылкой по белому списку протоколов.
//
// Параметры:
//  Строка - Строка - переданная ссылка.
//
Функция ЭтоДопустимаяСсылка(Строка) Экспорт

	Возврат СтрНачинаетсяС(Строка, "e1cib/")
		Или СтрНачинаетсяС(Строка, "http:")
		Или СтрНачинаетсяС(Строка, "https:")
		Или СтрНачинаетсяС(Строка, "e1c:")
		Или СтрНачинаетсяС(Строка, "v8help:")
		Или СтрНачинаетсяС(Строка, "mailto:")
		Или СтрНачинаетсяС(Строка, "tel:")
		Или СтрНачинаетсяС(Строка, "skype:");

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

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

// Проверяет, является ли переданная строка внутренней навигационной ссылкой.
//
// Параметры:
//  Строка - Строка - навигационная ссылка.
//
Функция ЭтоНавигационнаяСсылка(Строка) Экспорт

	Возврат СтрНачинаетсяС(Строка, "e1c:")
		Или СтрНачинаетсяС(Строка, "e1cib/");

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


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

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

Процедура ЗавершитьВыполнениеЗаданияЕслиВсеЭтапыЗаданияВыполнены()
Экспорт

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

	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ЗавершитьВыполнениеЗаданияЕслиВсеЭтапыЗаданияВыполнены() Экспорт

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

	Если Результат.Пустой() Тогда
		Возврат;
	КонецЕсли;

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

	Пока Выборка.Следующий() Цикл
		НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
		Попытка

			// 0. Обновляем статусы заданий при завершении
			ОбновлениеСостоянияЗаданийПриЗавершении(Выборка);

			// 1. Добавляем информацию в лог выполненных заданий
			СтруктураДанных = новый Структура("ЭтоЗавершениеЗадания,Статус,Сообщение,Ошибка,Успешно",Истина,Выборка.Статус,"Завершение задания",Выборка.БылаОшибка,?(Выборка.БылаОшибка=Ложь,Выборка.БылоУспешно,Ложь));
			СоздатьЗаписьЛогВыполненныхЗаданий(Выборка.Задание, Выборка.Сборка,ТекущаяДата(),СтруктураДанных);

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

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

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

			// 3. Удаляем записи из пулла
			НаборЗаписей = РегистрыСведений.СоставЗаданийПулл.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор.Задание.Установить(Выборка.Задание);
			НаборЗаписей.Отбор.ТестируемыйКлиент.Установить(Выборка.ТестируемыйКлиент);
			НаборЗаписей.Записать(Истина);

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

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

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


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

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

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

	// событие выполняется, по жостижению одного из вариантов (проверка идет по или):
	// 1. истечение интервала
	// 2. достижения времени
	// 3. достижения даты и времени
	// 4. наличия файла
	// 5. иначе успешно

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

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

	// получим время выполнения предыдущего интервала
	Если ЗначениеЗаполнено(СтруктураРеквзитов.Интервал) И ЗначениеЗаполнено(ВыборкаДетальная.ДатаВыполненияСек) Тогда

		ВремяЗавершенияПредыдущегоЭтапаСек = ВыборкаДетальная.ДатаВыполненияСек;

	ИначеЕсли ЗначениеЗаполнено(СтруктураРеквзитов.Интервал) Тогда

		Запрос = новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|	МАКСИМУМ(СоставЗаданийПулл.ДатаВыполнения) КАК ДатаВыполнения,
		|	МАКСИМУМ(СоставЗаданийПулл.ДатаВыполненияСек) КАК ДатаВыполненияСек
		|ИЗ
		|	РегистрСведений.СоставЗаданийПулл КАК СоставЗаданийПулл
		|ГДЕ
		|	СоставЗаданийПулл.Задание = &Задание
		|	И СоставЗаданийПулл.ЭтапВыполнен
		|	И СоставЗаданийПулл.Проверка = &Проверка
		|	И СоставЗаданийПулл.Сборка = &Сборка
		|	И СоставЗаданийПулл.ТестируемыйКлиент = &ТестируемыйКлиент
		|
		|ИМЕЮЩИЕ
		|	НЕ МАКСИМУМ(СоставЗаданийПулл.ДатаВыполнения) ЕСТЬ NULL";

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

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

		Если Выборка.Следующий() Тогда

			ВремяЗавершенияПредыдущегоЭтапаСек = Выборка.ДатаВыполненияСек;

		Иначе

			// если самый первый
			ВремяЗавершенияПредыдущегоЭтапаСек = ТекущаяДатаСек;

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

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

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

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

		КонецЕсли;

	КонецЕсли;

	// 1. истечение интервала
	Если ЗначениеЗаполнено(СтруктураРеквзитов.Интервал) Тогда
		ХотябыОдноДействие = Истина;
		Если СтруктураРеквзитов.ИнтервалСек-(ТекущаяДатаСек-ВремяЗавершенияПредыдущегоЭтапаСек)<0 Тогда
			ЭтапВыполнен = Истина;
			Триггеры = " По достижении 'Интервал'. ВремяЗавершенияПредыдущегоЭтапаСек("+ВремяЗавершенияПредыдущегоЭтапаСек+","+ПланировщикЗаданийКлиентСервер.ПреобразоватьСекВДату(ВремяЗавершенияПредыдущегоЭтапаСек)+") ТекДата("+ТекущаяДата()+")";
		КонецЕсли;
	КонецЕсли;

	// 2. достижения времени
	Если ЗначениеЗаполнено(СтруктураРеквзитов.Время) Тогда
		ХотябыОдноДействие = Истина;
		Если Секунда(СтруктураРеквзитов.Время)-(Секунда(ТекущаяДата)-Секунда(НачалоДня(ТекущаяДата)))<0 Тогда
			ЭтапВыполнен = Истина;
			Триггеры = " По достижении 'Время' ";
		КонецЕсли;
	КонецЕсли;

	// 3. достижения даты и времени
	Если ЗначениеЗаполнено(СтруктураРеквзитов.ДатаВремя) Тогда
		ХотябыОдноДействие = Истина;
		Если СтруктураРеквзитов.ДатаВремя<ТекущаяДата Тогда
			ЭтапВыполнен = Истина;
			Триггеры = " По достижении 'Дата-Время' ";
		КонецЕсли;
	КонецЕсли;

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

	// 4. наличия файла
	Если СтруктураРеквзитов.ПоявлениеФайла = Истина  Тогда
		ХотябыОдноДействие = Истина;
		Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
			Если Найти(ПутьКФайлу,"*") Тогда

				МассивЧастей = новый Массив;
				Если Найти(ПутьКФайлу,"\") Тогда
					МассивЧастей = СтрРазделить(ПутьКФайлу+"","\",Истина);
				ИначеЕсли Найти(ПутьКФайлу,"/") Тогда
					МассивЧастей = СтрРазделить(ПутьКФайлу+"","/",Истина);
				КонецЕсли;
				Если МассивЧастей.Количество()=0 Тогда
					Возврат;
				КонецЕсли;
				ПутьКаталог = СтрЗаменить(ПутьКФайлу,МассивЧастей[МассивЧастей.Количество()-1],"");
				ШаблонПоиска = СтрЗаменить(ПутьКФайлу,ПутьКаталог,"");
				НайденныеФайлы = НайтиФайлы(ПутьКаталог,ШаблонПоиска,Истина);
				Если НайденныеФайлы.Количество()>0 Тогда
					ЭтапВыполнен = Истина;
    // TODO: допиши оставшуюся часть

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

	// событие выполняется, по жостижению одного из вариантов (проверка идет по или):
	// 1. истечение интервала
	// 2. достижения времени
	// 3. достижения даты и времени
	// 4. наличия файла
	// 5. иначе успешно

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

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

	// получим время выполнения предыдущего интервала
	Если ЗначениеЗаполнено(СтруктураРеквзитов.Интервал) И ЗначениеЗаполнено(ВыборкаДетальная.ДатаВыполненияСек) Тогда

		ВремяЗавершенияПредыдущегоЭтапаСек = ВыборкаДетальная.ДатаВыполненияСек;

	ИначеЕсли ЗначениеЗаполнено(СтруктураРеквзитов.Интервал) Тогда

		Запрос = новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|	МАКСИМУМ(СоставЗаданийПулл.ДатаВыполнения) КАК ДатаВыполнения,
		|	МАКСИМУМ(СоставЗаданийПулл.ДатаВыполненияСек) КАК ДатаВыполненияСек
		|ИЗ
		|	РегистрСведений.СоставЗаданийПулл КАК СоставЗаданийПулл
		|ГДЕ
		|	СоставЗаданийПулл.Задание = &Задание
		|	И СоставЗаданийПулл.ЭтапВыполнен
		|	И СоставЗаданийПулл.Проверка = &Проверка
		|	И СоставЗаданийПулл.Сборка = &Сборка
		|	И СоставЗаданийПулл.ТестируемыйКлиент = &ТестируемыйКлиент
		|
		|ИМЕЮЩИЕ
		|	НЕ МАКСИМУМ(СоставЗаданийПулл.ДатаВыполнения) ЕСТЬ NULL";

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

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

		Если Выборка.Следующий() Тогда

			ВремяЗавершенияПредыдущегоЭтапаСек = Выборка.ДатаВыполненияСек;

		Иначе

			// если самый первый
			ВремяЗавершенияПредыдущегоЭтапаСек = ТекущаяДатаСек;

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

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

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

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

		КонецЕсли;

	КонецЕсли;

	// 1. истечение интервала
	Если ЗначениеЗаполнено(СтруктураРеквзитов.Интервал) Тогда
		ХотябыОдноДействие = Истина;
		Если СтруктураРеквзитов.ИнтервалСек-(ТекущаяДатаСек-ВремяЗавершенияПредыдущегоЭтапаСек)<0 Тогда
			ЭтапВыполнен = Истина;
			Триггеры = " По достижении 'Интервал'. ВремяЗавершенияПредыдущегоЭтапаСек("+ВремяЗавершенияПредыдущегоЭтапаСек+","+ПланировщикЗаданийКлиентСервер.ПреобразоватьСекВДату(ВремяЗавершенияПредыдущегоЭтапаСек)+") ТекДата("+ТекущаяДата()+")";
		КонецЕсли;
	КонецЕсли;

	// 2. достижения времени
	Если ЗначениеЗаполнено(СтруктураРеквзитов.Время) Тогда
		ХотябыОдноДействие = Истина;
		Если Секунда(СтруктураРеквзитов.Время)-(Секунда(ТекущаяДата)-Секунда(НачалоДня(ТекущаяДата)))<0 Тогда
			ЭтапВыполнен = Истина;
			Триггеры = " По достижении 'Время' ";
		КонецЕсли;
	КонецЕсли;

	// 3. достижения даты и времени
	Если ЗначениеЗаполнено(СтруктураРеквзитов.ДатаВремя) Тогда
		ХотябыОдноДействие = Истина;
		Если СтруктураРеквзитов.ДатаВремя<ТекущаяДата Тогда
			ЭтапВыполнен = Истина;
			Триггеры = " По достижении 'Дата-Время' ";
		КонецЕсли;
	КонецЕсли;

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

	// 4. наличия файла
	Если СтруктураРеквзитов.ПоявлениеФайла = Истина  Тогда
		ХотябыОдноДействие = Истина;
		Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
			Если Найти(ПутьКФайлу,"*") Тогда

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

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

	// 5. Отсутствие файла
	Если СтруктураРеквзитов.ОтсутствиеФайла=Истина Тогда
		ХотябыОдноДействие = Истина;
		Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
			Если Найти(ПутьКФайлу,"*") Тогда

				МассивЧастей = новый Массив;
				Если Найти(ПутьКФайлу,"\") Тогда
					МассивЧастей = СтрРазделить(ПутьКФайлу+"","\",Истина);
				ИначеЕсли Найти(ПутьКФайлу,"/") Тогда
					МассивЧастей = СтрРазделить(ПутьКФайлу+"","/",Истина);
				КонецЕсли;
				Если МассивЧастей.Количество()=0 Тогда
					Возврат;
				КонецЕсли;
				ПутьКаталог = СтрЗаменить(ПутьКФайлу,МассивЧастей[МассивЧастей.Количество()-1],"");
				ШаблонПоиска = СтрЗаменить(ПутьКФайлу,ПутьКаталог,"");
				НайденныеФайлы = НайтиФайлы(ПутьКаталог,ШаблонПоиска,Истина);
				Если НайденныеФайлы.Количество()=0 Тогда
					ЭтапВыполнен = Истина;
					Триггеры = " По событию 'Отсутствие файла по шаблону' ";
				КонецЕсли;

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

	// 6. Иначе успешно
	Если ХотябыОдноДействие=Ложь Тогда
		ЭтапВыполнен = Истина;
		Триггеры = "Отсутствуют!";
	КонецЕсли;

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

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

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

		Если Успешно=Истина Тогда
			МенеджерЗаписи.Статус = Перечисления.СтатусыЗаданий.Успешно;
		Иначе
			МенеджерЗаписи.Статус = Перечисления.СтатусыЗаданий.Ошибка;
		КонецЕсли;

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

		МенеджерЗаписи.ЭтапВыполнен = Истина;

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

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

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


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

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

Процедура ИмяФункции(ТестовоеПриложение,ОписаниеОшибки, Узел, ИмяПараметра, ИмяПараметра2, ЗначениеПараметра,УсловиеСравнения, ПараметрыСценария, ОсуществитьПереходСТекущегоШага) Экспорт

	ЗагрузитьБиблиотеки();

	ЗначениеПараметраТаблицыПараметров = мСцен_ПолучитьЗначениеПараметра(ИмяПараметра, ПараметрыСценария);

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

	// сравним
	Если НЕ ЗначениеЗаполнено(РезультатСравенения) Тогда
	// все хорошо продолжаем выполнение
	Иначе
	// переходим на следующий узел по уровню
		ОсуществитьПереходСТекущегоШага = Истина;
	КонецЕсли;

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

&НаКлиенте

Процедура мСценСкрипт_setFileDialogResult(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиентСервер,filename) Экспорт

	ТестовоеПриложение.УстановитьРезультатДиалогаВыбораФайла(true,filename,10);

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

&НаКлиенте

Процедура мСценСкрипт_НайтиОсновноеОкно(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная, мПараметры) Экспорт

	ТекущийНомерПорта = мПараметры.ТекущийНомерПорта;
	ЗаголовокОбъекта = мПараметры.ЗаголовокОбъекта;
	ИспользоватьВариантыПоиска = мПараметры.ИспользоватьВариантыПоиска;

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

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

	ТекущееОсновноеОкно.Вставить(ТекущийНомерПорта,ТекущаяПеременная);
	ТекущееОкно.Вставить(ТекущийНомерПорта,ТекущаяПеременная);

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

&НаКлиенте

Процедура мСценСкрипт_НайтиОкно(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры) Экспорт

	ТекущийНомерПорта = мПараметры.ТекущийНомерПорта;
	ЗаголовокОбъекта = мПараметры.ЗаголовокОбъекта;
	ИспользоватьВариантыПоиска = мПараметры.ИспользоватьВариантыПоиска;
	Интервал = мПараметры.Интервал;

	// пробуем искать по условию или "|" разделитель
	Если ИспользоватьВариантыПоиска=Истина Тогда
		МассивЗаголовковОбъектов = СтрРазделить(ЗаголовокОбъекта,"|",Ложь);

		Для ш=0 по МассивЗаголовковОбъектов.Количество()-1 Цикл

			ЗаголовокОбъекта = "";
			Если ш<МассивЗаголовковОбъектов.Количество() Тогда
				ЗаголовокОбъекта = СокрЛП(МассивЗаголовковОбъектов.Получить(ш));
			КонецЕсли;

			ТекущаяПеременная = ТестовоеПриложение.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"), ЗаголовокОбъекта , , ?(Интервал=0,5,Интервал));

			Если НЕ ТекущаяПеременная=Неопределено Тогда
				Прервать;
			КонецЕсли;

		КонецЦикла;

	Иначе
		ТекущаяПеременная = ТестовоеПриложение.НайтиОбъект(Тип("ТестируемоеОкноКлиентскогоПриложения"), ЗаголовокОбъекта , , ?(Интервал=0,5,Интервал));
	КонецЕсли;

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

	ТекущееОкно.Вставить(ТекущийНомерПорта,ТекущаяПеременная);

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

&НаКлиенте

Процедура мСценСкрипт_ПолучитьАктивноеОкно(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры) Экспорт

	ТекущаяПеременная = ТестовоеПриложение.ПолучитьАктивноеОкно();

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

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

&НаКлиенте

Процедура мСценСкрипт_НайтиФорму(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры) Экспорт

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

	// пробуем искать по условию или "|" разделитель
	Если ИспользоватьВариантыПоиска=Истина Тогда
		МассивЗаголовковОбъектов = СтрРазделить(ЗаголовокОбъекта,"|",Ложь);

		Для ш=0 по МассивЗаголовковОбъектов.Количество()-1 Цикл

			ЗаголовокОбъекта = "";
			Если ш<МассивЗаголовковОбъектов.Количество() Тогда
				ЗаголовокОбъекта = СокрЛП(МассивЗаголовковОбъектов.Получить(ш));
			КонецЕсли;

			ТекущаяПеременная = РодительПеременная.НайтиОбъект(Тип("ТестируемаяФорма"), ЗаголовокОбъекта,,?(Интервал=0,5,Интервал));

			Если НЕ ТекущаяПеременная=Неопределено Тогда
				Прервать;
			КонецЕсли;

		КонецЦикла;

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

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

	ТекущийОбъект.Вставить(ТекущийНомерПорта,ТекущаяПеременная);

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

&НаКлиенте

Процедура мСценСкрипт_ПолучитьКомандныйИнтерфейс(ТестовоеПриложение,ОписаниеОшибки,ТекущаяПеременная,мПараметры) Экспорт

	ТекущийНомерПорта = мПараметры.ТекущийНомерПорта;
	РодительПеременная = мПараметры.РодительПеременная;
	ТекущаяПеременная = РодительПеременная.ПолучитьКомандныйИнтерфейс();

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

	ТекущийОбъект.Вставить(ТекущийНомерПорта,ТекущаяПеременная);

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

&НаКлиенте

[Assistant] Процедура мСценСкрипт_ОбработатьУсловие(ТестовоеПриложение,ОписаниеОшибки, Узел, ИмяПараметра, ИмяПараметра2, ЗначениеПараметра,УсловиеСравнения, ПараметрыСценария, ОсуществитьПереходСТекущегоШага)


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

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

Процедура ИмяФункции(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная, мПараметры) Экспорт

	ИмяКоманды = мПараметры.ИмяКоманды;
	ТипОбъекта = мПараметры.ТипОбъекта;
	РодительПеременная = мПараметры.РодительПеременная;
	ЗаголовокОбъекта = мПараметры.ЗаголовокОбъекта;
	OutputText = мПараметры.OutputText;
	CommandRef = мПараметры.CommandRef;
	Presentation = мПараметры.Presentation;
	Direction = мПараметры.Direction;
	RowDescription = мПараметры.RowDescription;
	SwitchSelection = мПараметры.SwitchSelection;
	Cancel = мПараметры.Cancel;
	Area = мПараметры.Area;
	ИмяПараметра = мПараметры.ИмяПараметра;
	ЗначениеПараметра = мПараметры.ЗначениеПараметра;
	ПараметрыСценария = мПараметры.ПараметрыСценария;
	Интервал = мПараметры.Интервал;
	ПредставлениеДанных = мПараметры.ПредставлениеДанных;

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

	ИначеЕсли ИмяКоманды = "ПерейтиКНачальнойСтранице" ИЛИ ИмяКоманды = "GotoStartPage" Тогда
		ТекущаяПеременная.ПерейтиКНачальнойСтранице();
	ИначеЕсли ИмяКоманды = "ПерейтиКСледующемуОкну" ИЛИ ИмяКоманды = "GotoNextWindow" Тогда
		ТекущаяПеременная.ПерейтиКСледующемуОкну();
	ИначеЕсли ИмяКоманды = "ПерейтиКПредыдущемуОкну" ИЛИ ИмяКоманды = "GotoPreviousWindow" Тогда
		ТекущаяПеременная.ПерейтиКПредыдущемуОкну();

	ИначеЕсли ИмяКоманды = "ПерейтиНаУровеньВверх" ИЛИ ИмяКоманды = "GoOneLevelUp" Тогда
		ТекущаяПеременная.ПерейтиНаУровеньВверх();
	ИначеЕсли ИмяКоманды = "ПерейтиНаУровеньВниз" ИЛИ ИмяКоманды = "GoOneLevelDown" Тогда
		ТекущаяПеременная.ПерейтиНаУровеньВниз();
	ИначеЕсли ИмяКоманды = "ПерейтиКСледующемуЭлементу" ИЛИ ИмяКоманды = "GotoNextItem" Тогда
		ТекущаяПеременная.ПерейтиКСледующемуЭлементу();
	ИначеЕсли ИмяКоманды = "ПерейтиКПредыдущемуЭлементу" ИЛИ ИмяКоманды = "GotoPreviousItem" Тогда
		ТекущаяПеременная.ПерейтиКПредыдущемуЭлементу();

	ИначеЕсли ИмяКоманды = "УменьшитьЗначение" ИЛИ ИмяКоманды = "DecreaseValue" Тогда
		ТекущаяПеременная.УменьшитьЗначение();
	ИначеЕсли ИмяКоманды = "УвеличитьЗначение" ИЛИ ИмяКоманды = "IncreaseValue" Тогда
		ТекущаяПеременная.УвеличитьЗначение();

	ИначеЕсли ИмяКоманды = "НажатьНаГиперссылкуВФорматированнойСтроке" ИЛИ ИмяКоманды = "clickFormattedStringHyperlink" Тогда

		Попытка
			// если передано число?
			Число = Число(Presentation);
			Если XMLСтрока(Число)=Presentation Тогда
				Presentation = Число;
			КонецЕсли;
		Исключение
		КонецПопытки;

		ТекущаяПеременная.НажатьНаГиперссылкуВФорматированнойСтроке(Presentation);

	ИначеЕсли ИмяКоманды = "ПерейтиКДате" ИЛИ ИмяКоманды = "GotoDate" Тогда
		ТекущаяПеременная.ПерейтиКДате(XMLЗначение(Тип("Дата"), Presentation));
	ИначеЕсли ИмяКоманды = "ПерейтиКЗначению" ИЛИ ИмяКоманды = "GotoValue" Тогда
		ТекущаяПеременная.ПерейтиКЗначению(XMLЗначение(Тип("Число"), Presentation));

		//	работа с областью
	ИначеЕсли ИмяКоманды = "НачатьРедактированиеТекущейОбласти" ИЛИ ИмяКоманды = "BeginEditingCurrentArea" Тогда
		ТекущаяПеременная.НачатьРедактированиеТекущейОбласти();
	ИначеЕсли ИмяКоманды = "УстановитьТекущуюОбласть" ИЛИ ИмяКоманды = "SetCurrentArea" Тогда
		Если НЕ ЗначениеЗаполнено(Area) Тогда
			ТекущаяПеременная.УстановитьТекущуюОбласть();
		Иначе
			ТекущаяПеременная.УстановитьТекущуюОбласть(Area);
		КонецЕсли;
	ИначеЕсли ИмяКоманды = "ПолучитьАдресТекущейОбласти" ИЛИ ИмяКоманды = "GetCurrentAreaAddress" Тогда

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

	ИначеЕсли ИмяКоманды = "ПолучитьПолеТекущейОбласти" ИЛИ ИмяКоманды = "GetCurrentAreaField" Тогда

		ТекущаяПеременная = ТекущаяПеременная.ПолучитьПолеТекущейОбласти();

	ИначеЕсли ИмяКоманды = "ПолучитьТекстОбласти" ИЛИ ИмяКоманды = "GetAreaText" Тогда

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

	ИначеЕсли ИмяКоманды = "ЗавершитьРедактированиеТекущейОбласти" ИЛИ ИмяКоманды = "EndEditingCurrentArea" Тогда
		ТекущаяПеременная.ЗавершитьРедактированиеТекущейОбласти(Cancel);

		// работа со строками
	ИначеЕсли ИмяКоманды = "ДобавитьСтроку" ИЛИ ИмяКоманды = "AddRow" Тогда
		ТекущаяПеременная.ДобавитьСтроку();
	ИначеЕсли ИмяКоманды = "УдалитьСтроку" ИЛИ ИмяКоманды = "DeleteRow" Тогда
		ТекущаяПеременная.УдалитьСтроку();
	ИначеЕсли ИмяКоманды = "ВыделитьВсеСтроки" ИЛИ ИмяКоманды = "SelectAllRows" Тогда
		ТекущаяПеременная.ВыделитьВсеСтроки();
	ИначеЕсли ИмяКоманды = "ИзменитьСтроку" ИЛИ ИмяКоманды = "ChangeRow" Тогда
		ТекущаяПеременная.ИзменитьСтроку();
	ИначеЕсли ИмяКоманды = "ПерейтиКПервойСтроке" ИЛИ ИмяКоманды = "GotoFirstRow" Тогда
		ТекущаяПеременная.ПерейтиКПервойСтроке(SwitchSelection);
	ИначеЕсли ИмяКоманды = "ПерейтиКПоследнейСтроке" ИЛИ ИмяКоманды = "GotoLastRow" Тогда
		ТекущаяПеременная.ПерейтиКПоследнейСтроке(SwitchSelection);
	ИначеЕсли ИмяКоманды = "ПерейтиКСледующейСтроке" ИЛИ ИмяКоманды = "GotoNextRow" Тогда
		ТекущаяПеременная.ПерейтиКСледующейСтроке(SwitchSelection);
	ИначеЕсли ИмяКоманды = "ПерейтиКПредыдущейСтроке" ИЛИ ИмяКоманды = "GotoPreviousRow" Тогда
		ТекущаяПеременная.ПерейтиКПредыдущейСтроке(SwitchSelection);
	ИначеЕсли ИмяКоманды = "ЗакончитьРедактированиеСтроки" ИЛИ ИмяКоманды = "EndEditRow" Тогда
		ТекущаяПеременная.ЗакончитьРедактированиеСтроки(Cancel);
	ИначеЕсли ИмяКоманды = "ПерейтиКСтроке" ИЛИ ИмяКоманды = "GotoRow" Тогда
		мСценСкрипт_ПерейтиКСтроке(ТестовоеПриложение,ОписаниеОшибки,ТипОбъекта,ТекущаяПеременная,РодительПеременная,ЗаголовокОбъекта,Direction,RowDescription,SwitchSelection,ПараметрыСценария);

	// Расширение тестируемого дополнения элемента формы для отображения состояния просмотра
	// (Tested form item addition extension for a view status representation)
	ИначеЕсли ИмяКоманды = "НажатьНаЭлементСостоянияПросмотра" ИЛИ ИмяКоманды = "ClickViewStatusItem" Тогда
		ТекущаяПеременная.НажатьНаЭлементСостоянияПросмотра("" + Presentation + "");
	ИначеЕсли ИмяКоманды = "ПолучитьТекстыЭлементовСостоянияПросмотра" ИЛИ ИмяКоманды = "DeleteViewStatusItem" Тогда
		ФиксМассив = ТекущаяПеременная.ПолучитьТекстыЭлементовСостоянияПросмотра();
		ТекстСообщения = "";
		Для каждого стр из ФиксМассив Цикл
			ТекстСообщения = ТекстСообщения+" "+Символы.ПС+стр;
		КонецЦикла;
		ЗначениеПараметра = ТекстСообщения;
		ПредставлениеДанных = ТекстСообщения;
		мСцен_УстановитьЗначениеПараметра(ИмяПараметра,ЗначениеПараметра,ПараметрыСценария);
	ИначеЕсли ИмяКоманды = "УдалитьЭлементСостоянияПросмотра" ИЛИ ИмяКоманды = "DeleteViewStatusItem" Тогда
		ТекущаяПеременная.УдалитьЭлементСостоянияПросмотра("" + Presentation + "");

	// сложные команды с параметрами
	ИначеЕсли ИмяКоманды = "ВвестиТекст" Тогда
		ТекущаяПеременная.ВвестиТекст("" + OutputText + "");
	ИначеЕсли ИмяКоманды = "ВыполнитьКоманду" Тогда
		ТекущаяПеременная.ВыполнитьКоманду("" + CommandRef + "");
	ИначеЕсли ИмяКоманды = "ВыполнитьВыборИзВыпадающегоСписка" ИЛИ ИмяКоманды = "ExecuteChoiceFromDropList" Тогда
		ТекущаяПеременная.ОжидатьФормированияВыпадающегоСписка();
		ТекущаяПеременная.ВыполнитьВыборИзВыпадающегоСписка("" + Presentation + "");
	ИначеЕсли ИмяКоманды = "ВыполнитьВыборИзМеню" ИЛИ ИмяКоманды = "ExecuteChoiceFromMenu" Тогда
		ТекущаяПеременная.ВыполнитьВыборИзМеню("" + Presentation + "");
	ИначеЕсли ИмяКоманды = "ВыполнитьВыборИзСпискаВыбора" ИЛИ ИмяКоманды = "ExecuteChoiceFromChoiceList" Тогда
		ТекущаяПеременная.ОжидатьФормированияВыпадающегоСписка();
		Число = Неопределено;
		Попытка
			Если ТипЗнч(Presentation)=Тип("Число") Тогда
				Число = Presentation;
			Иначе
				Число = Число(Presentation);
			КонецЕсли;
		Исключение
		КонецПопытки;
		Если Число=Неопределено Тогда
			ТекущаяПеременная.ВыполнитьВыборИзСпискаВыбора("" + Presentation + "");
		Иначе
			ТекущаяПеременная.ВыполнитьВыборИзСпискаВыбора(Число);
		КонецЕсли;
	ИначеЕсли ИмяКоманды = "ВыбратьВариант" ИЛИ ИмяКоманды = "SelectOption" Тогда
		ТекущаяПеременная.ВыбратьВариант("" + Presentation + "");

	ИначеЕсли ИмяКоманды = "ЗакрытьПанельСообщенийПользователю" ИЛИ ИмяКоманды = "CloseUserMessagesPanel" Тогда
		ТекущаяПеременная.ЗакрытьПанельСообщенийПользователю();
	ИначеЕсли ИмяКоманды = "ПолучитьТекстыСообщенийПользователю" ИЛИ ИмяКоманды = "GetUserMessageTexts" Тогда
		МассивСообщений = ТекущаяПеременная.ПолучитьТекстыСообщенийПользователю();
		ТекстСообщения = "";
		Для каждого стр из МассивСообщений Цикл
			Если ТекстСообщения="" Тогда
				ТекстСообщения = стр;
			Иначе
				ТекстСообщения = ТекстСообщения+Символы.ПС+стр;
			КонецЕсли;
		КонецЦикла;
		ЗначениеПараметра = ТекстСообщения;
		ПредставлениеДанных = ТекстСообщения;
		мСцен_УстановитьЗначениеПараметра(ИмяПараметра,ЗначениеПараметра,ПараметрыСценария);
	ИначеЕсли ИмяКоманды = "ПолучитьПредставлениеДанных" ИЛИ ИмяКоманды = "GetDataPresentation" Тогда
		ТекстСообщения = ТекущаяПеременная.ПолучитьТекстыСообщенийПользователю();
		ЗначениеПараметра = ТекстСообщения;
		ПредставлениеДанных = ТекстСообщения;
		мСцен_УстановитьЗначениеПараметра(ИмяПараметра,ЗначениеПараметра,ПараметрыСценария);
	ИначеЕсли ИмяКоманды = "ПолучитьТекстРедактирования" ИЛИ ИмяКоманды = "GetEditText" Тогда
		ТекстСообщения = ТекущаяПеременная.ПолучитьТекстРедактирования();
		ЗначениеПараметра = ТекстСообщения;
		ПредставлениеДанных = ТекстСообщения;
		мСцен_УстановитьЗначениеПараметра(ИмяПараметра,ЗначениеПараметра,ПараметрыСценария);

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

	КонецЕсли;

	мПараметры.ПредставлениеДанных = ПредставлениеДанных;

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

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

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

&НаКлиенте

[Assistant] Процедура мСценСкрипт_ВыполнитьКоманду(ТестовоеПриложение,ОписаниеОшибки,мПараметрыКлиент,ТекущаяПеременная, мПараметры)


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

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

Функция ИмяФункции()

	СерьезностьМассив = новый Массив;

	// IE
	стр_н = новый Структура;
	стр_н.Вставить("Браузер","IE");
	стр_н.Вставить("Синоним","IE");
	СерьезностьМассив.Добавить(стр_н);

	// Chrome
	стр_н = новый Структура;
	стр_н.Вставить("Браузер","Chrome");
	стр_н.Вставить("Синоним","Chrome");
	СерьезностьМассив.Добавить(стр_н);

	// Firefox
	стр_н = новый Структура;
	стр_н.Вставить("Браузер","Firefox");
	стр_н.Вставить("Синоним","Firefox");
	СерьезностьМассив.Добавить(стр_н);

	// Opera
	стр_н = новый Структура;
	стр_н.Вставить("Браузер","Opera");
	стр_н.Вставить("Синоним","Opera");
	СерьезностьМассив.Добавить(стр_н);

	// Edge
	стр_н = новый Структура;
	стр_н.Вставить("Браузер","Edge");
	стр_н.Вставить("Синоним","Edge");
	СерьезностьМассив.Добавить(стр_н);

	Возврат СерьезностьМассив;

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

&НаКлиенте

Процедура мИзменитьВидимостьДоступностьСвойствПоУмолчанию()

	НастройкиПоУмолчанию = Истина;
	мОтбор = новый Структура("Свойство","НастройкиПоУмолчанию");
	н_стр = СвойстваТаблицей.НайтиСтроки(мОтбор);

	Если н_стр.Количество()=1 Тогда
			НастройкиПоУмолчанию = н_стр[0].Значение;
	КонецЕсли;

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

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

&НаКлиенте

Процедура ПутьБлокШаговНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите файл";
	Диалог.ПолноеИмяФайла = "";
	Фильтр = "XML-файл (*.xml)|*.xml";
	Диалог.Фильтр = Фильтр;
	Диалог.МножественныйВыбор = Ложь;
	ВыборФайлаОткрытияСтруктурыКонфигурации = новый ОписаниеОповещения("ВыборФайлаОткрытияСтруктурыКонфигурации",ЭтотОбъект);
	Диалог.Показать(ВыборФайлаОткрытияСтруктурыКонфигурации);

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

&НаКлиенте

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

	 Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
		ПутьБлокШагов = ВыбранныеФайлы[0];
	КонецЕсли;

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

&НаКлиенте

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

&НаКлиенте

Процедура ПараметрыСценарияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	мПараметры = новый Структура("Действие,Команда",ДействиеИзСценария,КомандаИзСценария);

	Если ДействиеИзСценария="Условие" ИЛИ ДействиеИзСценария="ЗначениеВПараметр" ИЛИ ДействиеИзСценария="ИзПараметра1ВПараметр2" ИЛИ ДействиеИзСценария="ПолучитьПредставлениеДанных" ИЛИ ДействиеИзСценария="СравнитьСПредставлениемДанных" ИЛИ ДействиеИзСценария="ПроверкаНаличияЭлемента" Тогда

		ПараметрыСценарияОбработкаВыбораПараметра(мПараметры);

	КонецЕсли;

	Оповестить(ИмяТаблицы,мПараметры,ЭтаФорма);
	ЭтаФорма.Закрыть();

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

&НаКлиенте

Процедура ПараметрыСценарияОбработкаВыбораПараметра(Знач мПараметры)

	Перем ИмяПараметраСценария, ТекущиеДанные;

	ТекущиеДанные = Элементы.ПараметрыСценария.ТекущиеДанные;
	ИмяПараметраСценария = Неопределено;

	Если ТекущиеДанные<>Неопределено Тогда
		ИмяПараметраСценария = ТекущиеДанные.Имя;
	КонецЕсли;

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

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

&НаСервере

Процедура СкопироватьТаблицу(Источник,Приемник,ПоляИсточника,ПоляПриемника,ИмяПоляФильтра="",ЗначениеФильтра="")

	Если Источник = Неопределено ИЛИ Приемник=Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПоляИдентичны = Истина;
	МассивПолейИсточника = новый массив;
	МассивПолейПриемника = новый массив;
	Если Врег(ПоляИсточника)<>Врег(ПоляПриемника) Тогда
		ПоляИдентичны = Ложь;
		МассивПолейИсточника = СтрРазделить(ПоляИсточника,",",Ложь);
		МассивПолейПриемника = СтрРазделить(ПоляПриемника,",",Ложь);
	КонецЕсли;

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

	Для каждого стр из ЭлементыДерева Цикл

		Если ЗначениеЗаполнено(ИмяПоляФильтра) Тогда
			Если НЕ стр[ИмяПоляФильтра]=ЗначениеФильтра Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;

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

		СкопироватьТаблицу(стр,стр_н,ПоляИсточника,ПоляПриемника,ИмяПоляФильтра,ЗначениеФильтра);
	КонецЦикла;

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

&НаКлиенте

Процедура ДеревоПроектовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	ТекущиеДанные = Элементы.ДеревоПроектов.ТекущиеДанные;

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

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

	Оповестить(ДействиеИзСценария,мПараметры,ЭтаФорма);
	ЭтаФорма.Закрыть();

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

&НаКлиенте

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

	ТекущиеДанные.Свойство = "";
	ТекущиеДанные.Синоним = "";

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

&НаКлиенте

Процедура ПараметрыСценарияВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
	ПриянтьИЗакрыть(Неопределено);
КонецПроцедуры

[Assistant] Функция мСценРедактор_ПолучитьМассивСтруктурБраузер()