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

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

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

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

	Результат.Вставить("Номер");
	Результат.Вставить("ИмяПользователя");
	Результат.Вставить("ИмяКлиентскогоКомпьютера");
	Результат.Вставить("ИдентификаторКлиентскогоПриложения");
	Результат.Вставить("МоментУстановкиСоединения");
	Результат.Вставить("РежимСоединенияСИнформационнойБазой");
	Результат.Вставить("РежимСоединенияСБазойДанных");
	Результат.Вставить("БлокировкаСУБД");
	Результат.Вставить("Передано");
	Результат.Вставить("ПереданоЗа5Минут");
	Результат.Вставить("СерверныхВызовов");
	Результат.Вставить("СерверныхВызововЗа5Минут");
	Результат.Вставить("ПереданоСУБД");
	Результат.Вставить("ПереданоСУБДЗа5Минут");
	Результат.Вставить("СоединениеСУБД");
	Результат.Вставить("ВремяСУБД");
	Результат.Вставить("МоментЗахватаСоединенияСУБД");
	Результат.Вставить("ДлительностьСерверныхВызовов");
	Результат.Вставить("ДлительностьВызововСУБД");
    // TODO: допиши оставшуюся часть

[Assistant]
Функция СвойстваСоединения() Экспорт

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

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

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

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

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

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

	Если ПараметрыАдминистрированияИБ = Неопределено Тогда
		ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияКластера;
	КонецЕсли;

	МенеджерАдминистрирования = МенеджерАдминистрирования(ПараметрыАдминистрированияКластера);

	Возврат МенеджерАдминистрирования.СоединенияСИнформационнойБазой(
		ПараметрыАдминистрированияКластера,
		ПараметрыАдминистрированияИБ,
		Фильтр);

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

// Разрывает соединения с информационной базой по фильтру.
//
// Параметр ПараметрыАдминистрированияИБ может быть опущен в том случае, если аналогичные поля указаны
// в параметре ПараметрыАдминистрированияКластера.
// Если в параметре Фильтр задана структура (см. АдминистрированиеКластера.ФильтрСоединений), то
// сравнение всегда выполняется на равенство.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - Массив из см. АдминистрированиеКластера.ФильтрСоединений
//          - см. АдминистрированиеКластера.ФильтрСоединений
//

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

	Если ПараметрыАдминистрированияИБ = Неопределено Тогда
		ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияКластера;
	КонецЕсли;

	МенеджерАдминистрирования = МенеджерАдминистрирования(ПараметрыАдминистрированияКластера);

	МенеджерАдминистрирования.РазорватьСоединенияСИнформационнойБазой(
		ПараметрыАдминистрированияКластера,
		ПараметрыАдминистрированияИБ,
		Фильтр);

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

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

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

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

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

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

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

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

#Область ПрофилиБезопасности

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


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

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

Функция ПривестиЗначение(Знач Значение)
Если ТипЗнч(Значение) = Тип("Дата") Тогда

		Возврат XMLСтрока(Значение);

	ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда

		Возврат Формат(Значение, "БЛ=no; БИ=yes");

	ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда

		Возврат Формат(Значение, "ЧРД=,; ЧН=0; ЧГ=0; ЧО=1");

	ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда

		// В документации написано:
		// Строки, допускающие произвольные символы, выводятся в двойных кавычках, при этом двойные кавычки в самих строках дублируются.
		Цифры = "0123456789";
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПривестиЗначение(Знач Значение)

	Если ТипЗнч(Значение) = Тип("Дата") Тогда

		Возврат XMLСтрока(Значение);

	ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда

		Возврат Формат(Значение, "БЛ=no; БИ=yes");

	ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда

		Возврат Формат(Значение, "ЧРД=,; ЧН=0; ЧГ=0; ЧО=1");

	ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда

		// В документации написано:
		// Строки, допускающие произвольные символы, выводятся в двойных кавычках, при этом двойные кавычки в самих строках дублируются.
		Цифры = "0123456789";
		Латиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		Кириллица = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯабвгдежзийклмнопрстуфхцчшщыъьэюя"; // АПК:1036 проверка орфографии не требуется.
		ДопустимыеСимволы = Цифры + Латиница + Кириллица + "-";
		Если СтрокаСодержитТолькоДопустимыеСимволы(Значение, ДопустимыеСимволы) Тогда
			Возврат Значение;
		Иначе
			Возврат """" + СтрЗаменить(Значение, """", """""") + """";
		КонецЕсли;

	КонецЕсли;

	Возврат Строка(Значение);

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

Функция СтрокаСодержитТолькоДопустимыеСимволы(Строка, ДопустимыеСимволы)

	ВсеДопустимыеСимволы = Новый Соответствие;
	Для Позиция = 1 По СтрДлина(ДопустимыеСимволы) Цикл
		ВсеДопустимыеСимволы[Сред(ДопустимыеСимволы, Позиция, 1)] = Истина;
	КонецЦикла;

	Для Позиция = 1 По СтрДлина(Строка) Цикл
		Если ВсеДопустимыеСимволы[Сред(Строка, Позиция, 1)] = Неопределено Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;

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

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

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

	Если ТипЭлемента = Тип("Строка") Тогда

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

	ИначеЕсли ТипЭлемента = Тип("Число") Тогда

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

		Попытка
			Возврат Число(ЭлементВывода);
		Исключение
			ВызватьИсключение НСтр("ru = 'Неправильный формат.'");
		КонецПопытки;

	ИначеЕсли ТипЭлемента = Тип("Дата") Тогда

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

		Попытка
			Возврат XMLЗначение(Тип("Дата"), ЭлементВывода);
		Исключение
			ВызватьИсключение НСтр("ru = 'Неправильный формат.'");
		КонецПопытки;

	ИначеЕсли ТипЭлемента = Тип("Булево") Тогда

		Если ЭлементВывода = "on" Или ЭлементВывода = "yes" Тогда
			Возврат Истина;
		ИначеЕсли ЭлементВывода = "off" Или ЭлементВывода = "no" Тогда
			Возврат Ложь;
		Иначе
			ВызватьИсключение НСтр("ru = 'Неправильный формат.'");
		КонецЕсли;

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

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

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

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

	Иначе

		ВызватьИсключение НСтр("ru = 'Неверный тип элемента.'");

	КонецЕсли;

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

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

Функция ПарсерВывода(Знач ПотокВывода, Знач Словарь, Знач Фильтр = Неопределено, ТипыСвойств = Неопределено)

	Результат = Новый Массив;
	ЭлементРезультата = Новый Соответствие;

	Позиция = 1;
	КонецВывода = СтрДлина(ПотокВывода);

	Пока Позиция <= КонецВывода Цикл

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

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

	КонецЦикла;

	Если ЭлементРезультата.Количество() > 0 Тогда
		ПарсерЭлементаВывода(ЭлементРезультата, Результат, Словарь, Фильтр);
	КонецЕсли;

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

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

Функция ПрочитатьДоРазделителя(Поток, Позиция, Разделитель)

	ТекущийСимвол = Сред(Поток, Позиция, 1);

	// Сдвинуть позицию на значащий символ.
	Пока ПустаяСтрока(ТекущийСимвол) И Не ТекущийСимвол = Разделитель И Позиция < СтрДлина(Поток) Цикл
		Позиция = Позиция + 1;
		ТекущийСимвол = Сред(Поток, Позиция, 1);
	КонецЦикла;

	Если ТекущийСимвол = Разделитель Тогда
		Позиция = Позиция + 1;
		Возврат "";
	КонецЕсли;

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

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

Процедура ПарсерЭлементаВывода(ЭлементРезультата, Результат, Словарь, Фильтр)

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

	Если Фильтр <> Неопределено И Не АдминистрированиеКластера.ПроверитьУсловияФильтра(Объект, Фильтр) Тогда
		Возврат;
	КонецЕсли;

	Результат.Добавить(Объект);

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

Функция РазобратьЭлементВывода(Знач ЭлементВывода, Знач Словарь)

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

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

	КонецЦикла;

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

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

Функция ФильтрВНотациюRac(Знач Фильтр, Знач Словарь)

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

	Если Словарь = Неопределено Тогда
		Возврат Фильтр;
	КонецЕсли;

	Результат = Новый Массив();

	Для Каждого Условие Из Фильтр Цикл

		Если ТипЗнч(Условие) = Тип("КлючИЗначение") Тогда

			Результат.Добавить(Новый Структура("Свойство, ВидСравнения, Значение", Словарь[Условие.Ключ], ВидСравнения.Равно, Условие.Значение));

		ИначеЕсли ТипЗнч(Условие) = Тип("Структура") Тогда

			Результат.Добавить(Новый Структура("Свойство, ВидСравнения, Значение", Словарь[Условие.Свойство], Условие.ВидСравнения, Условие.Значение));

		КонецЕсли;

	КонецЦикла;

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

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


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

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

Процедура ИмяФункции(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено) Экспорт

	Если ПараметрыАдминистрированияИБ = Неопределено Тогда
		ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияКластера;
	КонецЕсли;

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

	УстановитьБлокировкуСеансовИЗаданийИнформационнойБазы(
		ПараметрыАдминистрированияКластера,
		ПараметрыАдминистрированияИБ,
		СвойстваБлокировки);

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

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

#Область БлокировкаРегламентныхЗаданий

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

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

	Если ПараметрыАдминистрированияИБ = Неопределено Тогда
		ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияКластера;
	КонецЕсли;

	МенеджерАдминистрирования = МенеджерАдминистрирования(ПараметрыАдминистрированияКластера);

	Результат = МенеджерАдминистрирования.БлокировкаРегламентныхЗаданийИнформационнойБазы(
		ПараметрыАдминистрированияКластера,
		ПараметрыАдминистрированияИБ);

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

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

// Устарела. Следует использовать АдминистрированиеКластера.УстановитьБлокировкуРегламентныхЗаданийИнформационнойБазы.
// Устанавливает новое состояние блокировки регламентных заданий для информационной базы.
//
// Параметры:
//  ПараметрыАдминистрированияКластера - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияКластера
//  ПараметрыАдминистрированияИБ - см. АдминистрированиеКластераКлиентСервер.ПараметрыАдминистрированияИнформационнойБазыКластера
//  БлокировкаРегламентныхЗаданий - Булево - флаг установки блокировки регламентных заданий информационной базы.
//

Процедура УстановитьБлокировкуРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач БлокировкаРегламентныхЗаданий) Экспорт

	Если ПараметрыАдминистрированияИБ = Неопределено Тогда
		ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияКластера;
	КонецЕсли;

	МенеджерАдминистрирования = МенеджерАдминистрирования(ПараметрыАдминистрированияКластера);

	МенеджерАдминистрирования.УстановитьБлокировкуРегламентныхЗаданийИнформационнойБазы(
		ПараметрыАдминистрированияКластера,
		ПараметрыАдминистрированияИБ,
		БлокировкаРегламентныхЗаданий);

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

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

#Область СеансыИнформационнойБазы

// Устарела. Следует использовать АдминистрированиеКластера.СвойстваСеанса.
// Конструктор структуры, описывающей свойства сеанса информационной базы.
//
// Возвращаемое значение:
//  Структура:
//   * Номер - Число - номер сеанса. Уникален среди всех сеансов информационной базы,
//   * ИмяПользователя - Строка - имя аутентифицированного пользователя информационной базы,
//   * ИмяКлиентскогоКомпьютера - Строка - имя или сетевой адрес компьютера, установившего
//     сеанс с информационной базой,
//   * ИдентификаторКлиентскогоПриложения - Строка - идентификатор приложения, установившего сеанс
//     (см. описание к функции глобального контекста ПредставлениеПриложения),
//   * ИдентификаторЯзыка - Строка - идентификатор языка интерфейса,
//   * МоментСозданияСеанса - Дата - (Дата и время) момент установки сеанса,
//   * МоментПоследнейАктивностиСеанса - Дата - (Дата и время) момент последней активности сеанса,
//   * Блокировка - Число - номер сеанса, который является причиной ожидания управляемой транзакционной
//     блокировки, в том случае, если сеанс выполняет установку управляемых транзакционных блокировок
//     и ожидает снятия блокировок, установленных другим сеансом (иначе - значение равно 0),
//   * БлокировкаСУБД - Число - номер сеанса, который является причиной ожидания транзакционной
//     блокировки, в том случае, если сеанс исполняет запрос к СУБД и ожидает транзакционную
//     блокировку, установленную другим сеансом (иначе - значение равно 0),
//   * Передано - Число - объем данных, переданных меду сервером 1С:Предприятия и клиентским приложением
//     данного сеанса с момента начала сеанса (в байтах),
//   * ПереданоЗа5Минут - Число - объем данных, переданных между сервером 1С:Предприятия и клиентским
//     приложением данного сеанса за последние 5 минут (в байтах),
//   * СерверныхВызовов - Число - количество вызовов сервера 1С:Предприятия от имена данного сеанса с
//     момента начала сеанса,
//   * СерверныхВызововЗа5Минут - Число - количество вызовов сервера 1С:Предприятия от имени данного сеанса
//     за последние 5 минут,
//   * ДлительностьСерверныхВызовов - Число - время исполнения вызовов сервера 1С:Предприятия от имени
//     данного сеанса с момента начала сеанса (в секундах),
//   * ДлительностьТекущегоСерверногоВызова - Число - интервал времени в миллисекундах, прошедший с момента начала
//     обращения, в случае, если сеанс выполняется вызов сервера 1С:Предприятия (иначе - значение равно 0),
//   * ДлительностьСерверныхВызововЗа5Минут - Число - время исполнения вызовов сервера 1С:Предприятия от имени
//     данного сеанса за последние 5 минут (в миллисекундах),
//   * ПереданоСУБД - Число - количество данных, переданных и полученных от СУБД от имени данного сеанса с
//     момента начала сеанса (в байтах),
//   * ПереданоСУБДЗа5Минут - Число - количество данных, переданных и полученных от СУБД от имени данного сеанса
//     за последние 5 минут (в байтах),
//   * ДлительностьВызововСУБД - Число - время исполнения запросов к СУБД от имени данного сеанса с момента начала
//     сеанса (в миллисекундах),
//   * ДлительностьТекущегоВызоваСУБД - Число - интервал времени в миллисекундах, прошедший с начала выполнения
//     запроса в случае, если сеанс выполняет запрос к СУБД (иначе - значение равно 0),
//   * ДлительностьВызововСУБДЗа5Минут - Число - суммарное время исполнения запросов к СУБД от имени данного сеанса
//     за последние 5 минут (в миллисекундах),
//   * СоединениеСУБД - Строка - номер соединения с СУБД в терминах СУБД в том случае, если в момент получения списка
//     сеансов выполняется запрос к СУБД, открыта транзакция или определены временные таблицы (т.е. захвачено
//     соединение с СУБД). Если соединение с СУБД не захвачено - значение равно пустой строке,
//   * ВремяСоединенияСУБД - Число - время соединения с СУБД с момента захвата (в миллисекундах). Если соединение с.
//     СУБД не захвачено - значение равно 0,
//   * МоментЗахватаСоединенияСУБД - Дата - (Дата и время) момент времени, когда соединение с СУБД было последний раз
//     захвачено другим сеансом.
//

[Assistant] Процедура СнятьБлокировкуСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено)


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

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

Процедура ИмяФункции(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач Фильтр = Неопределено) Экспорт

	Если ПараметрыАдминистрированияИБ = Неопределено Тогда
		ПараметрыАдминистрированияИБ = ПараметрыАдминистрированияКластера;
	КонецЕсли;

	МенеджерАдминистрирования = МенеджерАдминистрирования(ПараметрыАдминистрированияКластера);

	МенеджерАдминистрирования.УдалитьСеансыИнформационнойБазы(
		ПараметрыАдминистрированияКластера,
		ПараметрыАдминистрированияИБ,
		Фильтр);

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

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

#Область СоединенияСИнформационнойБазой

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

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

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

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

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

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

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

[Assistant] Процедура УдалитьСеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено, Знач Фильтр = Неопределено)


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

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

Функция КоличествоНевыполненныхЗадачБизнесПроцессов(БизнесПроцессы)
Экспорт

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

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

	Запрос = Новый Запрос(
    // TODO: допиши оставшуюся часть

[Assistant]
Функция КоличествоНевыполненныхЗадачБизнесПроцессов(БизнесПроцессы) Экспорт

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

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

	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(*) КАК Количество
		|ИЗ
		|	Задача.ЗадачаИсполнителя КАК Задачи
		|ГДЕ
		|	Задачи.БизнесПроцесс В (&БизнесПроцессы)
		|	И Задачи.Выполнена = ЛОЖЬ");

	Запрос.УстановитьПараметр("БизнесПроцессы", МассивБизнесПроцессов);
	Возврат Запрос.Выполнить().Выгрузить()[0].Количество;

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

// Возвращаемое значение:
//  Число
//

Функция КоличествоНевыполненныхЗадачБизнесПроцесса(БизнесПроцесс) Экспорт

	Возврат КоличествоНевыполненныхЗадачБизнесПроцессов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(БизнесПроцесс));

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

// Возвращаемое значение:
//  - БизнесПроцессСсылка
//  - Неопределено
//

Функция ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки) Экспорт

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

		Количество = Количество + 1;
	КонецЦикла;
	Возврат ?(Количество = 1, ВыделенныеСтроки[0].Владелец, Неопределено);
КонецФункции

Процедура ПриПеренаправленииЗадачи(ЗадачаОбъект, НоваяЗадачаОбъект)

	Если ЗадачаОбъект.БизнесПроцесс = Неопределено Или ЗадачаОбъект.БизнесПроцесс.Пустая() Тогда
		Возврат;
	КонецЕсли;

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

	ТипБизнесПроцесса = ЗадачаОбъект.БизнесПроцесс.Метаданные();
	СведенияОБизнесПроцессе = ПодключенныеБизнесПроцессы[ТипБизнесПроцесса.ПолноеИмя()];
	Если СведенияОБизнесПроцессе <> Неопределено Тогда
		БизнесПроцессы[ТипБизнесПроцесса.Имя].ПриПеренаправленииЗадачи(ЗадачаОбъект.Ссылка, НоваяЗадачаОбъект.Ссылка);
	КонецЕсли;

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

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


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

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

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

	ПараметрыБлокировки = СохраненныеПараметрыБлокировки();

	// Установлен признак необходимости принятия решения о блокировке
	// или блокировка работы с внешними ресурсами подтверждена администратором.
	Если ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Неопределено
		Или ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Истина Тогда
		Возврат Истина;
	КонецЕсли;

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

	// Ниже код с учетом того, что разделение не включено.

	ИзменилосьРазделение = ПараметрыБлокировки.РазделениеВключено <> РазделениеВключено;

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

	СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
	Если СтрокаСоединения = ПараметрыБлокировки.СтрокаСоединения Тогда
		Возврат Ложь; // Если строка соединения совпадает, то дальнейшую проверку не выполняем.
	КонецЕсли;

	ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая();

	ПеремещенаМеждуФайловымИКлиентСервернымРежимом = ЭтоФайловаяБаза <> ПараметрыБлокировки.ЭтоФайловаяБаза;

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

	// Ниже код с учетом того, что режим работы не менялся:
	// 1. была файловая осталась файловая;
	// 2. была клиент-серверная осталась клиент-серверная.

	Если ЭтоФайловаяБаза Тогда

		// Для файловой базы строка соединения может быть разной при подключении с различных компьютеров,
		// поэтому проверку перемещения базы осуществляем через файл проверки.

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

		ИзменилсяИдентификаторИнформационнойБазы = ИдентификаторФайловойБазыИзФайлаПроверки() <> ПараметрыБлокировки.ИдентификаторБазы;

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

[Assistant]
Функция УстановитьБлокировкуРаботыСВнешнимиРесурсами()

	Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
		Возврат Ложь;
	КонецЕсли;

	ПараметрыБлокировки = СохраненныеПараметрыБлокировки();

	// Установлен признак необходимости принятия решения о блокировке
	// или блокировка работы с внешними ресурсами подтверждена администратором.
	Если ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Неопределено
		Или ПараметрыБлокировки.РаботаСВнешнимиРесурсамиЗаблокирована = Истина Тогда
		Возврат Истина;
	КонецЕсли;

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

	// Ниже код с учетом того, что разделение не включено.

	ИзменилосьРазделение = ПараметрыБлокировки.РазделениеВключено <> РазделениеВключено;

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

	СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
	Если СтрокаСоединения = ПараметрыБлокировки.СтрокаСоединения Тогда
		Возврат Ложь; // Если строка соединения совпадает, то дальнейшую проверку не выполняем.
	КонецЕсли;

	ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая();

	ПеремещенаМеждуФайловымИКлиентСервернымРежимом = ЭтоФайловаяБаза <> ПараметрыБлокировки.ЭтоФайловаяБаза;

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

	// Ниже код с учетом того, что режим работы не менялся:
	// 1. была файловая осталась файловая;
	// 2. была клиент-серверная осталась клиент-серверная.

	Если ЭтоФайловаяБаза Тогда

		// Для файловой базы строка соединения может быть разной при подключении с различных компьютеров,
		// поэтому проверку перемещения базы осуществляем через файл проверки.

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

		ИзменилсяИдентификаторИнформационнойБазы = ИдентификаторФайловойБазыИзФайлаПроверки() <> ПараметрыБлокировки.ИдентификаторБазы;

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

	Иначе // Клиент-серверная база

		ИмяБазы = НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединения).Ref);
		ИмяСервераМенеджераПодключений = НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(СтрокаСоединения).Srvr);
		ИмяСервераРабочегоПроцесса = НРег(ИмяКомпьютера());

		СохраненноеИмяБазы =
			НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Ref);
		СохраненноеИмяСервераМенеджераПодключений =
			НРег(СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(ПараметрыБлокировки.СтрокаСоединения).Srvr);
		СохраненноеИмяСервераРабочегоПроцесса = НРег(ПараметрыБлокировки.ИмяКомпьютера);

		ИзменилосьИмяБазы = ИмяБазы <> СохраненноеИмяБазы;
		ИзменилосьИмяКомпьютера = ПараметрыБлокировки.ПроверятьИмяСервера
			И ИмяСервераРабочегоПроцесса <> СохраненноеИмяСервераРабочегоПроцесса
			И СтрНайти(СохраненноеИмяСервераМенеджераПодключений, ИмяСервераМенеджераПодключений) = 0;

		// В случае масштабируемого кластера СохраненноеИмяСервераМенеджераПодключений может содержать имена
		// нескольких серверов, которые могут выступать в роли менеджера подключения
		// при этом ИмяСервераМенеджераПодключений при запуске сеанса регламентного задания будет содержать имя
		// текущего активного менеджера. Чтобы обыграть эту ситуацию ищется вхождение текущего в сохраненном имени.

		Если ИзменилосьИмяБазы Или ИзменилосьИмяКомпьютера Тогда

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

			УстановитьПризнакНеобходимостиПринятияРешенияОБлокировке(ПараметрыБлокировки, ТекстСообщения);
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;

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

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

Процедура УстановитьПризнакНеобходимостиПринятияРешенияОБлокировке(ПараметрыБлокировки, ТекстСообщения)

	ЗаблокироватьДанныеПараметровБлокировки();

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

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

	ИнтеграцияПодсистемБСП.ПриЗапретеРаботыСВнешнимиРесурсами();
	БлокировкаРаботыСВнешнимиРесурсамиПереопределяемый.ПриЗапретеРаботыСВнешнимиРесурсами();

	ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,,, ТекстСообщения);

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

Функция ПредставлениеПричиныБлокировки(ПараметрыБлокировки)

	ТекущаяДата = ТекущаяДата(); // АПК:143 Информация о блокировке нужна в дате сервера.

	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Блокировка выполнена на сервере %1 %2 в %3 %4.
		           |
		           |Размещение информационной базы изменилось с
		           |%5
		           |на
		           |%6'"),
		ИмяКомпьютера(),
		Формат(ТекущаяДата, "ДЛФ=D"),
		Формат(ТекущаяДата, "ДЛФ=T"),
		ПредставлениеТекущейОперации(),
		ПредставлениеСтрокиСоединения(ПараметрыБлокировки.СтрокаСоединения),
		ПредставлениеСтрокиСоединения(СтрокаСоединенияИнформационнойБазы()));

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

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

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

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

	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'при входе пользователя %1'"),
		ИмяПользователя());

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


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

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

Процедура ПриСохраненииПользовательскихНастроекНаСервере(Форма, Настройки)
Экспорт

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

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

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

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

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

		Если ПометкаУдаления Тогда
			Если КоличествоНастроек = 0 Тогда
    // TODO: допиши оставшуюся часть

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

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

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

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

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

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

		Если ПометкаУдаления Тогда
			Если КоличествоНастроек = 0 Тогда
				Прервать;
			Иначе
				Продолжить;
			КонецЕсли;
		КонецЕсли;

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

			// Блокировка не устанавливается, т.к. пользовательские настройки разрезаются по пользователям,
			// поэтому конкурентной работы не ожидается.
			НастройкаОбъект.Записать(); // АПК:1327
		КонецЕсли;

		СписокНастроек.Удалить(ЭлементСписка);
		КоличествоНастроек = КоличествоНастроек - 1;
	КонецЦикла;

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

		// Блокировка не устанавливается, т.к. пользовательские настройки разрезаются по пользователям,
		// поэтому конкурентной работы не ожидается.
		НастройкаОбъект.Записать(); // АПК:1327
	КонецЦикла;

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

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

Функция ИспользуемыеТаблицы(Объект) Экспорт
	Таблицы = Новый Массив;

	Если ТипЗнч(Объект) = Тип("СхемаКомпоновкиДанных") Тогда
		ЗарегистрироватьТаблицыНаборовДанных(Таблицы, Объект.НаборыДанных);
	ИначеЕсли ТипЗнч(Объект) = Тип("Строка") Тогда
		ЗарегистрироватьТаблицыЗапроса(Таблицы, Объект);
	КонецЕсли;

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

// Извлекает информацию о таблицах, используемых в схеме или запросе.
//
// Параметры:
//  Отчет - ОбъектМетаданныхОтчет
//        - ОтчетОбъект
//
// Возвращаемое значение:
//   Массив из см. ИспользуемыеТаблицы
//

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

	ИспользуемыеТаблицы = ИспользуемыеТаблицы(ОтчетОбъект.СхемаКомпоновкиДанных);

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

	Возврат ИспользуемыеТаблицы;
КонецФункции

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


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

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

Функция ПодготовитьУсловиеПоискаПоСтроке(Знач Запрос, ТекстЗапроса, Знач ЕстьСтрокаПоиска, Знач ПараметрыПоиска, Знач ПравоЧтенияАвторов)
Если ЕстьСтрокаПоиска Тогда
		СтрокаПоиска = ВРег(СокрЛП(ПараметрыПоиска.СтрокаПоиска));
		СловаПоиска = ВариантыОтчетовКлиентСервер.РазложитьСтрокуПоискаВМассивСлов(СтрокаПоиска);
		ШаблоныПоиска = Новый Массив;
		Для НомерСлова = 1 По СловаПоиска.Количество() Цикл
			Слово = СловаПоиска[НомерСлова - 1];
			ИмяСлова =  "Слово" + Формат(НомерСлова, "ЧГ=");
			Запрос.УстановитьПараметр(ИмяСлова, "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Слово) + "%");
			ШаблонПоиска = СтрЗаменить("&ИмяПоляПоиска ПОДОБНО &ИмяПараметра СПЕЦСИМВОЛ ""~""", "ИмяПараметра", ИмяСлова); // @query-part-1
			ШаблоныПоиска.Добавить(ШаблонПоиска);
		КонецЦикла;
		ШаблонПоиска = СтрСоединить(ШаблоныПоиска, " ИЛИ "); // не локализуется (фрагмент текста запроса)

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

		Для Индекс = 0 По ПоляПоиска.Количество() - 1 Цикл
			ПоляПоиска[Индекс] = СтрЗаменить(ШаблонПоиска, "&ИмяПоляПоиска", ПоляПоиска[Индекс]);
		КонецЦикла;
		ВариантыИПодсистемыПоСтрокеПоиска = "(" + СтрСоединить(ПоляПоиска, " ИЛИ ") + ")"; // не локализуется (фрагмент текста запроса)
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПодготовитьУсловиеПоискаПоСтроке(Знач Запрос, ТекстЗапроса, Знач ЕстьСтрокаПоиска, Знач ПараметрыПоиска, Знач ПравоЧтенияАвторов)

	Если ЕстьСтрокаПоиска Тогда
		СтрокаПоиска = ВРег(СокрЛП(ПараметрыПоиска.СтрокаПоиска));
		СловаПоиска = ВариантыОтчетовКлиентСервер.РазложитьСтрокуПоискаВМассивСлов(СтрокаПоиска);
		ШаблоныПоиска = Новый Массив;
		Для НомерСлова = 1 По СловаПоиска.Количество() Цикл
			Слово = СловаПоиска[НомерСлова - 1];
			ИмяСлова =  "Слово" + Формат(НомерСлова, "ЧГ=");
			Запрос.УстановитьПараметр(ИмяСлова, "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(Слово) + "%");
			ШаблонПоиска = СтрЗаменить("&ИмяПоляПоиска ПОДОБНО &ИмяПараметра СПЕЦСИМВОЛ ""~""", "ИмяПараметра", ИмяСлова); // @query-part-1
			ШаблоныПоиска.Добавить(ШаблонПоиска);
		КонецЦикла;
		ШаблонПоиска = СтрСоединить(ШаблоныПоиска, " ИЛИ "); // не локализуется (фрагмент текста запроса)

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

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

		ПользовательскиеНастройкиПоСтрокеПоиска = "(" + СтрЗаменить(ШаблонПоиска, "&ИмяПоляПоиска", "Пользовательские.Наименование") + ")";
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПользовательскиеНастройкиПоСтрокеПоиска", ПользовательскиеНастройкиПоСтрокеПоиска);

	Иначе
		// Удаление отбора для поиска в данных вариантов отчетов и подсистем.
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ВариантыИПодсистемыПоСтрокеПоиска", "");
		// Удаление таблицы для поиска среди пользовательских настроек.
		НачалоВыборкиИзТаблицы = (
		"ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Пользовательские.Вариант");

		ТекстЗапроса = СокрП(Лев(ТекстЗапроса, СтрНайти(ТекстЗапроса, НачалоВыборкиИзТаблицы) - 1));
	КонецЕсли;

	Возврат СловаПоиска;

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


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

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

Функция СоздатьПисьмо(Сообщение, УчетнаяЗапись, ОтправитьСразу = Истина)
Экспорт

	РезультатОтправкиПисьма = РезультатОтправкиПисьма();

	ПисьмоHTML = (Сообщение.ДополнительныеПараметры.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML);

	НачатьТранзакцию();
	Попытка

		Письмо = Документы.ЭлектронноеПисьмоИсходящее.СоздатьДокумент();

		Письмо.Автор                    = Пользователи.ТекущийПользователь();
		Письмо.Ответственный            = Пользователи.ТекущийПользователь();
		Письмо.Дата                     = ТекущаяДатаСеанса();

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

		Если ПисьмоHTML Тогда

			Письмо.ТекстHTML = Сообщение.Текст;
			Письмо.Текст     = ПолучитьОбычныйТекстИзHTML(Сообщение.Текст);

		Иначе

			Письмо.Текст = Сообщение.Текст;

		КонецЕсли;

		Письмо.Тема = Сообщение.Тема;
		Письмо.ТипТекста = ?(ПисьмоHTML, Перечисления.ТипыТекстовЭлектронныхПисем.HTML, Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст);
		Письмо.УчетнаяЗапись = УчетнаяЗапись;
		Письмо.ВзаимодействиеОснование = Неопределено;

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

		Письмо.УведомитьОДоставке  = Макс(Сообщение.ДополнительныеПараметры.УведомитьОДоставке, Письмо.УведомитьОДоставке);
		Письмо.УведомитьОПрочтении = Макс(Сообщение.ДополнительныеПараметры.УведомитьОПрочтении, Письмо.УведомитьОПрочтении);

		Письмо.УдалятьПослеОтправки = Ложь;

		Письмо.Комментарий = Сообщение.ДополнительныеПараметры.Комментарий;

		Для Каждого ПолучательПисьма Из Сообщение.Получатели Цикл
			НоваяСтрока = Письмо["ПолучателиПисьма"].Добавить();
			НоваяСтрока.Адрес         = ПолучательПисьма.Адрес;
			НоваяСтрока.Представление = ПолучательПисьма.Представление;
			НоваяСтрока.Контакт       = ПолучательПисьма.ИсточникКонтактнойИнформации;
		КонецЦикла;

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

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

		Письмо.СписокПолучателейПисьма    = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиПисьма, Ложь);
		Письмо.СтатусПисьма = ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(),
			Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик,
			Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее);

		Письмо.ЕстьВложения = (Сообщение.Вложения.Количество() > 0);
		РазмерВложений  = 0;
		РазмерыВложений = Новый Соответствие;
		Для Каждого Вложение Из Сообщение.Вложения Цикл

			Размер = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище).Размер() * 1.5;
			РазмерВложений = РазмерВложений + Размер;
			РазмерыВложений.Вставить(Вложение.АдресВоВременномХранилище, Размер);

			// Если у идентификатора не английские символы, то письмо может быть некорректно обработано.
			Если ЗначениеЗаполнено(Вложение.Идентификатор) Тогда
				Идентификатор = СтроковыеФункции.СтрокаЛатиницей(Вложение.Идентификатор);
				Если СтрНайти(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор) > 0 Тогда
					Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор, "cid:" + Идентификатор);
				Иначе
					Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, Вложение.Идентификатор, "cid:" + Идентификатор);
				КонецЕсли;
				Вложение.Идентификатор = Идентификатор;
			КонецЕсли;

		КонецЦикла;

		Письмо.Размер = РазмерВложений + СтрДлина(Письмо.Тема) * 2
			+ ?(ПисьмоHTML, СтрДлина(Письмо.ТекстHTML), СтрДлина(Письмо.Текст)) * 2;
		Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее;

		Письмо.Записать();

		Для Каждого Вложение Из Сообщение.Вложения Цикл

			ПараметрыВложения = Новый Структура;
			ПараметрыВложения.Вставить("ИмяФайла", Вложение.Представление);
			ПараметрыВложения.Вставить("Размер", РазмерыВложений[Вложение.АдресВоВременномХранилище]);

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

				МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка,
					Вложение.АдресВоВременномХранилище, ПараметрыВложения);

			ИначеЕсли ПисьмоHTML Тогда

				ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.Идентификатор);
				МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка,
					Вложение.АдресВоВременномХранилище, ПараметрыВложения);

			КонецЕсли;

		КонецЦикла;

		Если ЗначениеЗаполнено(Сообщение.ДополнительныеПараметры.Предмет) Тогда
			Предмет = Сообщение.ДополнительныеПараметры.Предмет;
		Иначе
			Предмет = Письмо.Ссылка;
		КонецЕсли;
    // TODO: допиши оставшуюся часть

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

	РезультатОтправкиПисьма = РезультатОтправкиПисьма();

	ПисьмоHTML = (Сообщение.ДополнительныеПараметры.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML);

	НачатьТранзакцию();
	Попытка

		Письмо = Документы.ЭлектронноеПисьмоИсходящее.СоздатьДокумент();

		Письмо.Автор                    = Пользователи.ТекущийПользователь();
		Письмо.Ответственный            = Пользователи.ТекущийПользователь();
		Письмо.Дата                     = ТекущаяДатаСеанса();

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

		Если ПисьмоHTML Тогда

			Письмо.ТекстHTML = Сообщение.Текст;
			Письмо.Текст     = ПолучитьОбычныйТекстИзHTML(Сообщение.Текст);

		Иначе

			Письмо.Текст = Сообщение.Текст;

		КонецЕсли;

		Письмо.Тема = Сообщение.Тема;
		Письмо.ТипТекста = ?(ПисьмоHTML, Перечисления.ТипыТекстовЭлектронныхПисем.HTML, Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст);
		Письмо.УчетнаяЗапись = УчетнаяЗапись;
		Письмо.ВзаимодействиеОснование = Неопределено;

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

		Письмо.УведомитьОДоставке  = Макс(Сообщение.ДополнительныеПараметры.УведомитьОДоставке, Письмо.УведомитьОДоставке);
		Письмо.УведомитьОПрочтении = Макс(Сообщение.ДополнительныеПараметры.УведомитьОПрочтении, Письмо.УведомитьОПрочтении);

		Письмо.УдалятьПослеОтправки = Ложь;

		Письмо.Комментарий = Сообщение.ДополнительныеПараметры.Комментарий;

		Для Каждого ПолучательПисьма Из Сообщение.Получатели Цикл
			НоваяСтрока = Письмо["ПолучателиПисьма"].Добавить();
			НоваяСтрока.Адрес         = ПолучательПисьма.Адрес;
			НоваяСтрока.Представление = ПолучательПисьма.Представление;
			НоваяСтрока.Контакт       = ПолучательПисьма.ИсточникКонтактнойИнформации;
		КонецЦикла;

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

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

		Письмо.СписокПолучателейПисьма    = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиПисьма, Ложь);
		Письмо.СтатусПисьма = ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(),
			Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик,
			Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее);

		Письмо.ЕстьВложения = (Сообщение.Вложения.Количество() > 0);
		РазмерВложений  = 0;
		РазмерыВложений = Новый Соответствие;
		Для Каждого Вложение Из Сообщение.Вложения Цикл

			Размер = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище).Размер() * 1.5;
			РазмерВложений = РазмерВложений + Размер;
			РазмерыВложений.Вставить(Вложение.АдресВоВременномХранилище, Размер);

			// Если у идентификатора не английские символы, то письмо может быть некорректно обработано.
			Если ЗначениеЗаполнено(Вложение.Идентификатор) Тогда
				Идентификатор = СтроковыеФункции.СтрокаЛатиницей(Вложение.Идентификатор);
				Если СтрНайти(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор) > 0 Тогда
					Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор, "cid:" + Идентификатор);
				Иначе
					Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, Вложение.Идентификатор, "cid:" + Идентификатор);
				КонецЕсли;
				Вложение.Идентификатор = Идентификатор;
			КонецЕсли;

		КонецЦикла;

		Письмо.Размер = РазмерВложений + СтрДлина(Письмо.Тема) * 2
			+ ?(ПисьмоHTML, СтрДлина(Письмо.ТекстHTML), СтрДлина(Письмо.Текст)) * 2;
		Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее;

		Письмо.Записать();

		Для Каждого Вложение Из Сообщение.Вложения Цикл

			ПараметрыВложения = Новый Структура;
			ПараметрыВложения.Вставить("ИмяФайла", Вложение.Представление);
			ПараметрыВложения.Вставить("Размер", РазмерыВложений[Вложение.АдресВоВременномХранилище]);

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

				МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка,
					Вложение.АдресВоВременномХранилище, ПараметрыВложения);

			ИначеЕсли ПисьмоHTML Тогда

				ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.Идентификатор);
				МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка,
					Вложение.АдресВоВременномХранилище, ПараметрыВложения);

			КонецЕсли;

		КонецЦикла;

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

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

		РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаписатьПредметыПапкиВзаимодействий(Письмо.Ссылка, Реквизиты);

		ЗафиксироватьТранзакцию();

	Исключение

		ОтменитьТранзакцию();
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ШаблонТекстаСообщения = НСтр("ru = 'Не удалось сформировать письмо по причине:
			|%1'");

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

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

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

	РезультатОтправкиПисьма.СсылкаНаПисьмо = Письмо.Ссылка;

	Если Не ОтправитьСразу Тогда
		Возврат РезультатОтправкиПисьма;
	КонецЕсли;

	Попытка
		РезультатОтправки = ВыполнитьОтправкуПисьма(Письмо);
		ИдентификаторПисьма =  РезультатОтправки.ИдентификаторПисьмаSMTP;
		РезультатОтправкиПисьма.ОшибочныеПолучатели = РезультатОтправки.ОшибочныеПолучатели;
		РезультатОтправкиПисьма.ИдентификаторПисьма = ИдентификаторПисьма;
	Исключение

		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ШаблонТекстаСообщения = НСтр("ru = 'Не удалось отправить письмо по причине:
				|%1'");

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

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

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

	Если Не Письмо.УдалятьПослеОтправки Тогда

		Попытка

			ИдентификаторСообщенияОтправкаIMAP = Письмо.ИдентификаторСообщенияОтправкаIMAP;

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

			УстановитьПапкуЭлектронногоПисьма(Письмо.Ссылка, ОпределитьПапкуДляПисьма(Письмо.Ссылка));
		Исключение

			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ШаблонТекстаСообщения = НСтр("ru = 'Не удалось сохранить письмо в программе после успешной отправки по причине:
				|%1'");

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

			РезультатОтправкиПисьма.Отправлено     = Ложь;
			РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			Возврат РезультатОтправкиПисьма;

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

	Иначе

		Письмо.Прочитать();
		Письмо.Удалить();

	КонецЕсли;

	РезультатОтправкиПисьма.Отправлено = Истина;
	Возврат РезультатОтправкиПисьма;

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

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


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

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

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

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

	ИмяТаблицы = Контакт.Метаданные().Имя;
	ИмяПоляДляНаименованияВладельца = Взаимодействия.ИмяПоляДляНаименованияВладельца(ИмяТаблицы);

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

	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицы", "Справочник." + ИмяТаблицы);
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяНаименованияВладельца", ИмяПоляДляНаименованияВладельца);

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

	Представление = Выборка.Наименование;

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

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

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

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

// Параметры:
//  Контакт - ЛюбаяСсылка - контакт, для которого получаются данные.
//
// Возвращаемое значение:
//  Структура - содержит наименование контакта и список значений электронной почты контакта.
//

Функция НаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт) Экспорт

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

	МетаданныеКонтакта = Контакт.Метаданные();

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

	МассивОписанияТиповКонтактов = ВзаимодействияКлиентСервер.ОписанияКонтактов();
	ЭлементМассиваОписания = Неопределено;
	Для Каждого ЭлементМассива Из МассивОписанияТиповКонтактов Цикл

		Если ЭлементМассива.Имя = МетаданныеКонтакта.Имя Тогда
			ЭлементМассиваОписания = ЭлементМассива;
			Прервать;
		КонецЕсли;

	КонецЦикла;

	Если ЭлементМассиваОписания = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	ИмяТаблицы = МетаданныеКонтакта.ПолноеИмя();

	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
	|	ЕСТЬNULL(ТаблицаКонтактнаяИнформация.АдресЭП,"""") КАК АдресЭП,
	|	СправочникКонтакт." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта + " КАК Наименование
	|ИЗ
	|	" + ИмяТаблицы + " КАК СправочникКонтакт
	|		ЛЕВОЕ СОЕДИНЕНИЕ " + ИмяТаблицы + ".КонтактнаяИнформация КАК ТаблицаКонтактнаяИнформация
	|		ПО (ТаблицаКонтактнаяИнформация.Ссылка = СправочникКонтакт.Ссылка)
	|			И (ТаблицаКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты))
	|ГДЕ
	|	СправочникКонтакт.Ссылка = &Контакт
	|ИТОГИ ПО
	|	Наименование";

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

	Если Не Выборка.Следующий() Тогда
		Возврат Неопределено;
	КонецЕсли;

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

	Возврат Адреса;

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

// Параметры:
//  Контакт - ОпределяемыйТип.КонтактВзаимодействия - контакт, для которого получаются данные.
//
// Возвращаемое значение:
//  Массив из Структура - массив структур содержащих адреса, виды и представления адресов.
//

Функция ПолучитьАдресаЭлектроннойПочтыКонтакта(Контакт, ВключатьНезаполненныеВиды = Ложь) Экспорт

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

	Запрос = Новый Запрос;
	ИмяМетаданныхКонтакта = Контакт.Метаданные().Имя;

	Если ВключатьНезаполненныеВиды Тогда

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

		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицыСправочника", "Справочник." + ИмяМетаданныхКонтакта);
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "Справочник.Пользователи.КонтактнаяИнформация", "Справочник." + ИмяМетаданныхКонтакта + ".КонтактнаяИнформация");

		ГруппаВидаКонтактнойИнформации = УправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("Справочник" + ИмяМетаданныхКонтакта);
		Запрос.УстановитьПараметр("ГруппаВидаКонтактнойИнформации", ГруппаВидаКонтактнойИнформации);

	Иначе

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

		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицыКонтактнойИнформации", "Справочник." + ИмяМетаданныхКонтакта + ".КонтактнаяИнформация");

	КонецЕсли;

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

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

	Результат = Новый Массив;
	Пока Выборка.Следующий() Цикл
		Адрес = Новый Структура;
		Адрес.Вставить("АдресЭП",         Выборка.АдресЭП);
		Адрес.Вставить("Вид",             Выборка.Вид);
		Адрес.Вставить("Представление",   Выборка.Представление);
		Адрес.Вставить("ВидНаименование", Выборка.ВидНаименование);
		Результат.Добавить(Адрес);
	КонецЦикла;

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

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

// Параметры:
//  УникальныйИдентификатор - УникальныйИдентификатор - идентификатор фонового задания.
//
// Возвращаемое значение:
//   см. ДлительныеОперации.ВыполнитьВФоне
//

[Assistant] Процедура ПредставлениеИВсяКонтактнаяИнформациюКонтакта(Контакт, Представление, СтрокаКИ,ТипКонтактнойИнформации = Неопределено)


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

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

Процедура ИмяФункции(ДанныеВнешнихКомпонент, АдресРезультата = Неопределено) Экспорт

	РезультатВыполнения = Новый Структура;
	РезультатВыполнения.Вставить("Результат", Ложь);
	РезультатВыполнения.Вставить("Ошибки", Новый Соответствие);
	РезультатВыполнения.Вставить("Успех", Новый Соответствие);

	Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент") Тогда

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

		Запрос.УстановитьПараметр("Идентификаторы", ДанныеВнешнихКомпонент.ВыгрузитьКолонку("Идентификатор"));

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

		ИспользуемыеВнешниеКомпоненты = Неопределено;

		// Обход результата запроса.
		Для каждого СтрокаРезультата Из ДанныеВнешнихКомпонент Цикл

			ПредставлениеКомпоненты = ВнешниеКомпонентыСлужебный.ПредставлениеКомпоненты(
				СтрокаРезультата.Идентификатор, СтрокаРезультата.Версия);

			КодОшибки = СтрокаРезультата.КодОшибки;

			Если ЗначениеЗаполнено(КодОшибки) Тогда

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

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

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

				РезультатВыполнения.Ошибки.Вставить(СтрокаРезультата.Идентификатор, ТекстОшибки);

				ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", ОбщегоНазначения.КодОсновногоЯзыка()),
					УровеньЖурналаРегистрации.Ошибка,,,	ТекстОшибки);

				Продолжить;
			КонецЕсли;

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

			Если Не Информация.Разобрано Тогда

				РезультатВыполнения.Ошибки.Вставить(СтрокаРезультата.Идентификатор, ПредставлениеКомпоненты + " - "
					+ Информация.ОписаниеОшибки + ?(Информация.ИнформацияОбОшибке = Неопределено, "", ": "
					+ ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация.ИнформацияОбОшибке)));

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

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

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

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

			НачатьТранзакцию();
			Попытка

				Блокировка = Новый БлокировкаДанных;
				ЭлементБлокировки = Блокировка.Добавить("Справочник.ВнешниеКомпоненты");
				Если СсылкаНаОбъект <> Неопределено Тогда
					ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаНаОбъект);
				КонецЕсли;
				Блокировка.Заблокировать();

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

				ЗаполнитьЗначенияСвойств(Объект, Информация.Реквизиты); // По данным манифеста.
				ЗаполнитьЗначенияСвойств(Объект, СтрокаРезультата);     // По данным с сайта.

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

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

				Объект.Записать();

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

				ЗафиксироватьТранзакцию();
			Исключение
				ОтменитьТранзакцию();

				РезультатВыполнения.Ошибки.Вставить(СтрокаРезультата.Идентификатор, ПредставлениеКомпоненты
					+ " - " + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));

				ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
						ОбщегоНазначения.КодОсновногоЯзыка()),
					УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			КонецПопытки;

		КонецЦикла;

		РезультатВыполнения.Результат = РезультатВыполнения.Ошибки.Количество() = 0;

		Если ЗначениеЗаполнено(АдресРезультата) Тогда
			ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресРезультата);
		КонецЕсли;

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

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

// Возвращаемое значение:
//  Структура:
//      * Идентификатор - Строка
//      * Версия - Строка
//      * ДатаВерсии - Дата
//      * Наименование - Строка
//      * ИмяФайла - Строка
//      * ПутьКФайлу - Строка
//

Функция ОписаниеПоставляемойОбщейКомпоненты() Экспорт

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

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

// Выполняет обновление общих внешних компонент.
//
// Параметры:
//  ОписаниеКомпоненты - см. ОписаниеПоставляемойОбщейКомпоненты.
//

[Assistant] Процедура ОбновитьВнешниеКомпоненты(ДанныеВнешнихКомпонент, АдресРезультата = Неопределено)


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

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

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

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

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

// Для версий БИП старше 2.7.2.0 следует использовать ИспользуемыеКомпоненты("ДляОбновления").
// Возвращает таблицу описаний внешних компонент, которые требуется обновлять автоматически с Портала 1С:ИТС.
//
// Возвращаемое значение:
//   см. ПолучениеВнешнихКомпонент.ОписаниеВнешнихКомпонент
//

Функция АвтоматическиОбновляемыеКомпоненты() Экспорт

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

	МодульПолучениеВнешнихКомпонент = ОбщегоНазначения.ОбщийМодуль("ПолучениеВнешнихКомпонент");
	ОписаниеВнешнихКомпонент = МодульПолучениеВнешнихКомпонент.ОписаниеВнешнихКомпонент();

	ДанныеВнешнихКомпонент = ВнешниеКомпонентыСлужебный.ДанныеВнешнихКомпонент("ДляОбновления");

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

	Возврат ОписаниеВнешнихКомпонент;

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

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

// Конец ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент

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

[Assistant] Процедура ОбновитьОбщуюКомпоненту(ОписаниеКомпоненты)