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

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

Процедура ИмяФункции(Форма, Объект = Неопределено) Экспорт

	Если Объект = Неопределено Тогда
		ОписаниеОбъекта = Форма.Объект;
	Иначе
		ОписаниеОбъекта = Объект;
	КонецЕсли;

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

	ОткрытьФорму("ОбщаяФорма.РедактированиеМеток", ПараметрыФормы, Форма, Форма,,,,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

// Устанавливает отбор в списке по метке.
//
// Параметры:
//  Форма      - ФормаКлиентскогоПриложения     - обрабатываемая форма.
//  ИмяКоманды - Строка - имя команды установки отбора по метке.
//

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

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

	ИмяМетки = СтрЗаменить(ИмяКоманды, "ОтборМетка_", "");
	ОписаниеЛегендыМеток = Форма.Свойства_ОписаниеЛегендыМеток;
	МеткиЛегенды = ОписаниеЛегендыМеток.НайтиСтроки(Новый Структура("ИмяМетки", ИмяМетки));

	Если МеткиЛегенды.Количество() = 0 Тогда
		Возврат;
	Иначе
		ОтобраннаяМетка = МеткиЛегенды[0];
	КонецЕсли;

	Если ГруппаОтбора = Неопределено Тогда
		ОтобранныеМетки = Новый Массив;
		ОтобранныеМетки.Добавить(ОтобраннаяМетка.Метка);
	Иначе
		ОтобранныеМетки = ГруппаОтбора.ПравоеЗначение;
		ИндексМетки = ОтобранныеМетки.Найти(ОтобраннаяМетка.Метка);
		Если ИндексМетки <> Неопределено Тогда
			ОтобранныеМетки.Удалить(ИндексМетки);
			ОтобраннаяМетка.ОтборПоМетке = Ложь;
		Иначе
			ОтобранныеМетки.Добавить(ОтобраннаяМетка.Метка);
			ОтобраннаяМетка.ОтборПоМетке = Истина;
		КонецЕсли;
	КонецЕсли;

	Если ОтобранныеМетки.Количество() = 0 Тогда
		ГруппаОтбора.Использование = Ложь;
		Возврат;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

// Открывает форму редактирования набора дополнительных реквизитов.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма, из которой осуществляется вызов метода.
//

Процедура РедактироватьСоставСвойств(Форма)

	Наборы = Форма.Свойства_НаборыДополнительныхРеквизитовОбъекта;

	Если Наборы.Количество() = 0
	 ИЛИ НЕ ЗначениеЗаполнено(Наборы[0].Значение) Тогда

		ПоказатьПредупреждение(,
			НСтр("ru = 'Не удалось получить наборы дополнительных реквизитов объекта.
			           |
			           |Возможно у объекта не заполнены необходимые реквизиты.'"));

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

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

		ПараметрыПерехода = Новый Структура;
		ПараметрыПерехода.Вставить("Набор", Наборы[0].Значение);
		ПараметрыПерехода.Вставить("Свойство", Неопределено);
		ПараметрыПерехода.Вставить("ЭтоДополнительноеСведение", Ложь);
		ПараметрыПерехода.Вставить("ВидСвойств",
			ПредопределенноеЗначение("Перечисление.ВидыСвойств.ДополнительныеРеквизиты"));

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

			ИдентификаторНабора   = СтрЗаменить(Сред(Форма.ТекущийЭлемент.Имя, ДлинаНачала +  1, 36), "x","-");
			ИдентификаторСвойства = СтрЗаменить(Сред(Форма.ТекущийЭлемент.Имя, ДлинаНачала + 38, 36), "x","-");

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

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

		Оповестить("Переход_НаборыДополнительныхРеквизитовИСведений", ПараметрыПерехода);
	КонецЕсли;

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

[Assistant] Процедура РедактироватьМетки(Форма, Объект = Неопределено)


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

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

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

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

	ОписаниеРеквизитов = Форма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(ПараметрыОтбора);
	Если ОписаниеРеквизитов.Количество() <> 1 Тогда
		Возврат;
	КонецЕсли;
	ОписаниеРеквизита = ОписаниеРеквизитов[0];

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

				Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив);
			КонецЕсли;
		КонецЕсли;

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

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

Процедура РедактироватьГиперссылкуРеквизитаЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если ТипЗнч(Результат) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;

	Форма = ДополнительныеПараметры;
	Форма[Результат.ИмяРеквизита] = Результат.Значение;
	Если Результат.СтрокаСсылочногоТипа Тогда
		Форма[Результат.ИмяРеквизитаСсылки] = Результат.ФорматированнаяСтрока;
	КонецЕсли;
	Форма.Модифицированность = Истина;
КонецПроцедуры

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

[Assistant] Процедура РедактироватьГиперссылкуРеквизита(Форма, ПереходПоГиперссылке = Ложь, Элемент = Неопределено)


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

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

Процедура ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст)
Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ПоказатьПредупреждение(, ОписаниеОшибки);
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ОткрытьФайлВПрограммеПросмотраОповеститьОбОшибке(ОписаниеОшибки, Контекст)

	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ПоказатьПредупреждение(, ОписаниеОшибки);
	КонецЕсли;

	ПриложениеЗапущено = Ложь;
	ВыполнитьОбработкуОповещения(Контекст.Оповещение, ПриложениеЗапущено);

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

// Параметры:
//  Расширение - Строка - свойство Расширение объекта Файл.
//

Функция ЭтоРасширениеИсполняемогоФайла(Знач Расширение)

	Расширение = ВРег(Расширение);

	// Windows
	Возврат Расширение = ".BAT" // Batch File
		Или Расширение = ".BIN" // Binary Executable
		Или Расширение = ".CMD" // Command Script
		Или Расширение = ".COM" // Приложение MS-DOS
		Или Расширение = ".CPL" // Control Panel Extension
		Или Расширение = ".EXE" // Исполняемый файл
		Или Расширение = ".GADGET" // Binary Executable
		Или Расширение = ".HTA" // HTML Application
		Или Расширение = ".INF1" // Setup Information File
		Или Расширение = ".INS" // Internet Communication Settings
		Или Расширение = ".INX" // InstallShield Compiled Script
		Или Расширение = ".ISU" // InstallShield Uninstaller Script
		Или Расширение = ".JOB" // Windows Task Scheduler Job File
		Или Расширение = ".LNK" // File Shortcut
		Или Расширение = ".MSC" // Microsoft Common Console Document
		Или Расширение = ".MSI" // Windows Installer Package
		Или Расширение = ".MSP" // Windows Installer Patch
		Или Расширение = ".MST" // Windows Installer Setup Transform File
		Или Расширение = ".OTM" // Макрос Microsoft Outlook
		Или Расширение = ".PAF" // Portable Application Installer File
		Или Расширение = ".PIF" // Program Information File
		Или Расширение = ".PS1" // Windows PowerShell Cmdlet
		Или Расширение = ".REG" // Registry Data File
		Или Расширение = ".RGS" // Registry Script
		Или Расширение = ".SCT" // Windows Scriptlet
		Или Расширение = ".SHB" // Windows Document Shortcut
		Или Расширение = ".SHS" // Shell Scrap Object
		Или Расширение = ".U3P" // U3 Smart Application
		Или Расширение = ".VB"  // VBScript File
		Или Расширение = ".VBE" // VBScript Encoded Script
		Или Расширение = ".VBS" // VBScript File
		Или Расширение = ".VBSCRIPT" // Visual Basic Script
		Или Расширение = ".WS"  // Windows Script
		Или Расширение = ".WSF" // Windows Script
	// Linux
		Или Расширение = ".CSH" // C Shell Script
		Или Расширение = ".KSH" // Unix Korn Shell Script
		Или Расширение = ".OUT" // Исполняемый файл
		Или Расширение = ".RUN" // Исполняемый файл
		Или Расширение = ".SH"  // Shell Script
	// macOS
		Или Расширение = ".ACTION" // Automator Action
		Или Расширение = ".APP" // Исполняемый файл
		Или Расширение = ".COMMAND" // Terminal Command
		Или Расширение = ".OSX" // Исполняемый файл
		Или Расширение = ".WORKFLOW" // Automator Workflow
	// Прочие
		Или Расширение = ".AIR" // Установочный пакет Adobe AIR
		Или Расширение = ".COFFIE" // Сценарий CoffeeScript (JavaScript)
		Или Расширение = ".JAR" // Архив Java
		Или Расширение = ".JS"  // JScript File
		Или Расширение = ".JSE" // JScript Encoded File
		Или Расширение = ".PLX" // Исполняемый файл Perl
		Или Расширение = ".PYC" // Компилированный файл Python
		Или Расширение = ".PYO"; // Оптимизированный код Python

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

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

#Область ОткрытьПроводник

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.

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

	ФайлИнфо = Контекст.ФайлИнфо;

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

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.

Процедура ОткрытьПроводникПослеПроверкиСуществования(Существует, Контекст) Экспорт

	ФайлИнфо = Контекст.ФайлИнфо;

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

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.

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

	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией

	ФайлИнфо = Контекст.ФайлИнфо;

	Оповещение = Новый ОписаниеОповещения(,,, "ОткрытьПроводникПриОбработкеОшибки", ЭтотОбъект);
	Если ЭтоФайл Тогда
		Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда
			НачатьЗапускПриложения(Оповещение, "explorer.exe /select, """ + ФайлИнфо.ПолноеИмя + """");
		Иначе // Это Linux или macOS.
			НачатьЗапускПриложения(Оповещение, "file:///" + ФайлИнфо.Путь);
		КонецЕсли;
	Иначе // Это каталог.
		НачатьЗапускПриложения(Оповещение, "file:///" + ФайлИнфо.ПолноеИмя);
	КонецЕсли;

	// АПК:534-вкл

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.

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

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

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьПроводник.

Процедура ОткрытьПроводникОповеститьОбОшибке(ОписаниеОшибки, Контекст)

	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		ПоказатьПредупреждение(, ОписаниеОшибки);
	КонецЕсли;

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

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

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.

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

	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией

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

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

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

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

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

	// АПК:534-вкл

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.

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

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

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

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.

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

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

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

// Продолжение процедуры ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку.


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

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

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

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

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

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

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

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

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

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

	// Извлекаем из шаблона параметры
	ПараметрыТекстаСообщения = ПараметрыИзТекстаСообщения(ПараметрыШаблона);

	// Заполняем параметры
	Сообщение = ЗаполнитьПараметрыСообщения(ПараметрыШаблона, ПараметрыТекстаСообщения, ПараметрыОтправки);
	Сообщение.ДополнительныеПараметры = ПараметрыОтправки.ДополнительныеПараметры;

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

	ШаблоныСообщенийПереопределяемый.ПриФормированииСообщения(Сообщение, ПараметрыШаблона.ПолноеИмяТипаНазначения, ПараметрыОтправки.Предмет, ПараметрыШаблона);
	Если МенеджерОбъекта <> Неопределено Тогда
		МенеджерОбъекта.ПриФормированииСообщения(Сообщение, ПараметрыОтправки.Предмет, ПараметрыШаблона);
	КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Функция СформироватьСообщение(ПараметрыОтправки) Экспорт

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

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

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

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

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

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

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

	// Извлекаем из шаблона параметры
	ПараметрыТекстаСообщения = ПараметрыИзТекстаСообщения(ПараметрыШаблона);

	// Заполняем параметры
	Сообщение = ЗаполнитьПараметрыСообщения(ПараметрыШаблона, ПараметрыТекстаСообщения, ПараметрыОтправки);
	Сообщение.ДополнительныеПараметры = ПараметрыОтправки.ДополнительныеПараметры;

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

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

	// Заполнение значений параметров
	СообщениеРезультат = УстановитьЗначенияРеквизитовВТекстСообщения(ПараметрыШаблона, ПараметрыТекстаСообщения, ПараметрыОтправки.Предмет);

	СформированноеСообщение.Тема  = СообщениеРезультат.Тема;
	СформированноеСообщение.Текст = СообщениеРезультат.Текст;

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

	Если ПараметрыШаблона.ДобавлятьПрисоединенныеФайлы Тогда

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

				НовоеВложение = СформированноеСообщение.Вложения.Добавить();
				НовоеВложение.АдресВоВременномХранилище = ДанныеФайла.СсылкаНаДвоичныеДанныеФайла;
				НовоеВложение.Представление =?(ПараметрыШаблона.ТранслитерироватьИменаФайлов,
					 СтроковыеФункции.СтрокаЛатиницей(ДанныеФайла.ИмяФайла), ДанныеФайла.ИмяФайла);

			КонецЦикла;

		КонецЕсли;

	КонецЕсли;

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

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

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

	Возврат СформированноеСообщение;

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

// Сформировать сообщение и сразу отправить.
//
// Параметры:
//   ПараметрыОтправки - Структура:
//   * ДополнительныеПараметры - Структура
//
// Возвращаемое значение:
//    см. РезультатОтправкиПисьма
//


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

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

Процедура СкрываемыеСтандартныеРеквизиты(Массив)
ДобавитьВМассивУникальноеЗначение(Массив, "ПометкаУдаления");
	ДобавитьВМассивУникальноеЗначение(Массив, "Проведен");
	ДобавитьВМассивУникальноеЗначение(Массив, "Ссылка");
	ДобавитьВМассивУникальноеЗначение(Массив, "Предопределенный");
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура СкрываемыеСтандартныеРеквизиты(Массив)

	ДобавитьВМассивУникальноеЗначение(Массив, "ПометкаУдаления");
	ДобавитьВМассивУникальноеЗначение(Массив, "Проведен");
	ДобавитьВМассивУникальноеЗначение(Массив, "Ссылка");
	ДобавитьВМассивУникальноеЗначение(Массив, "Предопределенный");
	ДобавитьВМассивУникальноеЗначение(Массив, "ИмяПредопределенныхДанных");
	ДобавитьВМассивУникальноеЗначение(Массив, "ЭтоГруппа");
	ДобавитьВМассивУникальноеЗначение(Массив, "Родитель");
	ДобавитьВМассивУникальноеЗначение(Массив, "Владелец");

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

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

// Печатные формы и вложения

Процедура ОпределитьСписокПечатныхФорм(МетаданныеОбъект, Знач ПараметрыШаблона, ИмяПараметра = "")

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

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

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

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

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

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

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

Функция ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Владелец, Сведения, ИмяФайла, Размер, КоличествоПустыхИменВоВложениях = 0) Экспорт

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

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

			ИмяБезРасширения = НСтр("ru = 'Вложение без имени'") + ?(КоличествоПустыхИменВоВложениях = 0, ""," " + Строка(КоличествоПустыхИменВоВложениях + 1));
			КоличествоПустыхИменВоВложениях = КоличествоПустыхИменВоВложениях + 1;

		Иначе
			ИмяБезРасширения =  ?(РасширениеБезТочки = "", ИмяБезРасширения, Лев(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - СтрДлина(РасширениеБезТочки) - 1));
		КонецЕсли;

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

	КонецЕсли;

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

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

// Процедура - Добавить вложение печатную форму
//
// Параметры:
//  ПараметрыОтправки
//  СведенияОШаблоне
//  Вложения
//  ПараметрыШаблоны
//


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

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

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

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

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

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

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

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


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

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

Процедура ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст)
Экспорт

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

	ТекстОшибки = ?(ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке"),
		ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке));

	Если Контекст.Свойство("ДанныеПодписи") Тогда
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт

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

	ТекстОшибки = ?(ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке"),
		ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Строка(ИнформацияОбОшибке));

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

	ПроверитьПодписьДобавитьСвойстваПодписиВРезультат(Подпись, ТекстОшибки, Контекст)

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

// Продолжение процедуры ПроверитьПодпись.
Асинх Процедура ПроверитьПодписьНаКлиентеПослеПроверкиПодписи(Сертификат, Контекст) Экспорт

	ОшибкаПроверкиПодписи = "";
	Если ТипЗнч(Контекст.МенеджерКриптографии) = Тип("МенеджерКриптографии") Тогда

		СвойстваСертификата = Неопределено;
		Если ЭлектроннаяПодписьКлиент.ОбщиеНастройки().ДоступнаУсовершенствованнаяПодпись Тогда
			СвойстваПодписи = Ждать СвойстваПодписиЧтениеМенеджеромКриптографии(Контекст.ДанныеПодписи, Контекст.МенеджерКриптографии, Ложь);

			Если СвойстваПодписи.ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.ОбычнаяCMS")
				И СвойстваПодписи.ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES") Тогда
				// Проверка дополнительных атрибутов.
				Попытка
					Ждать Контекст.МенеджерКриптографии.ПроверитьПодписьАсинх(
						Контекст.ИсходныеДанные, Контекст.ДанныеПодписи, Истина);
				Исключение
					ОшибкаПроверкиПодписи = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
				КонецПопытки;
			КонецЕсли;

		Иначе
			СвойстваПодписи = Ждать СвойстваПодписиИзДвоичныхДанных(Контекст.ДанныеПодписи, Ложь);
			СвойстваСертификата = Ждать СвойстваСертификата(Сертификат);
			СвойстваПодписи.Отпечаток = СвойстваСертификата.Отпечаток;
			СвойстваПодписи.КомуВыданСертификат = СвойстваСертификата.КомуВыдан;
		КонецЕсли;

		Если ТипЗнч(Контекст.РезультатПроверки) = Тип("Структура") Тогда
			ЗаполнитьЗначенияСвойств(Контекст.РезультатПроверки, СвойстваПодписи);
			Контекст.РезультатПроверки.Сертификат = Ждать Сертификат.ВыгрузитьАсинх();
		КонецЕсли;

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

		СистемнаяИнформация = Новый СистемнаяИнформация;
		Если СвойстваПодписи.ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.ОбычнаяCMS")
			И СвойстваПодписи.ТипПодписи <> ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES")
			И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.24.0") >= 0 Тогда
			// Были проверены дополнительные атрибуты подписи, нужна только дополнительная проверка сертификата.
			Контекст.Вставить("Сертификат", Сертификат);
			ДатаПодписания = ЭлектроннаяПодписьСлужебныйКлиентСервер.ДатаДляПроверкиСертификатаПодписи(СвойстваПодписи);
			Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда
				ДатаПодписания = Контекст.НаДату;
			КонецЕсли;
			ПроверитьСертификатПодписиДополнительно(Контекст, ДатаПодписания, СвойстваСертификата);
			Возврат;
		КонецЕсли;

	Иначе // после проверки в облачных сервисах.

		СвойстваПодписи = Ждать СвойстваПодписиИзДвоичныхДанных(Контекст.ДанныеПодписи, Истина);

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

		Сертификат = СвойстваПодписи.Сертификат;

		Если ТипЗнч(Контекст.РезультатПроверки) = Тип("Структура") Тогда
			ЗаполнитьЗначенияСвойств(Контекст.РезультатПроверки, СвойстваПодписи);
			Контекст.РезультатПроверки.Сертификат = Сертификат;
		КонецЕсли;

	КонецЕсли;

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

	Контекст.Вставить("Сертификат", Сертификат);

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

	ДополнительныеПараметры = ДополнительныеПараметрыПроверкиСертификата();
	ДополнительныеПараметры.ДляПроверкиПодписи = Истина;

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

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

Асинх Процедура ПроверитьСертификатПодписиДополнительно(Контекст, ДатаПодписания, СвойстваСертификата)

	РезультатПроверкиУдостоверяющегоЦентраСертификата = Ждать РезультатПроверкиУдостоверяющегоЦентраСертификата(
		Контекст.Сертификат, ДатаПодписания, Истина, СвойстваСертификата);

	Если Не РезультатПроверкиУдостоверяющегоЦентраСертификата.Действует Тогда

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

		Если ПользовательскиеНастройкиСертификата.ПодписаниеРазрешено <> Истина Тогда

			ВыполнитьОбработкуОповещения(Контекст.Оповещение, РезультатПроверкиПодписи(
				РезультатПроверкиУдостоверяющегоЦентраСертификата.Предупреждение.ТекстОшибки,
				Контекст.РезультатПроверки));
			Возврат;

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

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

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


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

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

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

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

[Assistant]
Функция ДополнительныеПараметрыПроверкиСертификата() Экспорт

	Структура = Новый Структура;
	Структура.Вставить("ПоказатьОшибку", Истина);
	Структура.Вставить("ОбъединитьОшибкиДанныхСертификата", Истина);
	Структура.Вставить("ПроверитьВСервисеПослеОшибки", Истина);
	Структура.Вставить("ВыполнятьПроверкуУдостоверяющегоЦентра", Истина);
	Структура.Вставить("ДляПроверкиПодписи", Ложь);

	Возврат Структура;

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

// Продолжение процедуры ПроверитьСертификат.

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

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

	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ВыполнятьПроверкуУдостоверяющегоЦентра", Контекст.ВыполнятьПроверкуУдостоверяющегоЦентра);
	ДополнительныеПараметры.Вставить("ДляПроверкиПодписи", Контекст.ДляПроверкиПодписи);
	ДополнительныеПараметры.Вставить("Предупреждение");
	ДополнительныеПараметры.Вставить("Сертификат");

	Если ЭлектроннаяПодписьСлужебныйВызовСервера.ПроверитьСертификат(АдресСертификата,
		Контекст.ОписаниеОшибкиНаСервере, Контекст.НаДату, ДополнительныеПараметры) Тогда

		Если ЗначениеЗаполнено(ДополнительныеПараметры.Предупреждение) И Не Контекст.ДляПроверкиПодписи
			И ДополнительныеПараметры.Сертификат <> Неопределено Тогда

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

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

		КонецЕсли;

		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
	Иначе
		ПроверитьСертификатНаКлиенте(Контекст);
	КонецЕсли;

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

// Продолжение процедуры ПроверитьСертификат.

Процедура ПроверитьСертификатНаКлиенте(Контекст)

	Контекст.ТребуетПроверкиНаКлиенте = Ложь;

	СертификатДляПроверки = Контекст.Сертификат;

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

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

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

	Иначе
		ПроверитьСертификатПослеИнициализацииСертификата(СертификатДляПроверки, Контекст)
	КонецЕсли;

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

// Продолжение процедуры ПроверитьСертификат.

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

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

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

// Продолжение процедуры ПроверитьСертификат.

Процедура ПроверитьСертификатПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт

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

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

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

// Продолжение процедуры ПроверитьСертификат.

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

	Контекст.Вставить("ДанныеСертификата", ДанныеСертификата);
	Контекст.Вставить("АлгоритмПодписи",
		ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДанныеСертификата));

	ПродолжитьПроверкуСертификатаНаКлиенте(Контекст);

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

// Продолжение процедуры ПроверитьСертификат.

Процедура ПродолжитьПроверкуСертификатаНаКлиенте(Контекст)

	Если Контекст.МенеджерКриптографии = Неопределено Тогда

		ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии();
		Если Контекст.ПоказатьОшибку = Истина
		   И Контекст.ОписаниеОшибкиНаСервере = Неопределено
		   И Не ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда

			ПараметрыСоздания.ПоказатьОшибку = Истина;
		Иначе
			ПараметрыСоздания.ПоказатьОшибку = Неопределено;
		КонецЕсли;
		ПараметрыСоздания.АлгоритмПодписи = Контекст.АлгоритмПодписи;

		СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
				"ПроверитьСертификатПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
			"ПроверкаСертификата", ПараметрыСоздания);

	Иначе

		Если Контекст.МенеджерКриптографии = "СервисКриптографии" Тогда
			ПроверитьСертификатВМоделиСервиса(Контекст);
		ИначеЕсли Контекст.МенеджерКриптографии = "ОблачнаяПодпись" Тогда
			ПроверитьСертификатОблачнаяПодпись(Контекст);
		Иначе
			ПроверитьСертификатПослеСозданияМенеджераКриптографии(Контекст.МенеджерКриптографии, Контекст);
		КонецЕсли;
	КонецЕсли;

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

// Продолжение процедуры ПроверитьСертификат.

Процедура ПроверитьСертификатПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт

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

	Контекст.МенеджерКриптографии = Результат;

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

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

// Продолжение процедуры ПроверитьСертификат.


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

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

Функция ЗаголовокОшибкиОперации(Операция, ПоказатьОшибку)
Если Операция = "Подписание" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось подписать данные по причине:'");

	ИначеЕсли Операция = "ПроверкаПодписи" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить подпись по причине:'");

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

	ИначеЕсли Операция = "Расшифровка" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось расшифровать данные по причине:'");

	ИначеЕсли Операция = "ПроверкаСертификата" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить сертификат по причине:'");

	ИначеЕсли Операция = "ПолучениеСертификатов" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось получить сертификаты по причине:'");

	ИначеЕсли Операция = "ЧтениеПодписи" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось прочитать все свойства подписи по причине:'");
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ЗаголовокОшибкиОперации(Операция, ПоказатьОшибку)

	Если Операция = "Подписание" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось подписать данные по причине:'");

	ИначеЕсли Операция = "ПроверкаПодписи" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить подпись по причине:'");

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

	ИначеЕсли Операция = "Расшифровка" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось расшифровать данные по причине:'");

	ИначеЕсли Операция = "ПроверкаСертификата" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось проверить сертификат по причине:'");

	ИначеЕсли Операция = "ПолучениеСертификатов" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось получить сертификаты по причине:'");

	ИначеЕсли Операция = "ЧтениеПодписи" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось прочитать все свойства подписи по причине:'");

	ИначеЕсли Операция = "ПродлениеСрокаДействияПодписи" Тогда
		ЗаголовокОшибки = НСтр("ru = 'Не удалось продлить действие подписи по причине:'");

	ИначеЕсли Операция = Null И ПоказатьОшибку <> Истина Тогда
		ЗаголовокОшибки = "";

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

	Возврат ЗаголовокОшибки;

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

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

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

	Попытка

		ТипДанных = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОпределитьТипДанных(Данные);

	Исключение

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

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

	Если ТипДанных = "Сертификат" Тогда

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

			Результат.Ошибка = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму(
				ПрограммаПоСертификатуРезультат.Ошибка);
			Результат.Контекст.АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(Данные);
			Результат.Контекст.Программа = Неопределено;

		Иначе
			Результат.Контекст.Программа = ПрограммаПоСертификатуРезультат.Программа;
		КонецЕсли;

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

	ИначеЕсли ТипДанных = "Подпись" Тогда

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

	ИначеЕсли ТипДанных = "ЗашифрованныеДанные" Тогда

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

	КонецЕсли;

	Результат.Контекст.Программа = Неопределено;
	Результат.Ошибка = НСтр("ru = 'Не удалось определить программу для переданных данных.'");

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

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

// Продолжение процедуры СоздатьМенеджерКриптографии.

Процедура СоздатьМенеджерКриптографииЦиклНачало(Контекст) Экспорт

	Если Контекст.ОписанияПрограмм.Количество() <= Контекст.Индекс + 1 Тогда
		СоздатьМенеджерКриптографииПослеЦикла(Контекст);
		Возврат;
	КонецЕсли;

	Оповещение = Новый ОписаниеОповещения(
		"СоздатьМенеджерКриптографииЦиклНачалоПродолжение", ЭтотОбъект, Контекст);

	СтандартныеПодсистемыКлиент.НачатьВыполнениеОбработкиОповещения(Оповещение);

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

// Продолжение процедуры СоздатьМенеджерКриптографии.

Процедура СоздатьМенеджерКриптографииЦиклНачалоПродолжение(Результат, Контекст) Экспорт

	Контекст = Контекст; // см. КонтекстСоздатьМенеджерКриптографии
	Контекст.Индекс = Контекст.Индекс + 1;
	ОписаниеПрограммы = Контекст.ОписанияПрограмм[Контекст.Индекс]; // см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы
	Контекст.Вставить("ОписаниеПрограммы", ОписаниеПрограммы);

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

		Если Не АлгоритмПодписиПоддерживается Тогда
			Контекст.Менеджер = Неопределено;
			СоздатьМенеджерКриптографииЦиклНачало(Контекст);
			Возврат;
		КонецЕсли;
	КонецЕсли;

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

	ИдентификаторПутиКПрограмме = ?(ЗначениеЗаполнено(ОписаниеПрограммы.Ссылка),
		ОписаниеПрограммы.Ссылка, ОписаниеПрограммы.Идентификатор);

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

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

Процедура СоздатьМенеджерКриптографииЦиклПослеПолученияПутиКПрограмме(ОписаниеПути, Контекст) Экспорт

	СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы(
		Контекст.ОписаниеПрограммы,
		Контекст.ЭтоLinux,
		Контекст.ОписаниеОшибок.Ошибки,
		Ложь,
		ОписаниеПути);

	Если СвойстваПрограммы = Неопределено Тогда
		СоздатьМенеджерКриптографииЦиклНачало(Контекст);
		Возврат;
	КонецЕсли;

	Контекст.Вставить("СвойстваПрограммы", СвойстваПрограммы);

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

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

// Продолжение процедуры СоздатьМенеджерКриптографии.

Процедура СоздатьМенеджерКриптографииЦиклПослеОшибкиПолученияИнформации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт

	СоздатьМенеджерКриптографииЦиклПриОшибкеИнициализации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст);

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

// Продолжение процедуры СоздатьМенеджерКриптографии.
//
// Параметры:
//   ИнформацияМодуля - ИнформацияМодуляКриптографии
//   Контекст - Структура
//


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

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

Функция СвойстваСертификатаИзОтветаКомпоненты(ОтветКомпоненты)
Экспорт

	СвойстваСертификата = Новый Структура;
	СвойстваСертификата.Вставить("АдресаСписковОтзыва", Новый Массив);

	Попытка
		СвойстваСертификатаРезультат = ПрочитатьОтветКомпоненты(
			ОтветКомпоненты);

		АдресаСписковОтзыва = СвойстваСертификатаРезультат.Получить("crls");
		Если ЗначениеЗаполнено(АдресаСписковОтзыва) Тогда
			СвойстваСертификата.АдресаСписковОтзыва = АдресаСписковОтзыва;
		КонецЕсли;

		СвойстваСертификата.Вставить("Издатель", СвойстваСертификатаРезультат.Получить("issuer_name"));
		СвойстваСертификата.Вставить("АлгоритмОткрытогоКлюча", СвойстваСертификатаРезультат.Получить(
			"public_key_algorithm"));
		СвойстваСертификата.Вставить("АлгоритмПодписи", СвойстваСертификатаРезультат.Получить("signature_algorithm"));
		СвойстваСертификата.Вставить("СерийныйНомер", СвойстваСертификатаРезультат.Получить("serial_number"));
    // TODO: допиши оставшуюся часть

[Assistant]
Функция СвойстваСертификатаИзОтветаКомпоненты(ОтветКомпоненты) Экспорт

	СвойстваСертификата = Новый Структура;
	СвойстваСертификата.Вставить("АдресаСписковОтзыва", Новый Массив);

	Попытка
		СвойстваСертификатаРезультат = ПрочитатьОтветКомпоненты(
			ОтветКомпоненты);

		АдресаСписковОтзыва = СвойстваСертификатаРезультат.Получить("crls");
		Если ЗначениеЗаполнено(АдресаСписковОтзыва) Тогда
			СвойстваСертификата.АдресаСписковОтзыва = АдресаСписковОтзыва;
		КонецЕсли;

		СвойстваСертификата.Вставить("Издатель", СвойстваСертификатаРезультат.Получить("issuer_name"));
		СвойстваСертификата.Вставить("АлгоритмОткрытогоКлюча", СвойстваСертификатаРезультат.Получить(
			"public_key_algorithm"));
		СвойстваСертификата.Вставить("АлгоритмПодписи", СвойстваСертификатаРезультат.Получить("signature_algorithm"));
		СвойстваСертификата.Вставить("СерийныйНомер", СвойстваСертификатаРезультат.Получить("serial_number"));
		СвойстваСертификата.Вставить("ИмяКонтейнера", СвойстваСертификатаРезультат.Получить("container_name"));
		СвойстваСертификата.Вставить("ОписаниеПрограммы", СвойстваСертификатаРезультат.Получить("provider"));
		СвойстваСертификата.Вставить("Сертификат", СвойстваСертификатаРезультат.Получить("value"));
		СвойстваСертификата.Вставить("ОткрытыйКлюч", СвойстваСертификатаРезультат.Получить("public_key"));

		Возврат СвойстваСертификата;

	Исключение

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

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

Функция ЦепочкаСертификатовИзОтветаКомпоненты(ОтветКомпоненты, ИдентификаторФормы) Экспорт

	Результат = Новый Структура("Сертификаты, Ошибка", Новый Массив, "");

	Попытка
		СертификатыРезультат = ПрочитатьОтветКомпоненты(
			ОтветКомпоненты);
		СертификатыРезультат = СертификатыРезультат.Получить("Certificates");
	Исключение

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

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

	Для Каждого ТекущийСертификат Из СертификатыРезультат Цикл

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

		ОписаниеСертификата.Вставить("Издатель", ТекущийСертификат.Получить("issuer_name"));
		ОписаниеСертификата.Вставить("ОткрытыйКлюч", ТекущийСертификат.Получить("public_key_"));

		Результат.Сертификаты.Добавить(ОписаниеСертификата);

	КонецЦикла;

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

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

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

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

	Если ТипЗнч(Криптопровайдеры) <> Тип("Массив") Тогда
		Возврат Новый Массив;
	КонецЕсли;

	КриптопровайдерыРезультат = Новый Массив;
	Для Каждого ТекущийКриптопровайдер Из Криптопровайдеры Цикл

		РасширенноеОписаниеПрограммы = РасширенноеОписаниеПрограммы(
			ТекущийКриптопровайдер, ПрограммыПоИменамСТипом, ПроверкаНаКлиенте);

		Если РасширенноеОписаниеПрограммы = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		КриптопровайдерыРезультат.Добавить(РасширенноеОписаниеПрограммы);

	КонецЦикла;

	Возврат КриптопровайдерыРезультат;

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

Функция ПрочитатьОтветКомпоненты(Текст) Экспорт

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

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

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

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

	Возврат Результат;
	#КонецЕсли

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

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

	Если УстановленныеКриптопровайдеры.Количество() = 0 Тогда
		ОписаниеОшибки = НСтр("ru = 'Не установлены программы для работы с электронной подписью'");
		Возврат Неопределено;
	КонецЕсли;

	ПрограммыПоОткрытомуКлючу = ПоискПрограммПоОткрытомуКлючу.Получить(СвойстваСертификата.АлгоритмОткрытогоКлюча);

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

	ПрограммаНайдена = Неопределено;

	Для Каждого УстановленныйКриптопровайдер Из УстановленныеКриптопровайдеры Цикл

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

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

		// Приоритет КриптоПро, если установлено несколько подходящих программ.
		Если СтрНайти(Программа, "CryptoPro") Тогда
			Возврат УстановленныйКриптопровайдер;
		КонецЕсли;

		// Приоритет Microsoft Enhanced CSP, если установлено несколько подходящих программ.
		Если СтрНайти(Программа, "MicrosoftEnhanced") Тогда
			Возврат УстановленныйКриптопровайдер;
		КонецЕсли;

		ПрограммаНайдена = УстановленныйКриптопровайдер;

	КонецЦикла;

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

		ИдентификаторыАлгоритмов = ИдентификаторыАлгоритмовПодписи(Истина);
		АлгоритмПодписи = АлгоритмПоOID(СвойстваСертификата.АлгоритмОткрытогоКлюча, ИдентификаторыАлгоритмов, Ложь);

		ШаблонОшибки = НСтр("ru = 'Не предусмотрено использование ни одной программы
			|с алгоритмом подписи %1'");
		ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки,
			СокрЛП(СтрРазделить(АлгоритмПодписи, ",")[0]));

	КонецЕсли;

	Возврат ПрограммаНайдена;

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

Функция КлючПоискаПрограммыПоИмениСТипом(Имя, Тип) Экспорт

	Возврат СтрШаблон("%1 (%2)", Имя, Тип);

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

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


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

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

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

[Assistant]
Функция НовыйПараметрыДистрибутива()

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

	Возврат Структура;

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

// Возвращает описание HTTP соединения.
//
// Параметры:
//   URL - Строка
//   Таймаут - Число
// Возвращаемое значение:
//   Структура:
//    * HTTPСоединение - HTTPСоединение
//    * СтруктураURI - см. ОбщегоНазначенияКлиентСервер.СтруктураURI
//

Функция СоединениеССерверомИнтернета(ВидОперации, URL, Таймаут = Неопределено)

	СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URL);
	Схема        = ?(ЗначениеЗаполнено(СтруктураURI.Схема), СтруктураURI.Схема, "http");
	Прокси       = Неопределено;

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

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

	Попытка
		Соединение = Новый HTTPСоединение(
			СтруктураURI.Хост,
			СтруктураURI.Порт,
			СтруктураURI.Логин,
			СтруктураURI.Пароль,
			Прокси,
			Таймаут,
			?(НРег(Схема) = "http", Неопределено, ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение()));
	Исключение

		ШаблонЗапроса = "%1:%2ping";
		СсылкаНаРесурс = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса,
			СтруктураURI.Хост, СтруктураURI.Порт);

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

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

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

		ЗаписьЖурналаРегистрации(ВидОперации, УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);

		ВызватьИсключение ТекстОшибки;

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

	ОписаниеСоединения = Новый Структура;
	ОписаниеСоединения.Вставить("HTTPСоединение", Соединение);
	ОписаниеСоединения.Вставить("СтруктураURI", СтруктураURI);

	Возврат ОписаниеСоединения;

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

Функция ПрочитатьАрхивКлассификатора(Знач Архив, Версия = 0)

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

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

	ЧтениеZipФайла = Новый ЧтениеZipФайла(ИмяАрхива);
	ИмяФайлаПериодыДействия = Неопределено;
	ИмяФайлаДатыОкончания   = Неопределено;
	ИмяФайлаДругиеНастройки = Неопределено;

	Для Каждого ЭлементАрхива Из ЧтениеZipФайла.Элементы Цикл
		Если СтрНачинаетсяС(ЭлементАрхива.Имя, "AccreditedCA") Тогда
			ИмяФайлаПериодыДействия = ЭлементАрхива.Имя;
			ЧтениеZipФайла.Извлечь(ЭлементАрхива, КаталогОбновлений);
			Продолжить;
		КонецЕсли;
		Если СтрНачинаетсяС(ЭлементАрхива.Имя, "CAExpirationDateList") Тогда
			ИмяФайлаДатыОкончания = ЭлементАрхива.Имя;
			ЧтениеZipФайла.Извлечь(ЭлементАрхива, КаталогОбновлений);
			Продолжить;
		КонецЕсли;
		Если СтрНачинаетсяС(ЭлементАрхива.Имя, "Settings") Тогда
			ИмяФайлаДругиеНастройки = ЭлементАрхива.Имя;
			ЧтениеZipФайла.Извлечь(ЭлементАрхива, КаталогОбновлений);
			Продолжить;
		КонецЕсли;
	КонецЦикла;

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

	ДанныеУЦ = Новый Структура;
	ДанныеУЦ.Вставить("ПериодыДействия", Новый Структура("Данные, Версия, ДатаОбновления", Новый Соответствие, 0, Дата(1,1,1)));
	ДанныеУЦ.Вставить("ДатыОкончанияДействия", Новый Структура("Данные, Версия, ДатаОбновления", Новый Соответствие, 0, Дата(1,1,1)));
	ДанныеУЦ.Вставить("ГосударственныеУЦ", Новый Соответствие);
	ДанныеУЦ.Вставить("ДругиеНастройки", Новый Соответствие);

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

		// Подготовка соответствия для быстрого поиска.
		Соответствие = Новый Соответствие;
		Для Каждого УЦ Из ДатыОкончания Цикл
			Соответствие.Вставить(УЦ.ОГРН, ПрочитатьДатуJSON(УЦ.ДатаОкончанияДействия, ФорматДатыJSON.ISO));
		КонецЦикла;

		ДанныеУЦ.ДатыОкончанияДействия.Данные = Соответствие;

	Иначе
		ДанныеУЦ.ДатыОкончанияДействия.Данные = Новый Соответствие;
	КонецЕсли;

	ДанныеУЦ.ДатыОкончанияДействия.Версия = Версия;
	ДанныеУЦ.ДатыОкончанияДействия.ДатаОбновления = ТекущаяДатаСеанса();

	Если ИмяФайлаПериодыДействия <> Неопределено Тогда

		СписокУЦ = ПрочитатьФайлПериодовДействияУЦ(КаталогОбновлений + ИмяФайлаПериодыДействия);

		// Подготовка соответствия для быстрого поиска.
		Соответствие = Новый Соответствие;
		ГосударственныеУЦ = Новый Соответствие;
		Для Каждого УЦ Из СписокУЦ Цикл

			Наименование = ЭлектроннаяПодписьКлиентСерверЛокализация.ПодготовитьЗначениеПоиска(УЦ.Наименование);
			КраткоеНаименование = ЭлектроннаяПодписьКлиентСерверЛокализация.ПодготовитьЗначениеПоиска(УЦ.КраткоеНаименование);

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

			Соответствие.Вставить(УЦ.ОГРН, ПериодыДействияМассив);
			Соответствие.Вставить(Наименование, ПериодыДействияМассив);
			Соответствие.Вставить(КраткоеНаименование, ПериодыДействияМассив);
			Если УЦ.Государственный Тогда
				ГосударственныеУЦ.Вставить(УЦ.ОГРН, Истина);
				ГосударственныеУЦ.Вставить(Наименование, Истина);
				ГосударственныеУЦ.Вставить(КраткоеНаименование, Истина);
			КонецЕсли;
		КонецЦикла;

		ДанныеУЦ.ПериодыДействия.Данные = Соответствие;
		ДанныеУЦ.ГосударственныеУЦ = ГосударственныеУЦ;
		ДанныеУЦ.ПериодыДействия.Версия = Версия;
		ДанныеУЦ.ПериодыДействия.ДатаОбновления = ТекущаяДатаСеанса();

	КонецЕсли;

	Если ИмяФайлаДругиеНастройки <> Неопределено Тогда

		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.ОткрытьФайл(КаталогОбновлений + ИмяФайлаДругиеНастройки);
		ДанныеУЦ.ДругиеНастройки = ПрочитатьJSON(
			ЧтениеJSON, Истина, "ДатаПрекращенияДействияСертификатовВыданныхКоммерческимиУЦ", ФорматДатыJSON.ISO); // Соответствие
		ЧтениеJSON.Закрыть();

	КонецЕсли;

	ФайловаяСистема.УдалитьВременныйКаталог(КаталогОбновлений);
	ФайловаяСистема.УдалитьВременныйФайл(ИмяАрхива);

	Возврат ДанныеУЦ;

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


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

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

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

	пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
		"ТелеграммИспользоватьЗаменуСимволовВДругуюКодировку",Тип("Булево"),,Истина,Истина);

	Если пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку Тогда
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(37),"%25"); // "%"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(33),"%21"); // "!"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(34),"%22"); // """  (кавычка)
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(35),"%23"); // "#"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(36),"%24"); // "$"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(38),"%26"); // "&"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(39),"%27"); // "'"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(42),"%2A"); // "*"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(44),"%2C"); // ","
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(58),"%3A"); // ":"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(59),"%3B"); // ";"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(60),"%3C"); // "<"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(61),"%3D"); // "="
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(62),"%3E"); // ">"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(63),"%3F"); // "?"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(91),"%5B"); // "["
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(93),"%5D"); // "]"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(94),"%5E"); // "^"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(96),"%60"); // "`"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(123),"%7B"); // "{"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(124),"%7C"); // "|"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(125),"%7D"); // "}"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(32),"%20"); // " "  (пробел)
	Иначе
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%25",Символ(37) ); // "%"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%21",Символ(33) ); // "!"
    // TODO: допиши оставшуюся часть

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

	пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку = Справочники.узКонстанты.ПолучитьЗначениеКонстанты(
		"ТелеграммИспользоватьЗаменуСимволовВДругуюКодировку",Тип("Булево"),,Истина,Истина);

	Если пТелеграммИспользоватьЗаменуСимволовВДругуюКодировку Тогда
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(37),"%25"); // "%"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(33),"%21"); // "!"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(34),"%22"); // """  (кавычка)
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(35),"%23"); // "#"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(36),"%24"); // "$"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(38),"%26"); // "&"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(39),"%27"); // "'"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(42),"%2A"); // "*"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(44),"%2C"); // ","
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(58),"%3A"); // ":"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(59),"%3B"); // ";"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(60),"%3C"); // "<"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(61),"%3D"); // "="
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(62),"%3E"); // ">"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(63),"%3F"); // "?"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(91),"%5B"); // "["
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(93),"%5D"); // "]"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(94),"%5E"); // "^"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(96),"%60"); // "`"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(123),"%7B"); // "{"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(124),"%7C"); // "|"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(125),"%7D"); // "}"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,Символ(32),"%20"); // " "  (пробел)
	Иначе
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%25",Символ(37) ); // "%"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%21",Символ(33) ); // "!"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%22",Символ(34) ); // """  (кавычка)
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%23",Символ(35) ); // "#"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%24",Символ(36) ); // "$"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%26",Символ(38) ); // "&"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%27",Символ(39) ); // "'"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2A",Символ(42) ); // "*"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%2C",Символ(44) ); // ","
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3A",Символ(58) ); // ":"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3B",Символ(59) ); // ";"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3C",Символ(60) ); // "<"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3D",Символ(61) ); // "="
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3E",Символ(62) ); // ">"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%3F",Символ(63) ); // "?"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5B",Символ(91) ); // "["
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5D",Символ(93) ); // "]"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%5E",Символ(94) ); // "^"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%60",Символ(96) ); // "`"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7B",Символ(123)); // "{"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7C",Символ(124)); // "|"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%7D",Символ(125)); // "}"
		ОбрабатываемаяСтрока = СтрЗаменить(ОбрабатываемаяСтрока,"%20",Символ(32) ); // " "  (пробел)
	КонецЕсли;

	Возврат ОбрабатываемаяСтрока;

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

// #240 Пиганов Г.В. 2020-09-08
// Выполняет HTTPЗапрос для телеграмм по переданным параметрам и с обходом доступных прокси, если они заданы
//
// Параметры:
//  НастройкиБота - Структура - структура настроек бота
//  * ТокенБота - Строка - токен бота телеграмм. Получается при создании бота
//  * ТекущийПрокси - Строка,Неопределено - если Неопределено, то прокси не используется,
//                    иначе индекс прокси в массиве НастройкиБота.Прокси
//  * Прокси - Массив структур - Необязательный. Массив настроек доступных прокси
//  ** Адрес - Строка - Адрес прокси
//  ** Порт - Число - Порт прокси
//  ** Логин - Строка - Логи прокси
//  ** Пароль - Строка - Пароль прокси
//  Команда - Строка - команда телеграмм API
//  ПараметрыЗапроса - Структура,Соответствие - дополнительные параметры запроса. Передаются в HTTPЗапрос
//  Ответ - HTTPОтвет - переменная для получения результата запроса
//  ЭтоЗапросPOST - Булево - Признак выполнения POST, а не GET запроса. При GET запросе параметры
//                  передаются в строке URL, а при POST передаюттся в теле запроса
//
// Возвращаемое значение:
//  Булево - признак успешного выполнения запроса (код ответа 200 или 300)
//


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

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

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

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

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

Процедура ИмяФункции(Отказ)

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

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

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

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

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

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


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

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

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

	Если Значение Тогда
    // TODO: допиши оставшуюся часть

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

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

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

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

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

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

	РаботаСФайламиСлужебный.УстановитьПараметрРегламентногоЗаданияСинхронизацииФайлов(Ложь, "Использование");

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

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

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


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

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

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

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

	ОбъектОбработка = РеквизитФормыВЗначение("Объект");
	ТекстЗапроса = ОбъектОбработка.ТекстЗапроса(ВыбранныеТипы);

	ИнициализироватьКомпоновщикНастроек();
	КомпоновщикНастроек.ЗагрузитьНастройки(Параметры.Настройки);

	Список.ТекстЗапроса = ТекстЗапроса;

	ОбновитьСписокВыбранныхНаСервере();

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

&НаСервере

Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	Настройки["Отбор"] = НастройкиКомпоновкиДанных();
КонецПроцедуры

&НаСервере

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

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

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

&НаКлиенте

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

	ОтключитьОбработчикОжидания("ОбновитьКоличествоВыбранных");
	ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных");
	ВыполняетсяРедактированиеОтборов = Истина;

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

&НаКлиенте

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

	ВыполняетсяРедактированиеОтборов = Ложь;
	ИнициализироватьОбновлениеСпискаВыбранных();

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

&НаКлиенте

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

	ИнициализироватьОбновлениеСпискаВыбранных();

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

&НаКлиенте

Процедура КомпоновщикНастроекНастройкиОтборПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)

	ОтключитьОбработчикОжидания("ОбновитьКоличествоВыбранных");
	ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных");

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

&НаКлиенте

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

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

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

&НаКлиенте

Процедура КомпоновщикНастроекНастройкиОтборПриИзменении(Элемент)

	ИнициализироватьОбновлениеСпискаВыбранных();

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

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

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

&НаКлиенте

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

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

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

&НаКлиенте

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

&НаСервере

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

&НаКлиенте

Процедура ОткрытьЭлемент(Команда)

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

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

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

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

&НаСервере

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

&НаСервере

Функция СхемаКомпоновкиДанных(ТекстЗапроса)
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	Возврат ОбработкаОбъект.СхемаКомпоновкиДанных(ТекстЗапроса);
КонецФункции

&НаСервере

Процедура ОбновитьСписокВыбранныхНаСервере()

	Список.КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроек.Настройки);

	Структура = Список.КомпоновщикНастроек.Настройки.Структура;
	Структура.Очистить();
	ГруппировкаКомпоновкиДанных = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанных.Использование = Истина;

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

	ОбновитьКоличествоВыбранныхСервер();

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

&НаКлиенте

Процедура ОбновитьКоличествоВыбранных()
	ОбновитьКоличествоВыбранныхСервер();
КонецПроцедуры

&НаСервере

Процедура ОбновитьКоличествоВыбранныхСервер()

	ПредыдущееКоличествоВыбранных = КоличествоВыбранных;

	КоличествоВыбранных = ВыбранныеОбъекты().Строки.Количество();
	ТекстКоличествоВыбранных = Строка(КоличествоВыбранных);
	Если КоличествоВыбранных > 1000 Тогда
		КоличествоВыбранных = 1000;
		ТекстКоличествоВыбранных = НСтр("ru = '> 1000'");
	ИначеЕсли КоличествоВыбранных = 0 Тогда
		Список.КомпоновщикНастроек.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное);
	КонецЕсли;
	Если ПредыдущееКоличествоВыбранных <> КоличествоВыбранных Тогда
		Элементы.ГруппаВыбранныеОбъекты.Заголовок = ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Выбранные элементы (%1)'"), ТекстКоличествоВыбранных);
	КонецЕсли;

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

&НаКлиенте

Процедура ИнициализироватьОбновлениеСпискаВыбранных()

	ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных");

	Если ВыполняетсяРедактированиеОтборов Тогда
		Возврат;
	КонецЕсли;

	КоличествоУсловий = КоличествоЭлементовОтбора(КомпоновщикНастроек.Настройки.Отбор.Элементы);

	Если Элементы.ГруппаВыбранныеОбъекты.Видимость Тогда
		ПодключитьОбработчикОжидания("ОбновитьСписокВыбранных", 1, Истина);
	КонецЕсли;

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

&НаКлиенте

Процедура ОбновитьСписокВыбранных()
	ОбновитьСписокВыбранныхНаСервере();
КонецПроцедуры

&НаСервере

Функция ВыбранныеОбъекты()

	Результат = Новый ДеревоЗначений;

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

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

		ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
		ПроцессорВывода.УстановитьОбъект(Результат);
		ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	КонецЕсли;

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

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

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

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

	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3);

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

&НаСервере

Функция СократитьСтрокуКонтрольнойСуммой(Строка, МаксимальнаяДлина)
	Результат = Строка;
	Если СтрДлина(Строка) > МаксимальнаяДлина Тогда
		Результат = Лев(Строка, МаксимальнаяДлина - 32);
		ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
		ХешированиеДанных.Добавить(Сред(Строка, МаксимальнаяДлина - 32 + 1));
		Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
	КонецЕсли;
	Возврат Результат;
КонецФункции

&НаКлиенте

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