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

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

Функция ИмяФункции(Знач пНачало, Знач пДлительность) Экспорт
	Перем Начало, Длительность;
	Начало = пНачало;
	Длительность = пДлительность;
	Счетчик = Длительность;
	Окончание = Начало;
	Если Длительность >= 0 Тогда
		Пока Счетчик > 0 Цикл

			Если Счетчик >= Объект.КоличествоРабочихЧасовВДне/10 Тогда
				Окончание = Окончание + (3600 * 24);
			Иначе
				Окончание = Окончание + (3600*Счетчик*10); //Дробная часть будут часы //(3600 * Объект.КоличествоРабочихЧасовВДне)*Счетчик;
			КонецЕсли;

			Если Окончание>НачалоДня(Окончание)+Час(Объект.НачалоРабочегоДня)*3600+Минута(Объект.НачалоРабочегоДня)*60+(Объект.КоличествоРабочихЧасовВДне*3600) Тогда
				Окончание = НачалоДня(Окончание+24*3600)+Час(Объект.НачалоРабочегоДня)*3600+Минута(Объект.НачалоРабочегоДня)*60+(Окончание-(НачалоДня(Окончание)+Час(Объект.НачалоРабочегоДня)*3600+Минута(Объект.НачалоРабочегоДня)*60+(Объект.КоличествоРабочихЧасовВДне*3600)))
			КонецЕсли;

			Пока (ДеньНедели(Окончание)=7 И не Объект.ВоскресеньеРабочий) или ((ДеньНедели(Окончание)=6 и не Объект.СубботаРабочий) и Час(Окончание)>0) Цикл
				Окончание = Окончание + (3600 * 24);
			КонецЦикла;

			Счетчик = Счетчик - 1;
		КонецЦикла;
	Иначе
		Пока Счетчик < 0 Цикл

			Если Счетчик <= -Объект.КоличествоРабочихЧасовВДне/10 Тогда
				Окончание = Окончание - (3600 * 24);
			Иначе

				Пока Счетчик < 0 Цикл
					Если Час(Окончание - 3600) >= Час(Объект.НачалоРабочегоДня) и Час(Окончание - 3600) < Час(Объект.НачалоРабочегоДня)+Объект.КоличествоРабочихЧасовВДне Тогда
						Окончание = Окончание - 3600;
					Иначе
						Окончание = НачалоДня(Окончание - 24*3600) + (Час(Объект.НачалоРабочегоДня)-1)*3600 + Минута(Объект.НачалоРабочегоДня)*3600; //Дробная часть будут часы //(3600 * 24)*Счетчик;
					КонецЕсли;

					//Если Окончание<НачалоДня(Окончание)+Час(Объект.НачалоРабочегоДня)*3600+Минута(Объект.НачалоРабочегоДня)*60 Тогда
					//	Окончание = НачалоДня(Окончание-24*3600)+Час(Объект.НачалоРабочегоДня)*3600+Минута(Объект.НачалоРабочегоДня)*60+(Объект.КоличествоРабочихЧасовВДне*3600)
					//					-((НачалоДня(Окончание-24*3600)+Час(Объект.НачалоРабочегоДня)*3600+Минута(Объект.НачалоРабочегоДня)*60)-Окончание)
					//КонецЕсли;

					Счетчик = Счетчик + 0.1;
				КонецЦикла;

			КонецЕсли;

			Пока (ДеньНедели(Окончание)=7 и Не Объект.ВоскресеньеРабочий) или ((ДеньНедели(Окончание)=6 и Не Объект.СубботаРабочий) и Час(Окончание)>0) Цикл
				Окончание = Окончание - (3600 * 24);
			КонецЦикла;

			Счетчик = Счетчик + 1;
		КонецЦикла;
	КонецЕсли;

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

&НаКлиенте

Функция РасчитатьРазницуМеждуДатами(Знач пНачало, Знач пОкончание) Экспорт
	Перем Начало, Окончание;
	Начало = пНачало;
	Окончание = пОкончание;

	Длительность = 0;
	Пока Начало<Окончание Цикл
		Если НачалоДня(Начало) <> НачалоДня(Окончание) и Начало + (3600 * 24) <> ВернутьДатуСУчетомВыходных(Начало + (3600 * 24), Ложь) Тогда
			Начало = Начало + (3600 * 24);
			Продолжить;
		ИначеЕсли Окончание - Начало >=(3600*24) Тогда
			Длительность = Длительность + 1;

		ИначеЕсли (Окончание - Начало >= 24*3600) или
			(Окончание - Начало >=(3600*Объект.КоличествоРабочихЧасовВДне) и НачалоДня(Окончание)= НачалоДня(Начало))
			Тогда
			Если Не (Час(Окончание) <= Час(Объект.НачалоРабочегоДня) или Час(Начало) >= Час(Объект.НачалоРабочегоДня)+Объект.КоличествоРабочихЧасовВДне) Тогда
				Длительность = Длительность + 1;
			КонецЕсли;
		ИначеЕсли (Окончание - Начало >=(3600*Объект.КоличествоРабочихЧасовВДне) и НачалоДня(Окончание) <> НачалоДня(Начало)) и Окончание - Начало < 24*3600 Тогда // переход на следующий день, но еще не прошло полностью сутки
			КонецРабочегоДня = Объект.НачалоРабочегоДня + 3600*Объект.КоличествоРабочихЧасовВДне;
			ВремяВСекундах = ((НачалоДня(Начало) + Час(КонецРабочегоДня)*3600 + Минута(КонецРабочегоДня)*60)-Начало) +
				(Окончание - (НачалоДня(Окончание) + Час(Объект.НачалоРабочегоДня)*3600 + Минута(Объект.НачалоРабочегоДня)*60));
			Длительность = Длительность + Мин(Окр(ВремяВСекундах/(3600*10), 1), 1);
		Иначе
			Длительность = Длительность + Окр((Окончание - Начало)/(3600*10), 1); // Дробная часть будет в часах //Объект.КоличествоРабочихЧасовВДне);
		КонецЕсли;

		Начало = Начало + (3600 * 24);

		Начало = ВернутьДатуСУчетомВыходных(Начало, Ложь);
		//Пока (ДеньНедели(Начало)=6 и Не Объект.СубботаРабочий) или (ДеньНедели(Начало)=7 и Не Объект.ВоскресеньеРабочий) Цикл
		//	Начало = Начало + (3600 * 24);
		//КонецЦикла;
	КонецЦикла;
	Возврат Длительность;
КонецФункции

&НаКлиенте

[Assistant] Функция РасчитатьОкончание(Знач пНачало, Знач пДлительность)


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

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

Функция ИмяФункции(Знач Строка, РасчитатьБезДополнительныхЗатрат = ложь, Таблица ) Экспорт
	СтрокаТаблицы = Таблица[Строка];
	Длительность = СтрокаТаблицы["Длит_Дн_"];
	Затраты 	= 0;
	Стоимость 	= 0;

	Если Не ЭтоСуммирующаяЗадача(Строка+2) Тогда
		// обычная задача
		ТаблицаРесурсов = ПолучитьСписокРесурсовЗадачи(Строка+2);

		МассивУдаляемыхСтрок = Новый Массив;
		НужноОбновлятьТаблицуРесурсовВЗадаче = Ложь;
		Для Каждого СтрокаРесурсовЗадачи из ТаблицаРесурсов Цикл
			Если ЗначениеЗаполнено(СтрокаРесурсовЗадачи.GUID_Ресурса) Тогда
				СтрокаТаблицыРесурсов = СоответствиеСтрокРесурсовПоGUIDамПолучить(СтрокаРесурсовЗадачи.GUID_Ресурса);
				Если СтрокаТаблицыРесурсов = Неопределено Тогда
					ТаблицаРесурсовЗадачи.Удалить(СтрокаРесурсовЗадачи);
					НужноОбновлятьТаблицуРесурсовВЗадаче = Истина;
					Продолжить;
				ИначеЕсли СтрокаТаблицыРесурсов.ТипРесурса = "Трудовой" Тогда
					Затраты = Затраты + (Длительность*Объект.КоличествоРабочихЧасовВДне*(СтрокаРесурсовЗадачи.Единицы/100)*СтрокаТаблицыРесурсов.СтоимостьЗатрат)+СтрокаТаблицыРесурсов.ЗатратыНаИспользование;
					Стоимость = Стоимость + (Длительность*Объект.КоличествоРабочихЧасовВДне*(СтрокаРесурсовЗадачи.Единицы/100)*СтрокаТаблицыРесурсов.ОтпускнаяСтоимость)+СтрокаТаблицыРесурсов.СтоимостьНаИспользование;
				Иначе
					Затраты = Затраты + (СтрокаРесурсовЗадачи.Единицы*СтрокаТаблицыРесурсов.СтоимостьЗатрат)+СтрокаТаблицыРесурсов.ЗатратыНаИспользование;
					Стоимость = Стоимость + (СтрокаРесурсовЗадачи.Единицы*СтрокаТаблицыРесурсов.ОтпускнаяСтоимость)+СтрокаТаблицыРесурсов.СтоимостьНаИспользование;
				КонецЕсли;

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

		Если НужноОбновлятьТаблицуРесурсовВЗадаче Тогда
			пТаблицаРесурсовЗадачи = ПолучитьСписокРесурсовЗадачи(Строка+2);
			ПредставлениеРесурсов = "";
			Для Каждого СтрокаРесурсов из пТаблицаРесурсовЗадачи Цикл

				СтрокаИзСпискаРесурсов = СоответствиеСтрокРесурсовПоGUIDамПолучить(СтрокаРесурсов.GUID_Ресурса);
				Если Не СтрокаИзСпискаРесурсов = Неопределено Тогда
					КраткоеНазвание = ?(ЗначениеЗаполнено(СтрокаРесурсов.КраткоеНазвание), СтрокаРесурсов.КраткоеНазвание, СтрокаРесурсов.НазваниеРесурса);
					ПредставлениеРесурсов = ПредставлениеРесурсов + КраткоеНазвание + ";";
				КонецЕсли;
			КонецЦикла;

			Если СтрДлина(ПредставлениеРесурсов) > 0 Тогда
				ПредставлениеРесурсов = Лев(ПредставлениеРесурсов, СтрДлина(ПредставлениеРесурсов)-1);
			КонецЕсли;

			тдПроект.Область(Строка+2, НомерКолонкиРесурсыПредставление,Строка+2, НомерКолонкиРесурсыПредставление).текст = ПредставлениеРесурсов;
			тдПроект.Область(Строка+2, НомерКолонкиРесурсы,Строка+2, НомерКолонкиРесурсы).текст = ПредставлениеРесурсов;
		КонецЕсли;

		Если Не РасчитатьБезДополнительныхЗатрат Тогда
			Затраты = Затраты + СтрокаТаблицы["Дополнительные_затраты"];
			Стоимость = Стоимость + СтрокаТаблицы["Доп_стоимость"];
		КонецЕсли;
	Иначе
		Затраты = СтрокаТаблицы["Затраты"];
		Стоимость = СтрокаТаблицы["Стоимость"];
	КонецЕсли;

	Возврат Новый Структура("Затраты, Стоимость", Затраты, Стоимость);
КонецФункции

&НаКлиенте

Процедура УстановитьЗатраты(Знач Строка, Знач Затраты) Экспорт
	тдПроект.Область(Строка, НомерКолонкиЗатраты, Строка, НомерКолонкиЗатраты).Значение = Затраты;
КонецПроцедуры

&НаКлиенте

Процедура УстановитьСтоимость(Знач Строка, Знач Стоимость) Экспорт
	тдПроект.Область(Строка, НомерКолонкиСтоимость, Строка, НомерКолонкиСтоимость).Значение = Стоимость;
КонецПроцедуры

&НаКлиенте

Процедура ПолучитьЗатратыЗадачи(Знач Строка, Знач РасчитатьБезДополнительныхЗатрат = ложь, Затраты = 0, Стоимость = 0) Экспорт

	Длительность = тдПроект.Область(Строка, НомерКолонкиДлительность, Строка, НомерКолонкиДлительность).Значение;

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

		МассивУдаляемыхСтрок = Новый Массив;
		НужноОбновлятьТаблицуРесурсовВЗадаче = Ложь;
		Для Каждого СтрокаРесурсовЗадачи из ТаблицаРесурсов Цикл
			Если ЗначениеЗаполнено(СтрокаРесурсовЗадачи.GUID_Ресурса) Тогда
				СтрокаТаблицыРесурсов = СоответствиеСтрокРесурсовПоGUIDамПолучить(СтрокаРесурсовЗадачи.GUID_Ресурса);
				Если СтрокаТаблицыРесурсов = Неопределено Тогда
					МассивУдаляемыхСтрок.Добавить(СтрокаРесурсовЗадачи);
					НужноОбновлятьТаблицуРесурсовВЗадаче = Истина;
					Продолжить;
				ИначеЕсли СтрокаТаблицыРесурсов.ТипРесурса = "Трудовой" Тогда
					Затраты = Затраты + (Длительность*Объект.КоличествоРабочихЧасовВДне*(СтрокаРесурсовЗадачи.Единицы/100)*СтрокаТаблицыРесурсов.СтоимостьЗатрат)+СтрокаТаблицыРесурсов.ЗатратыНаИспользование;
					Стоимость = Стоимость + (Длительность*Объект.КоличествоРабочихЧасовВДне*(СтрокаРесурсовЗадачи.Единицы/100)*СтрокаТаблицыРесурсов.ОтпускнаяСтоимость)+СтрокаТаблицыРесурсов.СтоимостьНаИспользование;
				Иначе
					Затраты = Затраты + (СтрокаРесурсовЗадачи.Единицы*СтрокаТаблицыРесурсов.СтоимостьЗатрат)+СтрокаТаблицыРесурсов.ЗатратыНаИспользование;
					Стоимость = Стоимость + (СтрокаРесурсовЗадачи.Единицы*СтрокаТаблицыРесурсов.ОтпускнаяСтоимость)+СтрокаТаблицыРесурсов.СтоимостьНаИспользование;
				КонецЕсли;

				Если СтрокаТаблицыРесурсов.НазваниеРесурса <> СтрокаРесурсовЗадачи.НазваниеРесурса Тогда
					СтрокаРесурсовЗадачи.НазваниеРесурса = СтрокаТаблицыРесурсов.НазваниеРесурса;
					НужноОбновлятьТаблицуРесурсовВЗадаче = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;

		Если НужноОбновлятьТаблицуРесурсовВЗадаче Тогда
			Для Каждого ЭлементМассива из МассивУдаляемыхСтрок Цикл
				ТаблицаРесурсов.Удалить(ЭлементМассива);
				ТаблицаРесурсовЗадачи.Удалить(ЭлементМассива);
			КонецЦикла;

		КонецЕсли;

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

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

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

//////////////////////////////////////////////////////////////////////////////////
// Работа со связями

#Область РаботаСоСвязями

&НаКлиенте

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

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

&НаКлиенте

[Assistant] Функция ПолучитьЗатратыЗадачи2(Знач Строка, РасчитатьБезДополнительныхЗатрат = ложь, Таблица)


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

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

Функция ИмяФункции(ИсходнаяСтрока,  СтрокаТзРаботы,СтруктураПозиции, Смещение = 0)
	КоличествоРесурсов = 1;
	Если СтруктураПозиции.Названия_ресурсов > 0 Тогда
		// Разбираем ресурсы

		Строка = ИсходнаяСтрока;

		Для Индекс = 0 по СтруктураПозиции.Названия_ресурсов + Смещение -2 Цикл
			Позиция = Найти(Строка,";");
			Если Позиция = 0 Тогда
				Возврат 0;
			КонецЕсли;
			Строка = Прав(Строка,СтрДлина(Строка)-Позиция);
		КонецЦикла;

		Символ = Сред(Строка,1,1);
		Если Символ = """" Тогда
			Строка = Прав(Строка,СтрДлина(Строка)-1);
			Поз = Найти(Строка,"""");
			Ресурсы = Лев(Строка,Поз-1);
			Строка = Прав(Строка,СтрДлина(Строка)-Поз-1);//убираем так же последнюю кавычку
		Иначе
			Поз = Найти(Строка,";");
			Ресурсы = Лев(Строка,Поз-1);
			Строка = Прав(Строка,СтрДлина(Строка)-Поз);
		КонецЕсли;

		Поз0 = Найти(Ресурсы,";");
		Пока Поз0 > 0 Цикл
			СтрокаРесурса = ТаблицаРесурсовЗадачи.Добавить();

			Наименование = Лев(Ресурсы,Поз0-1);
			ПозСкобка = Найти(Наименование,"[");
			Если ПозСкобка = 0 Тогда
				Единиц = 100;
			Иначе
				ПозСкобка2 = Найти(Ресурсы,"]");
				Единиц = ИзСтрокиВЧисло(Лев(Наименование,ПозСкобка2-1));
			КонецЕсли;

			Если ПозСкобка>0 Тогда
			   Наименование = Лев(Наименование,ПозСкобка-1);
			КонецЕсли;

			СтрокаРесурса.НазваниеРесурса = Наименование;

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

			СтрокаРесурса.Единицы = Единиц;
			СтрокаРесурса.GUID_Ресурса    = ИскомаяСтрокаРесурсов.GUID_Ресурса;
			СтрокаРесурса.GUID_Задачи     = СтрокаТзРаботы.GUID;
			СтрокаРесурса.КраткоеНазвание = ИскомаяСтрокаРесурсов.КраткоеНазвание;
			СтрокаРесурса.ТипРесурса 	  = ИскомаяСтрокаРесурсов.ТипРесурса;

			Ресурсы = Прав(Ресурсы,СтрДлина(Ресурсы)-Поз0);

			Поз0 = Найти(Ресурсы,";");
		КонецЦикла;

		Если СокрЛП(Ресурсы)<>"" Тогда

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

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

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

			СтрокаРесурса.Единицы = Единиц;
			СтрокаРесурса.GUID_Ресурса    = ИскомаяСтрокаРесурсов.GUID_Ресурса;
			СтрокаРесурса.GUID_Задачи     = СтрокаТзРаботы.GUID;
			СтрокаРесурса.КраткоеНазвание = ИскомаяСтрокаРесурсов.КраткоеНазвание;
			СтрокаРесурса.ТипРесурса 	  = ИскомаяСтрокаРесурсов.ТипРесурса;

		КонецЕсли;

		КоличествоРесурсов = Макс(1, ТаблицаРесурсовЗадачи.НайтиСтроки(Новый Структура("GUID_Задачи", СтрокаТзРаботы.GUID)).Количество());
		//конец разбора ресурсов
	КонецЕсли;

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

&НаСервере

[Assistant] Функция ВычитатьРесурсыЗадачиProject(ИсходнаяСтрока,  СтрокаТзРаботы,СтруктураПозиции, Смещение = 0)


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

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

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

		Строка = ИсходнаяСтрока;

		Для Индекс = 0 по СтруктураПозиции.Предшественники + Смещение - 2 Цикл
			Позиция = Найти(Строка,";");
			Если Позиция = 0 Тогда
				Возврат 0;
			КонецЕсли;
			Строка = Прав(Строка,СтрДлина(Строка)-Позиция);
		КонецЦикла;

		//Предшественники
		Символ = Сред(Строка,1,1);
		Если Символ = """" Тогда
			Строка = Прав(Строка,СтрДлина(Строка)-1);
			Поз = Найти(Строка,"""");
			Предшественники = Лев(Строка,Поз-1);
			Строка = Прав(Строка,СтрДлина(Строка)-Поз-1);//убираем так же последнюю кавычку
		Иначе
			Поз = Найти(Строка,";");
			Предшественники = Лев(Строка,Поз-1);
			Строка = Прав(Строка,СтрДлина(Строка)-Поз);
		КонецЕсли;

		//Заполняем таблицу предшественников
		Индекс = Найти(Предшественники,";");
		Пока Индекс > 0 Цикл
			СтрокаСвязи = ТаблицаСвязей.Добавить();

			ОдинПредшественник = Лев(Предшественники,Индекс-1);
		    Предшественники = Прав(Предшественники,СтрДлина(Предшественники)-Индекс);
			Индекс = Найти(Предшественники,";");

			Если Найти(ОдинПредшественник,"О")>0 Тогда
			    Если Найти(ОдинПредшественник,"Н")>0 Тогда
				   ПозОН = Мин(Найти(ОдинПредшественник,"О"),Найти(ОдинПредшественник,"Н"));
				Иначе
				   ПозОН = Найти(ОдинПредшественник,"О");
				КонецЕсли;
			Иначе
			    ПозОН = Найти(ОдинПредшественник,"Н");
			КонецЕсли;

			Если ПозОН>0 Тогда
				НомерСтроки = Число(Лев(ОдинПредшественник,ПозОН-1));
				ТипСвязи = Сред(ОдинПредшественник,ПозОН,2);
				ОдинПредшественник = Прав(ОдинПредшественник,СтрДлина(ОдинПредшественник)-ПозОН-2);//захватываем последующий плюс
				СтрокаСвязи.Начало = Число(НомерСтроки)+3;
				СтрокаСвязи.ВидСвязи = ПолучитьВидСвязиИзProject(ТипСвязи);
	            СтрокаСвязи.Запаздывание = ИзСтрокиВЧисло(ОдинПредшественник);
				СтрокаСвязи.Конец = НомерТекущейСтроки;
			Иначе
				СтрокаСвязи.Начало = Число(ОдинПредшественник)+3;
				СтрокаСвязи.ВидСвязи = ПолучитьВидСвязиИзProject("ОН");
	            СтрокаСвязи.Запаздывание = 0;
				СтрокаСвязи.Конец = НомерТекущейСтроки;
			КонецЕсли;

		КонецЦикла;

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

		КонецЕсли;

		КоличествоПредшественников = Макс(1, ТаблицаСвязей.НайтиСтроки(Новый Структура("Конец", НомерТекущейСтроки)).Количество());
		/////////////////////////////////////////////////////////////////////////
	КонецЕсли;

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

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

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

	Попытка
		Поз = Найти(Стр," ");//удаляем первый пробел
	    Стр = Прав(Стр,СтрДлина(Стр)-Поз);

	    Поз = Найти(Стр,".");
		День = Число(Лев(Стр,Поз-1));
		Стр = Прав(Стр,СтрДлина(Стр)-Поз);

		Поз = Найти(Стр,".");
		Месяц = Число(Лев(Стр,Поз-1));
		Год = Число(Прав(Стр,СтрДлина(Стр)-Поз));

		Если Год <90 Тогда
			Год = 2000+Год;
		ИначеЕсли Год < 100 Тогда
			Год = 1900+Год;
		КонецЕсли;

		Возврат Дата(Год,Месяц,День);
	Исключение
		Возврат Неопределено;
	КонецПопытки;

КонецФункции //ПреобразоватьВДату

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

Функция ПолучитьПредставлениеВидСвязиДляProjectНаСервере(ВидСвязи)
		Если ВидСвязи = 1 Тогда
			Возврат "Окончание-Окончание";
		ИначеЕсли ВидСвязи = 2 Тогда
			Возврат "Начало-Окончание";
		ИначеЕсли ВидСвязи = 3 Тогда
			Возврат "Начало-Начало";
		Иначе
			Возврат "Окончание-Начало";
		КонецЕсли;
КонецФункции

&НаСервере

Функция	ПолучитьВидСвязиИзProject(ВидСвязи)
		Если ВидСвязи = "ОО" Тогда
			Возврат 1;
		ИначеЕсли ВидСвязи = "НО" Тогда
			Возврат 2;
		ИначеЕсли ВидСвязи = "НН" Тогда
			Возврат 3;
		Иначе
			Возврат 0;
		КонецЕсли;
КонецФункции

&НаСервере

[Assistant] Функция ВычитатьПредшественниковProject(ИсходнаяСтрока, СтрокаТзРаботы,СтруктураПозиции, Смещение = 0)


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

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

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

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

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

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

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

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

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

&НаКлиенте

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

&НаКлиенте

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

// Обработчик оповещения вопроса.
//
// Параметры:
//   Ответ - КодВозвратаДиалога
//   ДополнительныеПараметры - Структура:
//     * Вариант - ДанныеФормыЭлементДерева:
//         ** Ссылка - СправочникСсылка.ВариантыОтчетов
//         ** ИндексКартинки - Число
//
&НаКлиенте

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

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

Функция ПравоИзмененияВарианта(Вариант, ПолныеПраваНаВарианты)
	Возврат ПолныеПраваНаВарианты Или Вариант.АвторТекущийПользователь;
КонецФункции

&НаСервере

Процедура ЗаполнитьСписокВариантов()

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

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

	// Заполнить автовычисляемые колонки
	ТаблицаВариантов.Колонки.Добавить("АвторТекущийПользователь", Новый ОписаниеТипов("Булево"));
	ТаблицаВариантов.Колонки.Добавить("ИндексКартинки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Любой)));
	ТаблицаВариантов.Колонки.Добавить("Порядок", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Любой)));
	Для каждого Вариант Из ТаблицаВариантов Цикл
		Вариант.АвторТекущийПользователь = (Вариант.Автор = ТекущийПользователь);
		Вариант.ИндексКартинки = ?(Вариант.ПометкаУдаления, 4, ?(Вариант.Пользовательский, 3, 5));
		Вариант.Порядок = ?(Вариант.ПометкаУдаления, 3, 1);
	КонецЦикла;

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

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

	Для Каждого СведенияОВарианте Из ТаблицаВариантов Цикл
		Если Не ЗначениеЗаполнено(СведенияОВарианте.КлючВарианта) Тогда
			Продолжить;
		КонецЕсли;
		НаборСтрокДерева = ГруппыДерева.Получить(СведенияОВарианте.Порядок);
		Если НаборСтрокДерева = Неопределено Тогда
			ГруппаДерева = ДеревоВариантовОтчета.ПолучитьЭлементы().Добавить();
			ГруппаДерева.НомерГруппы = СведенияОВарианте.Порядок;
			Если СведенияОВарианте.Порядок = 3 Тогда
				ГруппаДерева.Наименование = НСтр("ru = 'Помеченные на удаление'");
				ГруппаДерева.ИндексКартинки = 1;
				ГруппаДерева.КартинкаАвтора = -1;
			КонецЕсли;
			НаборСтрокДерева = ГруппаДерева.ПолучитьЭлементы();
			ГруппыДерева.Вставить(СведенияОВарианте.Порядок, НаборСтрокДерева);
		КонецЕсли;

		Вариант = НаборСтрокДерева.Добавить();
		ЗаполнитьЗначенияСвойств(Вариант, СведенияОВарианте);
		Вариант.НомерГруппы = СведенияОВарианте.Порядок;
		Если Вариант.КлючВарианта = ТекущийКлючВарианта Тогда
			Элементы.ДеревоВариантовОтчета.ТекущаяСтрока = Вариант.ПолучитьИдентификатор();
		КонецЕсли;
		Вариант.КартинкаАвтора = ?(Вариант.ТолькоДляАвтора, -1, 0);
		Если СведенияОВарианте.Назначение = Перечисления.НазначенияВариантовОтчетов.ДляСмартфонов Тогда
			Вариант.КартинкаНазначение = 0;
		ИначеЕсли СведенияОВарианте.Назначение = Перечисления.НазначенияВариантовОтчетов.ДляКомпьютеровИПланшетов Тогда
			Вариант.КартинкаНазначение = 1;
		ИначеЕсли СведенияОВарианте.Назначение = Перечисления.НазначенияВариантовОтчетов.ДляЛюбыхУстройств Тогда
			Вариант.КартинкаНазначение = 2;
		КонецЕсли;
	КонецЦикла;

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

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

Процедура УдалитьВариантНаСервере(ВариантыОтчетовСсылка, ИндексКартинки)

	НачатьТранзакцию();
	Попытка
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("Справочник.ВариантыОтчетов");
		ЭлементБлокировки.УстановитьЗначение("Ссылка", ВариантыОтчетовСсылка);
		Блокировка.Заблокировать();

		ВариантОбъект = ВариантыОтчетовСсылка.ПолучитьОбъект();
		ПометкаУдаления = Не ВариантОбъект.ПометкаУдаления;
		Пользовательский = ВариантОбъект.Пользовательский;
		ВариантОбъект.УстановитьПометкуУдаления(ПометкаУдаления);

		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	ИндексКартинки = ?(ПометкаУдаления, 4, ?(Пользовательский, 3, 5));

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

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


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

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

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

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

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

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

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

			Если СпроситьОПерезаписиВариантаОтчета(Пакет, Вариант) Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;

		// Проверка завершена.
		Пакет.ПроверитьСтраницу1 = Ложь;
	КонецЕсли;

	Если СпроситьОУведомленииПользователей(Пакет) Тогда
		Возврат;
	КонецЕсли;

	Если Пакет.ПерейтиНаСтраницу2 = Истина Тогда
		// Для внешних отчетов выполняются только проверки заполнения, без переключения страницы.
		Если Не Контекст.ЭтоВнешний Тогда
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ВыполнитьПакет(Результат, Пакет) Экспорт

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

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

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

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

			Если СпроситьОПерезаписиВариантаОтчета(Пакет, Вариант) Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли;

		// Проверка завершена.
		Пакет.ПроверитьСтраницу1 = Ложь;
	КонецЕсли;

	Если СпроситьОУведомленииПользователей(Пакет) Тогда
		Возврат;
	КонецЕсли;

	Если Пакет.ПерейтиНаСтраницу2 = Истина Тогда
		// Для внешних отчетов выполняются только проверки заполнения, без переключения страницы.
		Если Не Контекст.ЭтоВнешний Тогда
			Элементы.Страницы.ТекущаяСтраница = Элементы.Дополнительно;
			Элементы.Назад.Доступность        = Истина;
			Элементы.Далее.Доступность        = Ложь;
		КонецЕсли;

		// Переключение выполнено.
		Пакет.ПерейтиНаСтраницу2 = Ложь;
	КонецЕсли;

	Если Пакет.ЗаполнитьСтраницу2Сервер = Истина
		Или Пакет.ПроверитьИЗаписатьСервер = Истина Тогда

		ВыполнитьПакетСервер(Пакет);

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

		Если Пакет.Отказ = Истина Тогда
			ПерейтиНаСтраницу1();
			Возврат;
		КонецЕсли;

	КонецЕсли;

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

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

&НаКлиенте

Функция ПродолжитьВыполнениеПакета(Результат, Пакет)

	ТекущийШаг = Пакет.ТекущийШаг;

	Пакет.ТекущийШаг = Неопределено;

	Если ТекущийШаг = "ВопросНаПерезапись" Тогда

		Если Результат <> КодВозвратаДиалога.Да Тогда
			Возврат Ложь;
		КонецЕсли;

		Пакет.Вставить("ВопросНаПерезаписьПройден", Истина);

	ИначеЕсли ТекущийШаг = "ВопросОУведомленииПользователей" Тогда

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

	КонецЕсли;

	Возврат Истина;

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

&НаКлиенте

Функция СпроситьОПерезаписиВариантаОтчета(Пакет, Вариант)

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

	Пакет.ТекущийШаг = "ВопросНаПерезапись";

	Если Вариант.ПометкаУдаления = Истина Тогда

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

	ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаВопроса, Объект.Наименование);

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

	Возврат Истина;

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

&НаКлиенте

Функция СпроситьОУведомленииПользователей(Пакет)

	Если Не УведомитьПользователей
		Или Пакет.Свойство("ВопросОУведомленииПользователейЗадан") Тогда

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

	КоличествоПользователей = КоличествоПользователейВариантОтчета(ПользователиВарианта);

	Если КоличествоПользователей < 10 Тогда
		Возврат Ложь;
	КонецЕсли;

	Пакет.ТекущийШаг = "ВопросОУведомленииПользователей";

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

	Возврат Истина;

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

&НаКлиенте

Процедура ПерейтиНаСтраницу1()

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

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

&НаКлиенте

Процедура СохранитьИЗакрыть()

	СтраницаДополнительноЗаполнена = (Элементы.Страницы.ТекущаяСтраница = Элементы.Дополнительно);

	Пакет = Новый Структура;
	Пакет.Вставить("ПроверитьСтраницу1",       Не СтраницаДополнительноЗаполнена);
	Пакет.Вставить("ПерейтиНаСтраницу2",       Не СтраницаДополнительноЗаполнена);
	Пакет.Вставить("ЗаполнитьСтраницу2Сервер", Не СтраницаДополнительноЗаполнена);
	Пакет.Вставить("ПроверитьИЗаписатьСервер", Истина);
	Пакет.Вставить("ЗакрытьПослеЗаписи",       Истина);
	Пакет.Вставить("ТекущийШаг", Неопределено);

	ВыполнитьПакет(Неопределено, Пакет);

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

&НаКлиенте

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

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

	Объект.Описание = ВведенныйТекст;

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

////////////////////////////////////////////////////////////////////////////////
// Клиент и сервер

// Возвращает признак наличия права изменения варианта отчета.
//
// Параметры:
//   Вариант - ДанныеФормыКоллекция:
//     * Ссылка - СправочникСсылка.ВариантыОтчетов
//   ПолныеПраваНаВарианты - Булево
//
// Возвращаемое значение:
//   Булево
//
&НаКлиентеНаСервереБезКонтекста

Функция ПравоНастройкиВарианта(Вариант, ПолныеПраваНаВарианты)

	Возврат (ПолныеПраваНаВарианты Или Вариант.АвторТекущийПользователь) И ЗначениеЗаполнено(Вариант.Ссылка);

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

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

Функция ПравоЗаписиВарианта(Вариант, ПолныеПраваНаВарианты)

	Возврат Вариант.Пользовательский И ПравоНастройкиВарианта(Вариант, ПолныеПраваНаВарианты);

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

// Возвращает уникальное наименование варианта отчета.
//
// Параметры:
//   Вариант - ДанныеФормыКоллекция:
//     * Ссылка - СправочникСсылка.ВариантыОтчетов
//     * Наименование - Строка
//   ВариантыОтчета - ДанныеФормыКоллекция
//
// Возвращаемое значение:
//   Строка
//
&НаКлиентеНаСервереБезКонтекста

Функция СформироватьСвободноеНаименование(Вариант, ВариантыОтчета)

	ШаблонИмениВарианта = СокрЛП(Вариант.Наименование) + " - " + НСтр("ru = 'копия'");

	СвободноеНаименование = ШаблонИмениВарианта;
	Найденные = ВариантыОтчета.НайтиСтроки(Новый Структура("Наименование", СвободноеНаименование));
	Если Найденные.Количество() = 0 Тогда
		Возврат СвободноеНаименование;
	КонецЕсли;

	НомерВарианта = 1;
	Пока Истина Цикл
		НомерВарианта = НомерВарианта + 1;
		СвободноеНаименование = ШаблонИмениВарианта +" (" + Формат(НомерВарианта, "") + ")";
		Найденные = ВариантыОтчета.НайтиСтроки(Новый Структура("Наименование", СвободноеНаименование));
		Если Найденные.Количество() = 0 Тогда
			Возврат СвободноеНаименование;
		КонецЕсли;
	КонецЦикла;

	Возврат ШаблонИмениВарианта;

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

&НаКлиенте

Процедура ЗаполнитьСписокВариантовОтложенно()

	Если ВариантыКонтекста.Количество() > 0 Тогда
		ЗаполнитьСписокВариантов();
	КонецЕсли;

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

////////////////////////////////////////////////////////////////////////////////
// Вызов сервера

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


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

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

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();

	ЗакрыватьПриВыборе = Ложь;

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

[Assistant]
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

	УстановитьУсловноеОформление();

	ЗакрыватьПриВыборе = Ложь;

	ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры, "НастройкиОтчета, КомпоновщикНастроек");
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(НастройкиОтчета.АдресСхемы));

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

	ОбновитьОтборы(ТипФормыВладельца);
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыОтборыТаблица

&НаКлиенте
Процедура ОтборыПриАктивизацииСтроки(Элемент)
	Список = Элементы.ОтборыВидСравнения.СписокВыбора;
	Список.Очистить();

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

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

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

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

&НаКлиенте
Процедура Выбрать(Команда)
	ВыбратьИЗакрыть();
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()
	УсловноеОформление.Элементы.Очистить();

	// ПредставлениеПользовательскойНастройки - НеЗаполнено.
	// Представление - Заполнено.
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("Отборы.Представление"));

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

	// ПредставлениеПользовательскойНастройки - НеЗаполнено.
	// Представление - НеЗаполнено.
	// Заголовок - Заполнено.
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

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

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

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

&НаСервере
Процедура ОбновитьОтборы(ТипФормыВладельца)
	Строки = Отборы.ПолучитьЭлементы();

	ДопустимыеРежимыОтображения = Новый Массив;
	ДопустимыеРежимыОтображения.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто);
	ДопустимыеРежимыОтображения.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ);
	Если ТипФормыВладельца = ТипФормыОтчета.Настройка Тогда
		ДопустимыеРежимыОтображения.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
	КонецЕсли;

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

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

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

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

		Строка = Строки.Добавить();
		ЗаполнитьЗначенияСвойств(Строка, ОписаниеНастройки);
		ЗаполнитьЗначенияСвойств(Строка, ЭлементНастройки, "Представление, ПредставлениеПользовательскойНастройки");

		Строка.ВидСравнения = ЭлементПользовательскойНастройки.ВидСравнения;

		ДоступныеВидыСравнения = ОписаниеНастройки.ДоступныеВидыСравнения;
		Если ДоступныеВидыСравнения <> Неопределено
			И ДоступныеВидыСравнения.Количество() > 0
			И ДоступныеВидыСравнения.НайтиПоЗначению(Строка.ВидСравнения) = Неопределено Тогда
			Строка.ВидСравнения = ДоступныеВидыСравнения[0].Значение;
		КонецЕсли;

		Строка.Идентификатор = ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ЭлементПользовательскойНастройки);
		Строка.ИсходныйВидСравнения = Строка.ВидСравнения;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьИЗакрыть()
	УсловияОтборов = Новый Соответствие;

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

	Закрыть(УсловияОтборов);
КонецПроцедуры

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


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

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

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();

	ИспользоватьПодчиненныеБизнесПроцессы = ПолучитьФункциональнуюОпцию("ИспользоватьПодчиненныеБизнесПроцессы");

	Если ИспользоватьПодчиненныеБизнесПроцессы Тогда
		Элементы.Список.Видимость = Ложь;
		Элементы.КоманднаяПанельСписка.Видимость = Ложь;
		Элементы.ПоказыватьВыполненные.Видимость = Ложь;
		Элементы.ДеревоЗадач.Видимость = Истина;
	Иначе
		Элементы.Список.Видимость = Истина;
		Элементы.КоманднаяПанельСписка.Видимость = Истина;
		Элементы.ПоказыватьВыполненные.Видимость = Истина;
		Элементы.ДеревоЗадач.Видимость = Ложь;
	КонецЕсли;
    // TODO: допиши оставшуюся часть

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

	УстановитьУсловноеОформление();

	ИспользоватьПодчиненныеБизнесПроцессы = ПолучитьФункциональнуюОпцию("ИспользоватьПодчиненныеБизнесПроцессы");

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

	Список.Параметры.Элементы[0].Значение = Параметры.ЗначениеОтбора;
	Список.Параметры.Элементы[0].Использование = Истина;
	Заголовок = НСтр("ru = 'Задачи по предмету'");
	ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач");
	Элементы.СрокИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D");
	УстановитьОтбор(Новый Структура("ПоказыватьВыполненные", ПоказыватьВыполненные));

	Если ИспользоватьПодчиненныеБизнесПроцессы Тогда
		ЗаполнитьДеревоЗадач();
	КонецЕсли;

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

&НаКлиенте

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

&НаСервере

Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	УстановитьОтбор(Настройки);
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте

Процедура ПоказыватьВыполненныеПриИзменении(Элемент)
	УстановитьОтбор(Новый Структура("ПоказыватьВыполненные", ПоказыватьВыполненные));
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоЗадач

&НаКлиенте

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

	СтандартнаяОбработка = Ложь;
	ОткрытьТекущуюСтрокуДереваЗадач();

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

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

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

&НаКлиенте

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

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

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

&НаКлиенте

Процедура Изменить(Команда)

	ОткрытьТекущуюСтрокуДереваЗадач();

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

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

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

&НаСервере

Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДеревоЗадач.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПросроченныеДанныеЦвет);

	//

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДеревоЗадач.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЗавершенныйБизнесПроцесс);

	БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список);

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

&НаСервере

Процедура УстановитьОтбор(ПараметрыОтбора)

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

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

&НаСервере

Процедура ЗаполнитьДеревоЗадач()

	Дерево = РеквизитФормыВЗначение("ДеревоЗадач");
	Дерево.Строки.Очистить();

	ДобавитьЗадачиПоПредмету(Дерево, Параметры.ЗначениеОтбора);

	ЗначениеВРеквизитФормы(Дерево, "ДеревоЗадач");

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

&НаСервере

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

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

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

&НаСервере

Процедура ДобавитьЗадачиПоПредмету(Дерево, Предмет)

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

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

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

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

 	ЗадачиПоПредмету = БизнесПроцессыИЗадачиСервер.НовыеЗадачиПоПредмету();

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

		Ветвь = Дерево.Строки.Найти(ВыборкаДетальныеЗаписи.Ссылка, "Ссылка", Истина);
		Если Ветвь = Неопределено Тогда
			Строка = Дерево.Строки.Добавить();

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

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

		КонецЕсли;

	КонецЦикла;

	ДобавитьПодчиненныеБизнесПроцессы(Дерево, ЗадачиПоПредмету);

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

&НаСервере


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

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

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();

	БизнесПроцессыИЗадачиСервер.УстановитьПараметрыСпискаМоихЗадач(Список);
	ПараметрыОтбора = Новый Соответствие();
	ПараметрыОтбора.Вставить("ПоказыватьВыполненные", ПоказыватьВыполненные);
	УстановитьОтбор(ПараметрыОтбора);

	ПараметрыОтбораФормы = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.Отбор);
    // TODO: допиши оставшуюся часть

[Assistant]
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

	УстановитьУсловноеОформление();

	БизнесПроцессыИЗадачиСервер.УстановитьПараметрыСпискаМоихЗадач(Список);
	ПараметрыОтбора = Новый Соответствие();
	ПараметрыОтбора.Вставить("ПоказыватьВыполненные", ПоказыватьВыполненные);
	УстановитьОтбор(ПараметрыОтбора);

	ПараметрыОтбораФормы = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.Отбор);
	Параметры.Отбор.Очистить();

	ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач");
	Элементы.СрокИсполнения.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D");
	Элементы.ДатаНачала.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D");
	Элементы.Дата.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D");

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

&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)

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

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

		ПараметрыОтбораФормы.Очистить();
	КонецЕсли;

	СгруппироватьПоКолонкеНаСервере(Настройки["РежимГруппировки"]);
	УстановитьОтбор(Настройки);

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура СгруппироватьПоВажности(Команда)
	СгруппироватьПоКолонке("Важность");
КонецПроцедуры

&НаКлиенте
Процедура СгруппироватьПоБезГруппировки(Команда)
	СгруппироватьПоКолонке("");
КонецПроцедуры

&НаКлиенте
Процедура СгруппироватьПоТочкеМаршрута(Команда)
	СгруппироватьПоКолонке("ТочкаМаршрута");
КонецПроцедуры

&НаКлиенте
Процедура СгруппироватьПоАвтору(Команда)
	СгруппироватьПоКолонке("Автор");
КонецПроцедуры

&НаКлиенте
Процедура СгруппироватьПоПредмету(Команда)
	СгруппироватьПоКолонке("ПредметСтрокой");
КонецПроцедуры

&НаКлиенте
Процедура СгруппироватьПоСроку(Команда)
	СгруппироватьПоКолонке("СрокДляГруппировки");
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьВыполненныеПриИзменении(Элемент)

	УстановитьОтборНаКлиенте();

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок

&НаКлиенте
Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	БизнесПроцессыИЗадачиКлиент.СписокЗадачПередНачаломДобавления(ЭтотОбъект, Элемент, Отказ, Копирование,
		Родитель, Группа);
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ПринятьКИсполнению(Команда)

	БизнесПроцессыИЗадачиКлиент.ПринятьЗадачиКИсполнению(Элементы.Список.ВыделенныеСтроки);
	ДоступностьПунктаПринятьКИсполнению(Ложь);

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

&НаКлиенте
Процедура ОтменитьПринятиеКИсполнению(Команда)

	БизнесПроцессыИЗадачиКлиент.ОтменитьПринятиеЗадачКИсполнению(Элементы.Список.ВыделенныеСтроки);
	ДоступностьПунктаПринятьКИсполнению(Истина);

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

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

	ОбновитьСписокЗадачНаСервере();

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

&НаКлиенте
Процедура ОткрытьБизнесПроцесс(Команда)
	БизнесПроцессыИЗадачиКлиент.ОткрытьБизнесПроцесс(Элементы.Список);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПредметЗадачи(Команда)
	БизнесПроцессыИЗадачиКлиент.ОткрытьПредметЗадачи(Элементы.Список);
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();
	БизнесПроцессыИЗадачиСервер.УстановитьОформлениеЗадач(Список);

	Элемент = Список.УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДатаНачала.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", "");

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

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

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

&НаКлиенте
Процедура УстановитьОтборНаКлиенте()

	ПараметрыОтбора = Новый Соответствие();
	ПараметрыОтбора.Вставить("ПоказыватьВыполненные", ПоказыватьВыполненные);
	УстановитьОтбор(ПараметрыОтбора);

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

&НаСервере
Процедура УстановитьОтбор(ПараметрыОтбора)

	Если ПараметрыОтбора["ПоказыватьВыполненные"] Тогда
		СгруппироватьПоКолонкеНаСервере("");
	КонецЕсли;

	ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
		Список, "Выполнена", Ложь, , , Не ПараметрыОтбора["ПоказыватьВыполненные"]);

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

&НаСервере
Процедура ОбновитьСписокЗадачНаСервере()

	БизнесПроцессыИЗадачиСервер.УстановитьПараметрыСпискаМоихЗадач(Список);
	Элементы.Список.Обновить();
	// Цвет просроченных задач зависит от значения текущей даты,
	// поэтому нужно переинициализировать условное оформление.
	УстановитьУсловноеОформление();

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

&НаКлиенте
Процедура ДоступностьПунктаПринятьКИсполнению(ЗначениеФлага)

	Элементы.ПринятьКИсполнению.Доступность                      = ЗначениеФлага;
	Элементы.СписокКонтекстноеМенюПринятьКИсполнению.Доступность = ЗначениеФлага;
	Элементы.СписокКонтекстноеМенюОтменитьПринятиеКИсполнению.Доступность = Не ЗначениеФлага;

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

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


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

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

Функция ИмяФункции(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	СообщениеОбмена = "";

	ОбменДаннымиСервер.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезСтроку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, СообщениеОбмена);

	ХранилищеСообщенияОбмена = Новый ХранилищеЗначения(СообщениеОбмена, Новый СжатиеДанных(9));

	Возврат "";

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

// Соответствует операции Download.

Функция ВыполнитьЗагрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	ОбменДаннымиСервер.ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена.Получить());

	Возврат "";

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

// Соответствует операции UploadData.

Функция ВыполнитьВыгрузкуДанных(ИмяПланаОбмена,
								КодУзлаИнформационнойБазы,
								ИдентификаторФайлаСтрокой,
								ДлительнаяОперация,
								ИдентификаторОперации,
								ДлительнаяОперацияРазрешена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор;
	ИдентификаторФайлаСтрокой = Строка(ИдентификаторФайла);
	ВыполнитьВыгрузкуДанныхВКлиентСерверномРежиме(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторФайла, ДлительнаяОперация, ИдентификаторОперации, ДлительнаяОперацияРазрешена);

	Возврат "";

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

// Соответствует операции DownloadData.

Функция ВыполнитьЗагрузкуДанных(ИмяПланаОбмена,
								КодУзлаИнформационнойБазы,
								ИдентификаторФайлаСтрокой,
								ДлительнаяОперация,
								ИдентификаторОперации,
								ДлительнаяОперацияРазрешена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор(ИдентификаторФайлаСтрокой);
	ВыполнитьЗагрузкуДанныхВКлиентСерверномРежиме(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторФайла, ДлительнаяОперация, ИдентификаторОперации, ДлительнаяОперацияРазрешена);

	Возврат "";

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

// Соответствует операции GetIBParameters.

Функция ПолучитьПараметрыИнформационнойБазы(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке)

	Результат = ОбменДаннымиСервер.ПараметрыИнформационнойБазы(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке);
	Возврат СериализаторXDTO.ЗаписатьXDTO(Результат);

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

// Соответствует операции GetIBData.

Функция ПолучитьДанныеИнформационнойБазы(ПолноеИмяТаблицы)

	Возврат СериализаторXDTO.ЗаписатьXDTO(ОбменДаннымиСервер.ДанныеКорреспондента(ПолноеИмяТаблицы));

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

// Соответствует операции GetCommonNodsData.

Функция ПолучитьОбщиеДанныеУзлов(ИмяПланаОбмена)

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

	Возврат СериализаторXDTO.ЗаписатьXDTO(ОбменДаннымиСервер.ДанныеДляТабличныхЧастейУзловЭтойИнформационнойБазы(ИмяПланаОбмена));

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

// Соответствует операции CreateExchange.

Функция СоздатьОбменДанными(ИмяПланаОбмена, СтрокаПараметров, НастройкаОтборовXDTO, ЗначенияПоУмолчаниюXDTO)

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	// Получаем обработку помощника настройки обмена во второй базе.
	ПомощникСозданияОбменаДанными = ОбменДаннымиСервер.МодульПомощникСозданияОбменаДанными().Создать();
	ПомощникСозданияОбменаДанными.ИмяПланаОбмена = ИмяПланаОбмена;

	Отказ = Ложь;

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

	Если Отказ Тогда
		Сообщение = НСтр("ru = 'При создании настройки обмена во второй информационной базе возникли ошибки: %1'");
		Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПомощникСозданияОбменаДанными.СтрокаСообщенияОбОшибке());

		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , Сообщение);

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

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

	// Выполняем создание настройки обмена.
	ПомощникСозданияОбменаДанными.ВебСервисВыполнитьДействияПоНастройкеНовогоОбменаДанными(
											Отказ,
											СериализаторXDTO.ПрочитатьXDTO(НастройкаОтборовXDTO),
											СериализаторXDTO.ПрочитатьXDTO(ЗначенияПоУмолчаниюXDTO));

	Если Отказ Тогда
		Сообщение = НСтр("ru = 'При создании настройки обмена во второй информационной базе возникли ошибки: %1'");
		Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, ПомощникСозданияОбменаДанными.СтрокаСообщенияОбОшибке());

		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , Сообщение);

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

	Возврат "";

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

// Соответствует операции UpdateExchange.

Функция ОбновитьНастройкиОбменаДанными(ИмяПланаОбмена, КодУзла, ЗначенияПоУмолчаниюXDTO)

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

	Возврат "";

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

// Соответствует операции RegisterOnlyCatalogData.

Функция ЗарегистрироватьИзмененияТолькоСправочников(ИмяПланаОбмена, КодУзла, ДлительнаяОперация, ИдентификаторОперации)

	ЗарегистрироватьДанныеДляНачальнойВыгрузки(ИмяПланаОбмена, КодУзла, ДлительнаяОперация, ИдентификаторОперации, Истина);

	Возврат "";

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

// Соответствует операции RegisterAllDataExceptCatalogs.

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

	ЗарегистрироватьДанныеДляНачальнойВыгрузки(ИмяПланаОбмена, КодУзла, ДлительнаяОперация, ИдентификаторОперации, Ложь);

	Возврат "";

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

// Соответствует операции GetContinuousOperationStatus.

Функция ПолучитьСостояниеДлительнойОперации(ИдентификаторОперации, СтрокаСообщенияОбОшибке)

	СостоянияФоновогоЗадания = Новый Соответствие;
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Активно,           "Active");
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Завершено,         "Completed");
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.ЗавершеноАварийно, "Failed");
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Отменено,          "Canceled");

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

	ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ИдентификаторОперации));

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

	Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда

		СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке);

	КонецЕсли;

	Возврат СостоянияФоновогоЗадания.Получить(ФоновоеЗадание.Состояние);
КонецФункции

// Соответствует операции GetFunctionalOption.

Функция ПолучитьЗначениеФункциональнойОпции(Имя)

	Возврат ПолучитьФункциональнуюОпцию(Имя);

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

// Соответствует операции PrepareGetFile.

[Assistant] Функция ВыполнитьВыгрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена)


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

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

Функция ИмяФункции(FileId, BlockSize, TransferId, PartQuantity)

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

	TransferId = Новый УникальныйИдентификатор;

	ИмяИсходногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(FileId);

	ВременныйКаталог = ВременныйКаталогВыгрузки(TransferId);

	ИмяИсходногоФайлаВоВременномКаталоге = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, "data.zip");

	СоздатьКаталог(ВременныйКаталог);

	ПереместитьФайл(ИмяИсходногоФайла, ИмяИсходногоФайлаВоВременномКаталоге);

	Если BlockSize <> 0 Тогда
		// Разделение файла на части
		ИменаФайлов = РазделитьФайл(ИмяИсходногоФайлаВоВременномКаталоге, BlockSize * 1024);
		PartQuantity = ИменаФайлов.Количество();

		УдалитьФайлы(ИмяИсходногоФайлаВоВременномКаталоге);
	Иначе
		PartQuantity = 1;
		ПереместитьФайл(ИмяИсходногоФайлаВоВременномКаталоге, ИмяИсходногоФайлаВоВременномКаталоге + ".1");
	КонецЕсли;

	Возврат "";

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

// Соответствует операции GetFilePart.

Функция GetFilePart(TransferId, PartNumber, PartData)

	ИменаФайлов = НайтиФайлЧасти(ВременныйКаталогВыгрузки(TransferId), PartNumber);

	Если ИменаФайлов.Количество() = 0 Тогда

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

	ИначеЕсли ИменаФайлов.Количество() > 1 Тогда

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

	КонецЕсли;

	ИмяФайлаЧасти = ИменаФайлов[0].ПолноеИмя;
	PartData = Новый ДвоичныеДанные(ИмяФайлаЧасти);

	Возврат "";

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

// Соответствует операции ReleaseFile.

Функция ReleaseFile(TransferId)

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

	Возврат "";

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

// Соответствует операции PutFilePart.
//
// Параметры:
//   TransferId - УникальныйИдентификатор - уникальный идентификатор сессии передачи данных.
//   PartNumber - Число - номер части файла.
//   PartData - ДвоичныеДанные - данные части файла.
//

Функция PutFilePart(TransferId, PartNumber, PartData)

	ВременныйКаталог = ВременныйКаталогВыгрузки(TransferId);

	Если PartNumber = 1 Тогда

		СоздатьКаталог(ВременныйКаталог);

	КонецЕсли;

	ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, ПолучитьИмяФайлаЧасти(PartNumber));

	PartData.Записать(ИмяФайла);

	Возврат "";

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

// Соответствует операции SaveFileFromParts.

Функция SaveFileFromParts(TransferId, PartQuantity, FileId)

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

	ВременныйКаталог = ВременныйКаталогВыгрузки(TransferId);

	ФайлыЧастейДляОбъединения = Новый Массив;

	Для НомерЧасти = 1 По PartQuantity Цикл

		ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, ПолучитьИмяФайлаЧасти(НомерЧасти));

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

		ФайлыЧастейДляОбъединения.Добавить(ИмяФайла);

	КонецЦикла;

	ИмяАрхива = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, "data.zip");

	ОбъединитьФайлы(ФайлыЧастейДляОбъединения, ИмяАрхива);

	Разархиватор = Новый ЧтениеZipФайла(ИмяАрхива);

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

	КаталогВыгрузки = ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов();

	ЭлементАрхива = Разархиватор.Элементы.Получить(0);
	ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогВыгрузки, ЭлементАрхива.Имя);

	Разархиватор.Извлечь(ЭлементАрхива, КаталогВыгрузки);
	Разархиватор.Закрыть();

	FileId = ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяФайла);

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

	Возврат "";

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

// Соответствует операции PutFileIntoStorage.

Функция PutFileIntoStorage(FileName, FileId)

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

	FileId = ОбменДаннымиСервер.ПоместитьФайлВХранилище(FileName);

	Возврат "";

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

// Соответствует операции GetFileFromStorage.

Функция GetFileFromStorage(FileId)

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

	ИмяИсходногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(FileId);
	ИмяКонечногоФайла = "";

	Если СтрЗаканчиваетсяНа(ИмяИсходногоФайла, ".zip") Тогда
		ЧтениеZip = Новый ЧтениеZipФайла(ИмяИсходногоФайла);
		ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов());

		ИмяКонечногоФайла = ЧтениеZip.Элементы[0].ПолноеИмя;

		ЧтениеZip.Закрыть();

		УдалитьФайлы(ИмяИсходногоФайла);
	КонецЕсли;

	Файл = Новый Файл(ИмяКонечногоФайла);

	Возврат Файл.Имя;
КонецФункции

// Соответствует операции FileExists.

Функция FileExists(FileName)

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

	ПолноеИмяВременногоФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(), FileName);

	Файл = Новый Файл(ПолноеИмяВременногоФайла);

	Возврат Файл.Существует();
КонецФункции

// Соответствует операции Ping.

Функция Ping()
	// Проверка связи.
	Возврат "";
КонецФункции

// Соответствует операции TestConnection.

[Assistant] Функция PrepareGetFile(FileId, BlockSize, TransferId, PartQuantity)


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

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

Функция ИмяФункции(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	СообщениеОбмена = "";

	ОбменДаннымиСервер.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезСтроку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, СообщениеОбмена);

	ХранилищеСообщенияОбмена = Новый ХранилищеЗначения(СообщениеОбмена, Новый СжатиеДанных(9));

	Возврат "";

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

// Соответствует операции Download.

Функция ВыполнитьЗагрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	ОбменДаннымиСервер.ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена.Получить());

	Возврат "";

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

// Соответствует операции UploadData.

Функция ВыполнитьВыгрузкуДанных(ИмяПланаОбмена,
								КодУзлаИнформационнойБазы,
								ИдентификаторФайлаСтрокой,
								ДлительнаяОперация,
								ИдентификаторОперации,
								ДлительнаяОперацияРазрешена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор;
	ИдентификаторФайлаСтрокой = Строка(ИдентификаторФайла);
	ВыполнитьВыгрузкуДанныхВКлиентСерверномРежиме(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторФайла, ДлительнаяОперация, ИдентификаторОперации, ДлительнаяОперацияРазрешена);

	Возврат "";

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

// Соответствует операции DownloadData.

Функция ВыполнитьЗагрузкуДанных(ИмяПланаОбмена,
								КодУзлаИнформационнойБазы,
								ИдентификаторФайлаСтрокой,
								ДлительнаяОперация,
								ИдентификаторОперации,
								ДлительнаяОперацияРазрешена)

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор(ИдентификаторФайлаСтрокой);
	ВыполнитьЗагрузкуДанныхВКлиентСерверномРежиме(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторФайла, ДлительнаяОперация, ИдентификаторОперации, ДлительнаяОперацияРазрешена);

	Возврат "";

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

// Соответствует операции GetIBParameters.

Функция ПолучитьПараметрыИнформационнойБазы(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке)

	Результат = ОбменДаннымиСервер.ПараметрыИнформационнойБазы(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке);
	Возврат СериализаторXDTO.ЗаписатьXDTO(Результат);

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

// Соответствует операции CreateExchangeNode.

Функция СоздатьУзелОбменаДанными(ПараметрыXDTO)

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными(Истина);

	Параметры = СериализаторXDTO.ПрочитатьXDTO(ПараметрыXDTO);

	НастройкиПодключения = Параметры.НастройкиПодключения;

	МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникСозданияОбменаДанными();
	Попытка
		МодульПомощникНастройки.ЗаполнитьНастройкиПодключенияИзXML(
			НастройкиПодключения, Параметры.СтрокаПараметровXML, , Истина);

		НастройкиПодключения.Вставить("ВидТранспортаСообщенийОбмена", Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим);

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

		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);

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

	Возврат "";

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

// Соответствует операции RemoveExchangeNode.

Функция УдалитьУзелОбменаДанными(ИмяПланаОбмена, ИдентификаторУзла)

	УзелОбмена = ОбменДаннымиСервер.УзелПланаОбменаПоКоду(ИмяПланаОбмена, ИдентификаторУзла);

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

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

	ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелОбмена);

	Возврат "";

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

// Соответствует операции GetContinuousOperationStatus.

Функция ПолучитьСостояниеДлительнойОперации(ИдентификаторОперации, СтрокаСообщенияОбОшибке)

	СостоянияФоновогоЗадания = Новый Соответствие;
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Активно,           "Active");
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Завершено,         "Completed");
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.ЗавершеноАварийно, "Failed");
	СостоянияФоновогоЗадания.Вставить(СостояниеФоновогоЗадания.Отменено,          "Canceled");

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

	ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ИдентификаторОперации));

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

	Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда

		СтрокаСообщенияОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке);

	КонецЕсли;

	Возврат СостоянияФоновогоЗадания.Получить(ФоновоеЗадание.Состояние);
КонецФункции

// Соответствует операции PrepareGetFile.

Функция PrepareGetFile(FileId, BlockSize, TransferId, PartQuantity)

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

	TransferId = Новый УникальныйИдентификатор;

	ИмяИсходногоФайла = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(FileId);

	ВременныйКаталог = ВременныйКаталогВыгрузки(TransferId);

	ИмяИсходногоФайлаВоВременномКаталоге = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, "data.zip");

	СоздатьКаталог(ВременныйКаталог);

	ПереместитьФайл(ИмяИсходногоФайла, ИмяИсходногоФайлаВоВременномКаталоге);

	Если BlockSize <> 0 Тогда
		// Разделение файла на части
		ИменаФайлов = РазделитьФайл(ИмяИсходногоФайлаВоВременномКаталоге, BlockSize * 1024);
		PartQuantity = ИменаФайлов.Количество();

		УдалитьФайлы(ИмяИсходногоФайлаВоВременномКаталоге);
	Иначе
		PartQuantity = 1;
		ПереместитьФайл(ИмяИсходногоФайлаВоВременномКаталоге, ИмяИсходногоФайлаВоВременномКаталоге + ".1");
	КонецЕсли;

	Возврат "";

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

// Соответствует операции GetFilePart.

Функция GetFilePart(TransferId, PartNumber, PartData)

	ИменаФайлов = НайтиФайлЧасти(ВременныйКаталогВыгрузки(TransferId), PartNumber);

	Если ИменаФайлов.Количество() = 0 Тогда

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

	ИначеЕсли ИменаФайлов.Количество() > 1 Тогда

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

	КонецЕсли;

	ИмяФайлаЧасти = ИменаФайлов[0].ПолноеИмя;
	PartData = Новый ДвоичныеДанные(ИмяФайлаЧасти);

	Возврат "";

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

// Соответствует операции ReleaseFile.

[Assistant] Функция ВыполнитьВыгрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена)


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

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

Функция ВыполнитьВыгрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена, ОбластьДанных)
ВойтиВОбластьДанных(ОбластьДанных);

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	СообщениеОбмена = "";
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ВыполнитьВыгрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена, ОбластьДанных)

	ВойтиВОбластьДанных(ОбластьДанных);

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	СообщениеОбмена = "";

	ОбменДаннымиСервер.ВыполнитьВыгрузкуДляУзлаИнформационнойБазыЧерезСтроку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, СообщениеОбмена);

	ХранилищеСообщенияОбмена = Новый ХранилищеЗначения(СообщениеОбмена, Новый СжатиеДанных(9));

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат "";

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

// Соответствует операции UploadData.

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

	ВойтиВОбластьДанных(ОбластьДанных);

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор;
	ИдентификаторФайлаСтрокой = Строка(ИдентификаторФайла);

	ВыполнитьВыгрузкуДанныхВКлиентСерверномРежиме(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторФайла, ДлительнаяОперация, ИдентификаторОперации, ДлительнаяОперацияРазрешена);

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат "";

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

// Соответствует операции UploadDataInt.

Функция ВыполнитьВыгрузкуДанныхВнутренняяПубликация(ИмяПланаОбмена,
													КодУзлаИнформационнойБазы,
													ИдентификаторЗадачи,
													ОбластьДанных)

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

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	Возврат "";

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

// Соответствует операции Download.

Функция ВыполнитьЗагрузку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена, ОбластьДанных)

	ВойтиВОбластьДанных(ОбластьДанных);

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

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

	ОбменДаннымиСервер.ВыполнитьЗагрузкуДляУзлаИнформационнойБазыЧерезСтроку(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ХранилищеСообщенияОбмена.Получить());

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат "";

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

// Соответствует операции DownloadData.

Функция ВыполнитьЗагрузкуДанных(ИмяПланаОбмена,
								КодУзлаИнформационнойБазы,
								ИдентификаторФайлаСтрокой,
								ДлительнаяОперация,
								ИдентификаторОперации,
								ДлительнаяОперацияРазрешена,
								ОбластьДанных)

	ВойтиВОбластьДанных(ОбластьДанных);

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор(ИдентификаторФайлаСтрокой);

	ВыполнитьЗагрузкуДанныхВКлиентСерверномРежиме(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторФайла, ДлительнаяОперация, ИдентификаторОперации, ДлительнаяОперацияРазрешена);

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат "";

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

// Соответствует операции DownloadDataInt.

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

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

	ПроверитьБлокировкуИнформационнойБазыДляОбновления();

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными();

	ИдентификаторФайла = Новый УникальныйИдентификатор(ИдентификаторФайлаСтрокой);

	ВыполнитьЗагрузкуДанныхВКлиентСерверномРежимеВнутренняяПубликация(
		ИмяПланаОбмена,	КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ИдентификаторФайла, ОбластьДанных);

	Возврат "";

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

// Соответствует операции GetIBParameters.

Функция ПолучитьПараметрыИнформационнойБазы(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке, ОбластьДанных)

	ВойтиВОбластьДанных(ОбластьДанных);

	Результат = ОбменДаннымиСервер.ПараметрыИнформационнойБазы(ИмяПланаОбмена, КодУзла, СообщениеОбОшибке);

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат СериализаторXDTO.ЗаписатьXDTO(Результат);

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

// Соответствует операции CreateExchangeNode.

Функция СоздатьУзелОбменаДанными(ПараметрыXDTO, ОбластьДанных)

	ВойтиВОбластьДанных(ОбластьДанных);

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

	ОбменДаннымиСервер.ПроверитьИспользованиеОбменаДанными(Истина);

	Параметры = СериализаторXDTO.ПрочитатьXDTO(ПараметрыXDTO);

	НастройкиПодключения = Параметры.НастройкиПодключения;

	МодульПомощникНастройки = ОбменДаннымиСервер.МодульПомощникСозданияОбменаДанными();
	Попытка
		МодульПомощникНастройки.ЗаполнитьНастройкиПодключенияИзXML(
			НастройкиПодключения, Параметры.СтрокаПараметровXML, , Истина);

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

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

		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);

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

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат "";

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

// Соответствует операции RemoveExchangeNode.

Функция УдалитьУзелОбменаДанными(ИмяПланаОбмена, ИдентификаторУзла, ОбластьДанных)

	ВойтиВОбластьДанных(ОбластьДанных);

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

	УзелОбмена = ОбменДаннымиСервер.УзелПланаОбменаПоКоду(ИмяПланаОбмена, ИдентификаторУзла);

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

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

	ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелОбмена);

	ВыйтиИзОбластиДанных(ОбластьДанных);

	Возврат "";

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

// Соответствует операции GetContinuousOperationStatus.


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

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

Функция GetVersions(InterfaceName)
МассивВерсий = Неопределено;

	СтруктураПоддерживаемыхВерсий = Новый Структура;

	ИнтеграцияПодсистемБСП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий);
	ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий);

	СтруктураПоддерживаемыхВерсий.Свойство(InterfaceName, МассивВерсий);
    // TODO: допиши оставшуюся часть

[Assistant]
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

// Возвращает массив поддерживаемых подсистемой InterfaceName названий номеров версий.
//
// Параметры:
//   InterfaceName - Строка - имя подсистемы.
//
// Возвращаемое значение:
//   Массив из Строка
//
// Пример использования:
//
// 	// Возвращает объект WSПрокси передачи файлов заданной версии.
// 	// Если ВерсияПередачи = Неопределено, возвращает Прокси базовой версии "1.0.1.1".
//  //
//	Функция ПолучитьПроксиПередачиФайлов(Знач ПараметрыПодключения, Знач ВерсияПередачи = Неопределено)
//		// …………………………………………………
//	КонецФункции
//
//	Функция ПолучитьИзХранилища(Знач ИдентификаторФайла, Знач ПараметрыПодключения) Экспорт
//
//		// Общая для всех версий функциональность.
//		// …………………………………………………
//
//		// Учесть версионирование.
//		ВерсииСервиса = ОбщегоНазначения.ПолучитьВерсииИнтерфейса("СервисПередачиФайлов");
//		Если ВерсииСервиса.Найти("1.0.2.1") = Неопределено Тогда
//			ЕстьПоддержка2йВерсии = Ложь;
//			Прокси = ПолучитьПроксиПередачиФайлов(ПараметрыПодключения);
//		Иначе
//			ЕстьПоддержка2йВерсии = Истина;
//			Прокси = ПолучитьПроксиПередачиФайлов(ПараметрыПодключения, "1.0.2.1");
//		КонецЕсли;
//
//		КоличествоЧастей = Неопределено;
//		РазмерЧасти = 20 * 1024; // Кб
//		Если ЕстьПоддержка2йВерсии Тогда
//	   		ИдентификаторПередачи = Прокси.PrepareGetFile(ИдентификаторФайла, РазмерЧасти, КоличествоЧастей);
//		Иначе
//			ИдентификаторПередачи = Неопределено;
//			Прокси.PrepareGetFile(ИдентификаторФайла, РазмерЧасти, ИдентификаторПередачи, КоличествоЧастей);
//		КонецЕсли;
//
//		// Общая для всех версий функциональность.
//		// …………………………………………………
//
//	КонецФункции
//
Функция GetVersions(InterfaceName)

	МассивВерсий = Неопределено;

	СтруктураПоддерживаемыхВерсий = Новый Структура;

	ИнтеграцияПодсистемБСП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий);
	ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий);

	СтруктураПоддерживаемыхВерсий.Свойство(InterfaceName, МассивВерсий);

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

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

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