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

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

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

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

	СвойстваКомандыФормы = Новый Структура;
	СвойстваКомандыФормы.Вставить("Отображение", ОтображениеКнопки.Текст);
	СвойстваКомандыФормы.Вставить("Действие", "Подключаемый_КомандаПанелиПрисоединенныхФайлов");

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

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

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

			ЭлементРодитель   = ЭлементРазмещения;
			ЭлементРазмещения = Неопределено;
		КонецЕсли;

	КонецЕсли;

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

	ПодменюДобавления = Неопределено;
	Если ДобавляемыйЭлемент.ДобавлятьФайлы
		И ДоступноДобавление Тогда

		ПодменюДобавления = Форма.Элементы.Добавить("ПодменюДобавленияФайла" + НомерЭлемента, Тип("ГруппаФормы"),
			ГруппаРазмещенияНаФорме);

		ПодменюДобавления.Вид         = ВидГруппыФормы.Подменю;
		ПодменюДобавления.Картинка    = БиблиотекаКартинок.Скрепка;
		ПодменюДобавления.Заголовок   = НСтр("ru = 'Присоединить файлы'");
		ПодменюДобавления.Подсказка   = НСтр("ru = 'Присоединить файлы'");
		ПодменюДобавления.Отображение = ОтображениеКнопки.Картинка;

		ЗагрузитьФайл           = Форма.Команды.Добавить(ПрефиксКоманды + ИмяКомандыЗагрузитьФайл + "_" + НомерЭлемента);
		ЗагрузитьФайл.Действие  = "Подключаемый_КомандаПанелиПрисоединенныхФайлов";
		ЗаголовокКоманды = НСтр("ru = 'Загрузить файл с компьютера'");
		ЗагрузитьФайл.Подсказка = ЗаголовокКоманды;
		ЗагрузитьФайл.Заголовок = ЗаголовокКоманды + "...";

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

		Если ЗначениеЗаполнено(ДобавляемыйЭлемент.ОтображениеФигуры) Тогда
			КнопкаЗагрузки.ОтображениеФигуры = ОтображениеФигурыКнопки[ДобавляемыйЭлемент.ОтображениеФигуры];
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура СоздатьГиперссылкуФайлов(Форма, ДобавляемыйЭлемент, ВладелецПрисоединенныхФайлов, ПараметрыГиперссылки)

	ИмяГруппы          = ПараметрыГиперссылки.ИмяГруппы;
	НомерЭлемента      = ПараметрыГиперссылки.НомерЭлемента;
	ДоступноДобавление = ПараметрыГиперссылки.ДоступноДобавление;

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

	СвойстваКомандыФормы = Новый Структура;
	СвойстваКомандыФормы.Вставить("Отображение", ОтображениеКнопки.Текст);
	СвойстваКомандыФормы.Вставить("Действие", "Подключаемый_КомандаПанелиПрисоединенныхФайлов");

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

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

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

			ЭлементРодитель   = ЭлементРазмещения;
			ЭлементРазмещения = Неопределено;
		КонецЕсли;

	КонецЕсли;

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

	ПодменюДобавления = Неопределено;
	Если ДобавляемыйЭлемент.ДобавлятьФайлы
		И ДоступноДобавление Тогда

		ПодменюДобавления = Форма.Элементы.Добавить("ПодменюДобавленияФайла" + НомерЭлемента, Тип("ГруппаФормы"),
			ГруппаРазмещенияНаФорме);

		ПодменюДобавления.Вид         = ВидГруппыФормы.Подменю;
		ПодменюДобавления.Картинка    = БиблиотекаКартинок.Скрепка;
		ПодменюДобавления.Заголовок   = НСтр("ru = 'Присоединить файлы'");
		ПодменюДобавления.Подсказка   = НСтр("ru = 'Присоединить файлы'");
		ПодменюДобавления.Отображение = ОтображениеКнопки.Картинка;

		ЗагрузитьФайл           = Форма.Команды.Добавить(ПрефиксКоманды + ИмяКомандыЗагрузитьФайл + "_" + НомерЭлемента);
		ЗагрузитьФайл.Действие  = "Подключаемый_КомандаПанелиПрисоединенныхФайлов";
		ЗаголовокКоманды = НСтр("ru = 'Загрузить файл с компьютера'");
		ЗагрузитьФайл.Подсказка = ЗаголовокКоманды;
		ЗагрузитьФайл.Заголовок = ЗаголовокКоманды + "...";

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

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

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

		СоздатьПоШаблону = Форма.Команды.Добавить(ПрефиксКоманды + ИмяКомандыСоздатьПоШаблону + "_" + НомерЭлемента);
		СоздатьПоШаблону.Заголовок = НСтр("ru = 'Создать по шаблону...'");
		ЗаполнитьЗначенияСвойств(СоздатьПоШаблону, СвойстваКомандыФормы);

		ДобавитьКнопкуНаФорму(Форма, ИмяКомандыСоздатьПоШаблону + НомерЭлемента, ПодменюДобавления, СоздатьПоШаблону.Имя);

		Сканировать = Форма.Команды.Добавить(ПрефиксКоманды + ИмяКомандыСканировать + "_" + НомерЭлемента);
		Сканировать.Заголовок = НСтр("ru = 'Сканировать...'");
		ЗаполнитьЗначенияСвойств(Сканировать, СвойстваКомандыФормы);

		ДобавитьКнопкуНаФорму(Форма, ИмяКомандыСканировать + НомерЭлемента, ПодменюДобавления, Сканировать.Имя);

	КонецЕсли;

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

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

		ГиперссылкаПерехода.ИмяКоманды = КомандаОткрытияСписка.Имя;
	КонецЕсли;

	ГиперссылкаПерехода.Вид = ?(ЭтоГруппаКнопок, ВидКнопкиФормы.ГиперссылкаКоманднойПанели, ВидКнопкиФормы.Гиперссылка);
	ГиперссылкаПерехода.Заголовок = ДобавляемыйЭлемент.Заголовок;
	Если ДобавляемыйЭлемент.ОтображатьКоличество Тогда

		КоличествоПрисоединенныхФайлов = РаботаСФайламиСлужебныйВызовСервера.КоличествоПрисоединенныхФайлов(ВладелецПрисоединенныхФайлов);
		Если КоличествоПрисоединенныхФайлов > 0 Тогда
			ГиперссылкаПерехода.Заголовок = ГиперссылкаПерехода.Заголовок + " ("
				+ Формат(КоличествоПрисоединенныхФайлов, "ЧГ=") + ")";
		КонецЕсли;

	КонецЕсли;

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


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

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

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

[Assistant]
Функция НайтиСтрокуПоURI(ИскомоеURI, ТаблицаСURI, КолонкаURI, ИгнорироватьРасширениеЗашифрованного = Ложь)

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

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

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

// Вычисляется уровень строки файлов, рекурсивным алгоритмом.

Функция РекурсивноУровень(СтрокаФайлов,ТаблицаФайлов)

	// Равен уровню в базе или на сервере, в зависимости от того, где он меньше.
	НайденыСтрокиФайлов = ТаблицаФайлов.НайтиСтроки(Новый Структура("ФайлСсылка", СтрокаФайлов.Родитель));
	КоличествоПрибавления = ?(НайденыСтрокиФайлов.Количество() = 0, 0, 1);
	Для каждого НайденнаяСтрокаФайлов Из НайденыСтрокиФайлов Цикл
		КоличествоПрибавления = КоличествоПрибавления + РекурсивноУровень(НайденнаяСтрокаФайлов,ТаблицаФайлов);
	КонецЦикла;

	Возврат КоличествоПрибавления;

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

// Вычисляется уровень файла на сервере webdav, рекурсивным алгоритмом.

Функция РекурсивноУровеньНаСервере(СтрокаФайлов,ТаблицаФайлов)

	НайденыСтрокиФайлов = ТаблицаФайлов.НайтиСтроки(Новый Структура("ФайлСсылка", СтрокаФайлов.РодительСервер));
	КоличествоПрибавления = ?(НайденыСтрокиФайлов.Количество() = 0, 0, 1);
	Для каждого НайденнаяСтрокаФайлов Из НайденыСтрокиФайлов Цикл
		КоличествоПрибавления = КоличествоПрибавления + РекурсивноУровеньНаСервере(НайденнаяСтрокаФайлов, ТаблицаФайлов);
	КонецЦикла;

	Возврат КоличествоПрибавления;

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

// Вычисляет уровни всех строк таблицы файлов.

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

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

		// Равен уровню в базе или на сервере, в зависимости от того, где он меньше.
		УровеньВБазе    = РекурсивноУровень(СтрокаФайлов, ТаблицаФайлов);
		УровеньНаСервере = РекурсивноУровеньНаСервере(СтрокаФайлов, ТаблицаФайлов);
		Если УровеньНаСервере = 0 Тогда
			СтрокаФайлов.Уровень            = УровеньВБазе;
			СтрокаФайлов.РодительСортировка = СтрокаФайлов.Родитель;
		Иначе
			Если УровеньВБазе <= УровеньНаСервере Тогда
				СтрокаФайлов.Уровень            = УровеньВБазе;
				СтрокаФайлов.РодительСортировка = СтрокаФайлов.Родитель;
			Иначе
				СтрокаФайлов.Уровень            = УровеньНаСервере;
				СтрокаФайлов.РодительСортировка = СтрокаФайлов.РодительСервер;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

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

// Рекурсивно загружает перечень файлов с сервера в таблицу файлов.


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

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

Функция СоздатьФайл(Знач Владелец, Знач СведенияОФайле)
МенеджерСправочникаФайлов = Справочники[СведенияОФайле.ИмяСправочникаХранилищаФайлов]; // СправочникМенеджер

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

	ИспользованиеПолнотекстовогоПоиска = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать;
	Если Метаданные.Справочники[СведенияОФайле.ИмяСправочникаХранилищаФайлов].ПолнотекстовыйПоиск
		= ИспользованиеПолнотекстовогоПоиска Тогда

		Если ТипЗнч(СведенияОФайле.АдресВременногоХранилищаТекста) = Тип("ХранилищеЗначения") Тогда
			// При создании Файла из шаблона хранилище значения копируется напрямую.
    // TODO: допиши оставшуюся часть

[Assistant]
Функция СоздатьФайл(Знач Владелец, Знач СведенияОФайле)

	МенеджерСправочникаФайлов = Справочники[СведенияОФайле.ИмяСправочникаХранилищаФайлов]; // СправочникМенеджер

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

	ИспользованиеПолнотекстовогоПоиска = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать;
	Если Метаданные.Справочники[СведенияОФайле.ИмяСправочникаХранилищаФайлов].ПолнотекстовыйПоиск
		= ИспользованиеПолнотекстовогоПоиска Тогда

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

	Иначе
		Файл.ТекстХранилище = Новый ХранилищеЗначения("");
		Файл.СтатусИзвлеченияТекста = Перечисления.СтатусыИзвлеченияТекстаФайлов.НеИзвлечен;
	КонецЕсли;

	Файл.Заполнить(Неопределено);
	Файл.Записать();
	Возврат Файл.Ссылка;

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

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


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

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

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

	ВладелецФайла = ДополнительныеПараметры.ВладелецФайла;
	ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы;

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

	Если РасширениеРаботыСФайламиПодключено Тогда

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

		ВыбранныеФайлы = Новый Массив;

		Если Не ДополнительныеПараметры.Свойство("ПолноеИмяФайла") Тогда
			ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
			ВыборФайла.МножественныйВыбор = Истина;
			ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
			ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*");
			Если ВыборФайла.Выбрать() Тогда
				ВыбранныеФайлы = ВыборФайла.ВыбранныеФайлы;
			КонецЕсли;
		Иначе
			ВыбранныеФайлы.Добавить(ДополнительныеПараметры.ПолноеИмяФайла);
		КонецЕсли;

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

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

			Если ПрисоединенныеФайлыМассив.Количество() = 1 И ОткрыватьКарточкуПослеСозданияИзФайла Тогда
				ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0];
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ДобавитьФайлыРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт

	ВладелецФайла = ДополнительныеПараметры.ВладелецФайла;
	ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы;

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

	Если РасширениеРаботыСФайламиПодключено Тогда

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

		ВыбранныеФайлы = Новый Массив;

		Если Не ДополнительныеПараметры.Свойство("ПолноеИмяФайла") Тогда
			ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
			ВыборФайла.МножественныйВыбор = Истина;
			ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
			ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*");
			Если ВыборФайла.Выбрать() Тогда
				ВыбранныеФайлы = ВыборФайла.ВыбранныеФайлы;
			КонецЕсли;
		Иначе
			ВыбранныеФайлы.Добавить(ДополнительныеПараметры.ПолноеИмяФайла);
		КонецЕсли;

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

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

			Если ПрисоединенныеФайлыМассив.Количество() = 1 И ОткрыватьКарточкуПослеСозданияИзФайла Тогда
				ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0];

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

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

			Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда
				ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]);
				ОповеститьОбИзменении(ВладелецФайла);
				ПараметрыОповещения = ПараметрыОповещенияЗаписиФайла();
				ПараметрыОповещения.Владелец = ВладелецФайла;
				ПараметрыОповещения.ВладелецФайла = ПараметрыОповещения.Владелец;
				ПараметрыОповещения.Файл = ПрисоединенныеФайлыМассив[0];
				ПараметрыОповещения.ЭтоНовый = Истина;
				Оповестить("Запись_Файл", ПараметрыОповещения, ПрисоединенныеФайлыМассив);
			КонецЕсли;

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

		КонецЕсли;

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

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

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

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

// Сохраняет путь к рабочему каталогу пользователя в настройках.
//
// Параметры:
//  ИмяКаталога - Строка - имя каталога.
//

Процедура УстановитьРабочийКаталогПользователя(ИмяКаталога) Экспорт

	РаботаСФайламиСлужебныйВызовСервера.УстановитьРабочийКаталогПользователя(ИмяКаталога);

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

// Возвращает каталог "Мои Документы" + имя текущего пользователя или
// ранее использованную папку для выгрузки.
//

Функция КаталогВыгрузки() Экспорт

	Путь = "";

#Если Не ВебКлиент И НЕ МобильныйКлиент Тогда

	Путь = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки");

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

#КонецЕсли

	Возврат Путь;

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

// Показывает пользователю диалог выбора файлов и возвращает
// массив - выбранные файлы для импорта.
//

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

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

	МассивИменФайлов = Новый Массив;

	Если ДиалогОткрытияФайла.Выбрать() Тогда
		МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;

		Для Каждого ИмяФайла Из МассивФайлов Цикл
			МассивИменФайлов.Добавить(ИмяФайла);
		КонецЦикла;

	КонецЕсли;

	Возврат МассивИменФайлов;

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

// Проверяет имя файла на наличие некорректных символов.
//
// Параметры:
//  ИмяФайла - Строка- проверяемое имя файла.
//
//  УдалятьНекорректныеСимволы - Булево - Истина указывает удалять некорректные
//             символы из переданной строки.
//

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

	// Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru
	// при этом были объединены запрещенные символы для файловых систем FAT и NTFS.

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

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

	Результат = Истина;

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

	Если МассивНайденныхНедопустимыхСимволов.Количество() <> 0 Тогда

		Результат = Ложь;

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

	КонецЕсли;

	Если Не Результат Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;

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

// Рекурсивно обходит каталоги и подсчитывает количество файлов и их суммарный размер.


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

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

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

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

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

		ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ПараметрыВыполнения.ИмяФайла);

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

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

		ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 260;
		Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда
			// Для Excel длина имени файла вместе с путем не должна превышать 218 знака.
			ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218;
		КонецЕсли;

		МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\"

		Если ПараметрыВыполнения.ВРабочемКаталогеВладельца = Ложь Тогда
#Если Не ВебКлиент Тогда
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(Знач ПараметрыВыполнения)

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

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

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

		ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ПараметрыВыполнения.ИмяФайла);

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

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

		ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 260;
		Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда
			// Для Excel длина имени файла вместе с путем не должна превышать 218 знака.
			ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218;
		КонецЕсли;

		МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\"

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

				// Если  имя  файла плюс 5 превышает 260 - пишем "Измените имя  файла на более короткое. ОК" и выходим.
				Если СтрДлина(ПараметрыВыполнения.ИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда

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

				КонецЕсли;

				ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(-1, ПараметрыВыполнения);
				Возврат;

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

	КонецЕсли;

	ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения);

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

// Продолжение процедуры (см. выше).

Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(Ответ, ПараметрыВыполнения)

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

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

// Продолжение процедуры (см. выше).

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

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

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

	ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога
		+ РаботаСФайламиСлужебныйКлиентСервер.УникальноеИмяСПутем(
		ПараметрыВыполнения.ИмяКаталога,
		ПараметрыВыполнения.ИмяФайла);

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

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

// Продолжение процедуры (см. выше).

Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеПереносаСодержимогоРабочегоКаталога(СодержимоеПеренесено, ПараметрыВыполнения) Экспорт

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

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

// Продолжение процедуры (см. выше).
//
// Параметры:
//   ПараметрыВыполнения   - Структура:
//     * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла
//


[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
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

	ПараметрыФормы = Новый Структура("ПринятиеРешенияОБлокировке", Истина);
	Оповещение = Новый ОписаниеОповещения("ПослеОткрытияОкнаБлокировкиРаботыСВнешнимиРесурсами", ЭтотОбъект, Параметры);
	ОткрытьФорму("ОбщаяФорма.БлокировкаРаботыСВнешнимиРесурсами", ПараметрыФормы,,,,, Оповещение);

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

// Только для внутреннего использования.
Процедура ПослеОткрытияОкнаБлокировкиРаботыСВнешнимиРесурсами(Результат, Параметры) Экспорт

	ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения);

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

Процедура ПерейтиКНастройкеРегламентныхЗаданий() Экспорт
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("e1cib/app/Обработка.РегламентныеИФоновыеЗадания");
КонецПроцедуры

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


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

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

Процедура ПолучитьСведенияОПодписантах(ОповещениеОЗавершении,
									НастройкиПользователя,
									ДанныеДокумента,
									ТипПодписи = "CMS",
									ПараметрыОперации = Неопределено)
Экспорт

	ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации);

	СервисКриптографииDSSСлужебныйКлиент.ПолучитьСведенияОПодписантах(ТекущиеНастройки,
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПолучитьСведенияОПодписантах(ОповещениеОЗавершении,
									НастройкиПользователя,
									ДанныеДокумента,
									ТипПодписи = "CMS",
									ПараметрыОперации = Неопределено) Экспорт

	ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации);

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

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

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

Процедура ПроверитьПодпись(ОповещениеОЗавершении,
						НастройкиПользователя,
						ДанныеДокумента,
						ИсходныйДокумент = Неопределено,
						ТипПодписи = "CMS",
						ПараметрыОперации = Неопределено) Экспорт

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

	СервисКриптографииDSSСлужебныйКлиент.ПроверитьПодпись(ТекущиеНастройки,
					ОповещениеОЗавершении,
					ДанныеДокумента,
					ИсходныйДокумент,
					ТипПодписи,
					ПараметрыОперации);

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

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

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

	ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации);

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

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

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

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

	ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации);

	СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент(
					ТекущиеНастройки,
					ОповещениеОЗавершении,
					"ЗагрузитьДокумент",
					ПараметрыДокумента,
					ДанныеДокумента,
					ПараметрыОперации);

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

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

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

	ТекущиеНастройки = ПолучитьНастройкиПользователя(НастройкиПользователя, ПараметрыОперации);

	СервисКриптографииDSSСлужебныйКлиент.ОбработатьДокумент(
					ТекущиеНастройки,
					ОповещениеОЗавершении,
					"ЗагрузитьПакетДокументов",
					ПараметрыДокументов,
					Неопределено,
					ПараметрыОперации);

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

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


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

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

Процедура УправлениеЭлементамиОбщее(КонтекстФормы, ОткудаВызов)
РеестрИмен = БазовыйРеестрРеквизитов(КонтекстФормы);
	ИменаЭлементов = РеестрИмен.ИменаЭлементовФормы;

	СписокГрупп	= КонтекстФормы[РеестрИмен.ИменаГруппКонтейнера];
	ЭлементыФормы = КонтекстФормы.Элементы;
	ОблачныйСертификат = ЭтоОперацияОблачнойПодписи(КонтекстФормы);
	ФормаИсточник = КонтекстФормы[РеестрИмен.ПодтверждениеТипОперации];

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

	НастройкиПользователя	= КонтекстФормы[РеестрИмен.НастройкиПользователя];
	Если ФормаИсточник = "Аутентификация"
			И НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда
		ОтдельнаяАвторизация= Ложь;
	Иначе
		ОтдельнаяАвторизация= НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации");
	КонецЕсли;

	ИспользованиеВозможно	= СервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи();
	ОперацияАутентификации	= ФормаИсточник = "Аутентификация";
	ДатаСеанса				= СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса();
	КодЯзыка 				= СервисКриптографииDSSСлужебныйКлиент.КодЯзыка();
	ДанныеПодтверждения		= КонтекстФормы[РеестрИмен.ДанныеПодтверждения];
	ОжидатьВыполнения		= КонтекстФормы[РеестрИмен.ОжидатьВыполнения];
	БылаАвторизация			= ДанныеПодтверждения.ПараметрыВариантаВстроенного.ЕстьАвторизация И ИспользованиеВозможно И ФормаИсточник <> "Проверка";
	ПинКодПроверен			= ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПинКодПроверен;
	ПарольВПамяти			= ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПарольВПамяти;
	СпособПодтверждения 	= ДанныеПодтверждения.ВторичнаяАвторизация;
	ЕстьАвторизация			= СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса) ИЛИ ОперацияАутентификации;
	ЕстьКомментарий			= Ложь;
	НеНачалось 				= ДанныеПодтверждения.ЭтапЦикла = "Инициализация"
								ИЛИ (ДанныеПодтверждения.ЭтапЦикла = "Ошибка" И НЕ ОтдельнаяАвторизация И НЕ ЕстьАвторизация);
	НуженПинКод				= ?(ЗначениеЗаполнено(ДанныеПодтверждения.Сертификат), ДанныеПодтверждения.Сертификат.ТребуетсяПинКод, Истина);
	СертификатАвторизации	= НастройкиПользователя.СертификатАвторизации
								ИЛИ НастройкиПользователя.ПервичнаяАутентификация <> ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации");

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

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

	ТипПодтверждения = СервисКриптографииDSSКлиентСервер.ПолучитьВторичнуюАвторизацию(СпособПодтверждения);
	Если НЕ ТребуетсяПодтверждение ИЛИ НЕ ИспользованиеВозможно Тогда
		ВариантВидимости = 0;
	ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоМобильноеПриложениеДляПодтверждения(СпособПодтверждения) Тогда
		ВариантВидимости = 3;
	ИначеЕсли ТипПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС")
		ИЛИ ТипПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта") Тогда
		ВариантВидимости = 1;
	ИначеЕсли ТипПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда
		ВариантВидимости = 2;
	Иначе
		ВариантВидимости = 4;
	КонецЕсли;

	ЭтапыПодтверждения = Новый Массив;
	ЭтапыПодтверждения.Добавить((БылаАвторизация ИЛИ ВариантВидимости <> 0) И НуженПинКод И НЕ ПарольВПамяти);
	ЭтапыПодтверждения.Добавить(БылаАвторизация);
	ЭтапыПодтверждения.Добавить(ТребуетсяПодтверждение);

	УправлениеЭлементамиФормы(КонтекстФормы, Ложь, НеНачалось И (НЕ ОтдельнаяАвторизация ИЛИ ЕстьАвторизация), НуженПинКод И ИспользованиеВозможно, ПинКодПроверен);

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель1", "Видимость", ЭтапыПодтверждения[0], ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель2", "Видимость", ЭтапыПодтверждения[1], ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель3", "Видимость", ИспользованиеВозможно И (ВариантВидимости <> 0 ИЛИ БылаАвторизация), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель4", "Видимость", ЕстьКомментарий И (ВариантВидимости <> 0 ИЛИ БылаАвторизация), ИменаЭлементов);

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗапись", "Видимость", НЕ ОтдельнаяАвторизация И БылаАвторизация, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеЛогин", "Видимость", ЗначениеЗаполнено(КонтекстФормы[РеестрИмен.Логин]), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтверждениеПарольЗапомнить", "Видимость", НЕ ОтдельнаяАвторизация И БылаАвторизация, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеЗапомнитьПарольЛогина", "Видимость", ЗначениеЗаполнено(КонтекстФормы[РеестрИмен.Логин]), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗаписьВеб", "Видимость", ОтдельнаяАвторизация И БылаАвторизация, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПредставлениеСертификата", "Видимость", НЕ ОтдельнаяАвторизация И БылаАвторизация И НЕ СертификатАвторизации, ИменаЭлементов);
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура УправлениеЭлементамиОбщее(КонтекстФормы, ОткудаВызов)

	РеестрИмен = БазовыйРеестрРеквизитов(КонтекстФормы);
	ИменаЭлементов = РеестрИмен.ИменаЭлементовФормы;

	СписокГрупп	= КонтекстФормы[РеестрИмен.ИменаГруппКонтейнера];
	ЭлементыФормы = КонтекстФормы.Элементы;
	ОблачныйСертификат = ЭтоОперацияОблачнойПодписи(КонтекстФормы);
	ФормаИсточник = КонтекстФормы[РеестрИмен.ПодтверждениеТипОперации];

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

	НастройкиПользователя	= КонтекстФормы[РеестрИмен.НастройкиПользователя];
	Если ФормаИсточник = "Аутентификация"
			И НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_ДвухФакторная") Тогда
		ОтдельнаяАвторизация= Ложь;
	Иначе
		ОтдельнаяАвторизация= НастройкиПользователя.ПервичнаяАутентификация = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_КодАвторизации");
	КонецЕсли;

	ИспользованиеВозможно	= СервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи();
	ОперацияАутентификации	= ФормаИсточник = "Аутентификация";
	ДатаСеанса				= СервисКриптографииDSSСлужебныйКлиент.ДатаСеанса();
	КодЯзыка 				= СервисКриптографииDSSСлужебныйКлиент.КодЯзыка();
	ДанныеПодтверждения		= КонтекстФормы[РеестрИмен.ДанныеПодтверждения];
	ОжидатьВыполнения		= КонтекстФормы[РеестрИмен.ОжидатьВыполнения];
	БылаАвторизация			= ДанныеПодтверждения.ПараметрыВариантаВстроенного.ЕстьАвторизация И ИспользованиеВозможно И ФормаИсточник <> "Проверка";
	ПинКодПроверен			= ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПинКодПроверен;
	ПарольВПамяти			= ДанныеПодтверждения.ПараметрыВариантаВстроенного.ПарольВПамяти;
	СпособПодтверждения 	= ДанныеПодтверждения.ВторичнаяАвторизация;
	ЕстьАвторизация			= СервисКриптографииDSSКлиентСервер.УчетнаяЗаписьАвторизована(НастройкиПользователя, ДатаСеанса) ИЛИ ОперацияАутентификации;
	ЕстьКомментарий			= Ложь;
	НеНачалось 				= ДанныеПодтверждения.ЭтапЦикла = "Инициализация"
								ИЛИ (ДанныеПодтверждения.ЭтапЦикла = "Ошибка" И НЕ ОтдельнаяАвторизация И НЕ ЕстьАвторизация);
	НуженПинКод				= ?(ЗначениеЗаполнено(ДанныеПодтверждения.Сертификат), ДанныеПодтверждения.Сертификат.ТребуетсяПинКод, Истина);
	СертификатАвторизации	= НастройкиПользователя.СертификатАвторизации
								ИЛИ НастройкиПользователя.ПервичнаяАутентификация <> ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Первичный_СертификатАвторизации");

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

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

	ТипПодтверждения = СервисКриптографииDSSКлиентСервер.ПолучитьВторичнуюАвторизацию(СпособПодтверждения);
	Если НЕ ТребуетсяПодтверждение ИЛИ НЕ ИспользованиеВозможно Тогда
		ВариантВидимости = 0;
	ИначеЕсли СервисКриптографииDSSКлиентСервер.ЭтоМобильноеПриложениеДляПодтверждения(СпособПодтверждения) Тогда
		ВариантВидимости = 3;
	ИначеЕсли ТипПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_СМС")
		ИЛИ ТипПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ЭлектроннаяПочта") Тогда
		ВариантВидимости = 1;
	ИначеЕсли ТипПодтверждения = ПредопределенноеЗначение("Перечисление.СпособыАвторизацииDSS.Вторичный_ОфлайнПодтверждение") Тогда
		ВариантВидимости = 2;
	Иначе
		ВариантВидимости = 4;
	КонецЕсли;

	ЭтапыПодтверждения = Новый Массив;
	ЭтапыПодтверждения.Добавить((БылаАвторизация ИЛИ ВариантВидимости <> 0) И НуженПинКод И НЕ ПарольВПамяти);
	ЭтапыПодтверждения.Добавить(БылаАвторизация);
	ЭтапыПодтверждения.Добавить(ТребуетсяПодтверждение);

	УправлениеЭлементамиФормы(КонтекстФормы, Ложь, НеНачалось И (НЕ ОтдельнаяАвторизация ИЛИ ЕстьАвторизация), НуженПинКод И ИспользованиеВозможно, ПинКодПроверен);

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель1", "Видимость", ЭтапыПодтверждения[0], ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель2", "Видимость", ЭтапыПодтверждения[1], ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель3", "Видимость", ИспользованиеВозможно И (ВариантВидимости <> 0 ИЛИ БылаАвторизация), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеРазделитель4", "Видимость", ЕстьКомментарий И (ВариантВидимости <> 0 ИЛИ БылаАвторизация), ИменаЭлементов);

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

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияКод", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И (ВариантВидимости = 1 ИЛИ ВариантВидимости = 2), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПовторить", "Видимость", НЕ НеНачалось И ВариантВидимости = 1, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияОфлайн", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И ВариантВидимости = 2, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияВыбор", "Видимость", ВариантВидимости <> 0, ИменаЭлементов);
	Если БылаАвторизация И ИспользованиеВозможно Тогда
		УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияВыбор", "Доступность", ВариантВидимости <> 0, ИменаЭлементов);
	КонецЕсли;
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияОписание", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияОнлайн", "Видимость", НЕ НеНачалось И (ЕстьАвторизация ИЛИ ОперацияАутентификации) И ВариантВидимости = 3, ИменаЭлементов);

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПредставлениеСертификата", "ТолькоПросмотр", ЕстьАвторизация ИЛИ (ОперацияАутентификации И НЕ НеНачалось), ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПароль", "ТолькоПросмотр", ЕстьАвторизация И НЕ ОперацияАутентификации, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ГруппаПодтвержденияУчетнаяЗаписьВеб", "ТолькоПросмотр", ЕстьАвторизация, ИменаЭлементов);

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеОК", "КнопкаПоУмолчанию", НЕ НеНачалось, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеОК", "Доступность", НЕ НеНачалось И НЕ ОжидатьВыполнения, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеИнструкция", "Видимость", НЕ НеНачалось И ВариантВидимости = 2, ИменаЭлементов);

	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеПовторить", "Доступность", НЕ НеНачалось И НЕ ОжидатьВыполнения, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеКодПодтверждения", "Доступность", НЕ НеНачалось И НЕ ОжидатьВыполнения, ИменаЭлементов);
	УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеСпособПодтверждения", "Доступность", ВариантВидимости <> 0, ИменаЭлементов);
	Если ОтдельнаяАвторизация Тогда
		УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеАвторизацияВеб", "Доступность", БылаАвторизация И НЕ ЕстьАвторизация, ИменаЭлементов);
		УстановитьСвойствоЭлемента(ЭлементыФормы, "ПодтверждениеАвторизацияВеб", "Заголовок",
				?(НЕ ЕстьАвторизация, НСтр("ru = 'авторизоваться'", КодЯзыка), НСтр("ru = 'авторизован'", КодЯзыка)), ИменаЭлементов);
	КонецЕсли;

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

	// нумеруем этапы
	ВсегоЭтапов = 0;
	Для Счетчик = 1 По ЭтапыПодтверждения.Количество() Цикл
		Если ЭтапыПодтверждения[Счетчик - 1] Тогда
			ВсегоЭтапов = ВсегоЭтапов + 1;
		КонецЕсли;
	КонецЦикла;

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

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

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

// Обертка для упрощения вызова основной функции
//


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

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

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

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

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

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

	ПараметрыБлокировки = ПараметрыБлокировкиСеансов(Ложь);
	ТекущаяДатаСеанса = ТекущаяДатаСеанса();

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

	Для Каждого Раздел Из Разделы Цикл

		ИдентификаторДела = "БлокировкаСеансов" + СтрЗаменить(Раздел.ПолноеИмя(), ".", "");

		Дело = ТекущиеДела.Добавить();
		Дело.Идентификатор  = ИдентификаторДела;
		Дело.ЕстьДела       = ПараметрыБлокировки.Установлена;
		Дело.Представление  = НСтр("ru = 'Блокировка работы пользователей'");
		Дело.Форма          = "Обработка.БлокировкаРаботыПользователей.Форма";
		Дело.Важное         = Важность;
		Дело.Владелец       = Раздел;

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

	КонецЦикла;

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

// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииСерверныхОповещений

Процедура ПриДобавленииСерверныхОповещений(Оповещения) Экспорт

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

	Оповещение = СерверныеОповещения.НовоеСерверноеОповещение(
		"СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов");
	Оповещение.ИмяМодуляОтправки  = "СоединенияИБ";
	Оповещение.ИмяМодуляПолучения = "СоединенияИБКлиент";
	Оповещение.ПериодПроверки = 300;

	Оповещения.Вставить(Оповещение.Имя, Оповещение);

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

// См. СтандартныеПодсистемыСервер.ПриОтправкеСерверногоОповещения

Процедура ПриОтправкеСерверногоОповещения(ИмяОповещения, ВариантыПараметров) Экспорт

	ОтправитьСерверноеОповещениеОбУстановкеБлокировки(Истина);

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

// См. ОбщегоНазначенияПереопределяемый.ПриПериодическомПолученииДанныхКлиентаНаСервере

Процедура ПриПериодическомПолученииДанныхКлиентаНаСервере(Параметры, Результаты) Экспорт

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

	ИмяПараметра = "СтандартныеПодсистемы.ЗавершениеРаботыПользователей.БлокировкаСеансов";
	ПараметрыБлокировкиСеансов = ПараметрыБлокировкиСеансовКогдаУстановлена();

	Если ПараметрыБлокировкиСеансов <> Неопределено
	   И ПараметрыБлокировкиСеансов.Установлена Тогда

		Результаты.Вставить(ИмяПараметра, ПараметрыБлокировкиСеансов);
	КонецЕсли;

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

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

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

Процедура ОтправитьСерверноеОповещениеОбУстановкеБлокировки(ПриОтправкеСерверногоОповещения = Ложь) Экспорт

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

		Если ПараметрыБлокировкиСеансов.Установлена
		 Или Не ПриОтправкеСерверногоОповещения Тогда

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

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

////////////////////////////////////////////////////////////////////////////////
// Прочее.

// Возвращает текст сообщения блокировки сеансов.
//
// Параметры:
//  Сообщение - Строка - сообщение для блокировки.
//  КодРазрешения - Строка - код разрешения для входа в информационную базу.
//
// Возвращаемое значение:
//   Строка - сообщение блокировки.
//

Функция СформироватьСообщениеБлокировки(Знач Сообщение, Знач КодРазрешения) Экспорт

	ПараметрыАдминистрирования = СтандартныеПодсистемыСервер.ПараметрыАдминистрирования();
	ПризнакФайловогоРежима = Ложь;
	ПутьКИБ = СоединенияИБКлиентСервер.ПутьКИнформационнойБазе(ПризнакФайловогоРежима, ПараметрыАдминистрирования.ПортКластера);
	СтрокаПутиКИнформационнойБазе = ?(ПризнакФайловогоРежима = Истина, "/F", "/S") + ПутьКИБ;
	ТекстСообщения = "";
	Если НЕ ПустаяСтрока(Сообщение) Тогда
		ТекстСообщения = Сообщение + Символы.ПС + Символы.ПС;
	КонецЕсли;

	ИмяПараметра = "РазрешитьРаботуПользователей";
	Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
		ТекстСообщения = ТекстСообщения + НСтр("ru = '%1
			|Для разрешения работы пользователей можно открыть приложение с параметром %2. Например:
			|http://<веб-адрес сервера>/?C=%2'");
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения,
			СоединенияИБКлиентСервер.ТекстДляАдминистратора(), ИмяПараметра);
	Иначе
		ТекстСообщения = ТекстСообщения + НСтр("ru = '%1
			|Для того чтобы разрешить работу пользователей, воспользуйтесь консолью кластера серверов или запустите ""1С:Предприятие"" с параметрами:
			|ENTERPRISE %2 /C%3 /UC%4'");
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, СоединенияИБКлиентСервер.ТекстДляАдминистратора(),
			СтрокаПутиКИнформационнойБазе, ИмяПараметра, НСтр("ru = '<код разрешения>'"));
	КонецЕсли;

	Возврат ТекстСообщения;

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

// Возвращает установлена ли блокировка соединений на конкретную дату.
//
// Параметры:
//  ТекущийРежим - БлокировкаСеансов - блокировка сеансов.
//  ТекущаяДата - Дата - дата, на которую необходимо проверить.
//
// Возвращаемое значение:
//  Булево - Истина, если установлена.
//

Функция УстановленаБлокировкаСоединенийНаДату(ТекущийРежим, ТекущаяДата)

	Возврат (ТекущийРежим.Установлена И ТекущийРежим.Начало <= ТекущаяДата
		И (Не ЗначениеЗаполнено(ТекущийРежим.Конец) Или ТекущаяДата <= ТекущийРежим.Конец));

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

// См. описание в функции ПараметрыБлокировкиСеансов.
//
// Параметры:
//    ПолучитьКоличествоСеансов - Булево
//    ПараметрыБлокировки - см. ТекущиеПараметрыБлокировкиСоединений
//

[Assistant] Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела)


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

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

Функция ДополнительныеПараметрыЗавершенияРаботыПользователейНормализованные(ДополнительныеПараметры)
ДополнительныеПараметрыНормализованные = Новый Структура;

	КлючиДополнительныхПараметров = КлючиДополнительныхПараметровЗавершенияРаботыПользователей();

	Для Каждого ДополнительныйПараметр Из ДополнительныеПараметры Цикл

		Для Каждого КлючДополнительногоПараметра Из КлючиДополнительныхПараметров Цикл

			Если СтрНачинаетсяС(ДополнительныйПараметр.Ключ, КлючДополнительногоПараметра.Ключ) Тогда

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

[Assistant]
Функция ДополнительныеПараметрыЗавершенияРаботыПользователейНормализованные(ДополнительныеПараметры)

	ДополнительныеПараметрыНормализованные = Новый Структура;

	КлючиДополнительныхПараметров = КлючиДополнительныхПараметровЗавершенияРаботыПользователей();

	Для Каждого ДополнительныйПараметр Из ДополнительныеПараметры Цикл

		Для Каждого КлючДополнительногоПараметра Из КлючиДополнительныхПараметров Цикл

			Если СтрНачинаетсяС(ДополнительныйПараметр.Ключ, КлючДополнительногоПараметра.Ключ) Тогда

				ДополнительныеПараметрыНормализованные.Вставить(
					КлючДополнительногоПараметра.Значение, ДополнительныйПараметр.Значение);

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

	ОтформатироватьДополнительныеПараметрыЗавершенияРаботыПользователей(ДополнительныеПараметрыНормализованные);

	Возврат ДополнительныеПараметрыНормализованные;

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

Функция КлючиДополнительныхПараметровЗавершенияРаботыПользователей()

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

	Возврат КлючиДополнительныхПараметров;

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

Процедура ОтформатироватьДополнительныеПараметрыЗавершенияРаботыПользователей(ДополнительныеПараметры)

	ПараметрыПодлежащиеФорматированию = Новый Массив;
	ПараметрыПодлежащиеФорматированию.Добавить("ОжиданиеНачалаБлокировкиМин");
	ПараметрыПодлежащиеФорматированию.Добавить("ДлительностьБлокировкиМин");

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

	Для Каждого Параметр Из ПараметрыПодлежащиеФорматированию Цикл

		ЗначениеПараметра = Неопределено;

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

		ДоступныеСимволы = Новый Массив;

		КоличествоСимволов = СтрДлина(ЗначениеПараметра);

		Для НомерСимвола = 1 По КоличествоСимволов Цикл

			Символ = Сред(ЗначениеПараметра, НомерСимвола, 1);

			Если СтрНайти("0123456789", Символ) > 0 Тогда
				ДоступныеСимволы.Добавить(Символ);
			КонецЕсли;

		КонецЦикла;

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

		Если ЗначениеЗаполнено(ЗначениеПараметраНормализованное) Тогда
			ДополнительныеПараметры[Параметр] = ОписаниеЧисла.ПривестиЗначение(ЗначениеПараметраНормализованное);
		Иначе
			ДополнительныеПараметры[Параметр] = 0;
		КонецЕсли;

	КонецЦикла;

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

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

Функция КлючСодержитсяВПараметрахЗапуска(ПараметрыЗапуска, Ключ)

	Для Каждого Параметр Из ПараметрыЗапуска Цикл

		Если СтрНачинаетсяС(СокрЛП(Параметр), Ключ) Тогда
			Возврат Истина;
		КонецЕсли;

	КонецЦикла;

	Возврат Ложь;

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

Функция ПараметрыЗапускаУточненные(ПараметрыЗапуска, ДополнительныеПараметры)

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

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

	ПараметрыЗапускаУточненные = Новый Массив;
	ПараметрыЗапускаУточненные.Добавить(ПараметрыЗапуска[0]);
	ПараметрыЗапускаУточненные.Добавить(ИмяАдминистратораКластера);

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

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

	Возврат ПараметрыЗапускаУточненные;

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

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


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

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

Процедура ПроверитьВерсиюПлатформыПриЗапуске(Параметры, Контекст)
Экспорт

	ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске();

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

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

	Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Текущая, Минимальная) < 0 Тогда
		Если ПользователиКлиент.ЭтоПолноправныйПользователь(Истина) Тогда
			ТекстСообщения =
				НСтр("ru = 'Вход в программу невозможен.
				           |Предварительно обновите версию платформы 1С:Предприятие.'");
		Иначе
			ТекстСообщения =
				НСтр("ru = 'Вход в программу невозможен.
				           |Обратитесь к администратору для обновления версии платформы 1С:Предприятие.'");
		КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПроверитьВерсиюПлатформыПриЗапуске(Параметры, Контекст) Экспорт

	ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске();

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

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

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

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

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

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

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

Процедура ПослеЗакрытияФормыНерекомендуемойВерсииПлатформы(Результат, Параметры) Экспорт

	Если Результат <> "Продолжить" Тогда
		Параметры.Отказ = Истина;
	Иначе
		Параметры.ПолученныеПараметрыКлиента.Вставить("ПоказатьНерекомендуемуюВерсиюПлатформы");
	КонецЕсли;

	ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения);

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

// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы2.

Процедура ПредупредитьОНедопустимойВерсииПлатформы(Параметры, Контекст) Экспорт

	ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыНедопустимойВерсииПлатформы", ЭтотОбъект, Параметры);

	Форма = ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.НеобходимоОбновитьПлатформу", ,
		, , , , ОповещениеОЗакрытии);

	Если Форма = Неопределено Тогда
		ПослеЗакрытияФормыНедопустимойВерсииПлатформы("Продолжить", Параметры);
	КонецЕсли;

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

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

Процедура ПослеЗакрытияФормыНедопустимойВерсииПлатформы(Результат, Параметры) Экспорт

	ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения);

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

// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.

Процедура ПередНачаломРаботыСистемы3(Параметры) Экспорт

	// Проверяет необходимость восстановления связи с главным узлом и
	// начинает восстановление, если требуется.

	ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске();

	Если НЕ ПараметрыКлиента.Свойство("ВосстановитьСвязьСГлавнымУзлом") Тогда
		Возврат;
	КонецЕсли;

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

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

// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.

Процедура ПередНачаломРаботыСистемы4(Параметры) Экспорт

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

	ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске();

	Если Не ПараметрыКлиента.Свойство("ВыбратьНачальныеРегиональныеНастройкиИБ") Тогда
		Возврат;
	КонецЕсли;

	Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения(
		"ИнтерактивнаяОбработкаНачальныхРегиональныхНастроекИБ", ЭтотОбъект, Параметры);

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

// Только для внутреннего использования. Продолжение процедуры ПроверитьНеобходимостьВосстановленияСвязиСГлавнымУзлом.

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

	ПараметрыКлиента = ПараметрыРаботыКлиентаПриЗапуске();

	Если ПараметрыКлиента.ВосстановитьСвязьСГлавнымУзлом = Ложь Тогда
		Параметры.Отказ = Истина;
		ПоказатьПредупреждение(
			ОповещениеБезРезультата(Параметры.ОбработкаПродолжения),
			НСтр("ru = 'Вход в программу временно невозможен до восстановления связи с главным узлом.
			           |Обратитесь к администратору за подробностями.'"),
			15);
		Возврат;
	КонецЕсли;

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

	Если Форма = Неопределено Тогда
		ПослеЗакрытияФормыВосстановленияСвязиСГлавнымУзлом(Новый Структура("Отказ", Истина), Параметры);
	КонецЕсли;

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

// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы4.