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

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

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

	Если ТипЗнч(Объект) <> Тип("ДанныеФормыСтруктура") Тогда
		ОбъектыРасширений = ЭтоОбъектРасширений(Объект);
	Иначе
		ОбъектыРасширений = ЭтоОбъектРасширений(Объект.Ссылка);
	КонецЕсли;

	Если ОбъектыРасширений
	   И Справочники.ИдентификаторыОбъектовРасширений.ОбъектРасширенияОтключен(Объект.Ссылка) Тогда
		Возврат;
	КонецЕсли;

	ПолноеИмя = Объект.ПолноеИмя;

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

	ОбъектМетаданных = МетаданныеНайтиПоПолномуИмени(ПолноеИмя);

	Если ОбъектМетаданных = Неопределено Тогда
		Объект.ПометкаУдаления       = Истина;
		Объект.Родитель              = ПустаяСсылкаСправочника(ОбъектыРасширений);
		Объект.Наименование          = ВставитьЗнакВопроса(Объект.Наименование);
		Объект.Имя                   = ВставитьЗнакВопроса(Объект.Имя);
		Объект.Синоним               = ВставитьЗнакВопроса(Объект.Синоним);
		Объект.ПолноеИмя             = ВставитьЗнакВопроса(Объект.ПолноеИмя);
		Объект.ПолныйСиноним         = ВставитьЗнакВопроса(Объект.ПолныйСиноним);
		Объект.ЗначениеПустойСсылки  = Неопределено;

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

		ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
		ПозицияТочки = СтрНайти(ПолноеИмя, ".");
		ИмяБазовогоТипа = Лев(ПолноеИмя, ПозицияТочки -1);

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

		СвойстваОбъектовМетаданных = СвойстваОбъектовМетаданных(ОбъектыРасширений,
			СвойстваКоллекций.Скопировать(Строки));

		СвойстваОбъекта = СвойстваОбъектовМетаданных.Найти(ПолноеИмя, "ПолноеИмя");

		ЗаполнитьЗначенияСвойств(Объект, СвойстваОбъекта);

		Если ТипЗнч(Объект) <> Тип("ДанныеФормыСтруктура") Тогда
			КлючОбъектаМетаданных = Объект.КлючОбъектаМетаданных.Получить();
			Если КлючОбъектаМетаданных = Неопределено
			 ИЛИ СвойстваОбъекта.БезКлючаОбъектаМетаданных
			     <> (КлючОбъектаМетаданных = Тип("Неопределено")) Тогда

				Объект.КлючОбъектаМетаданных = Новый ХранилищеЗначения(КлючОбъектаМетаданных(СвойстваОбъекта.ПолноеИмя));
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

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

// Только для внутреннего использования.
//
// Возвращаемое значение:
//  ТаблицаЗначений:
//   * ПорядокБиблиотеки - Число
//   * ВерсияЧасть1 - Число
//   * ВерсияЧасть2 - Число
//   * ВерсияЧасть3 - Число
//   * ВерсияЧасть4 - Число
//   * ПорядокДобавления - Число
//   * СтароеПолноеИмя - Строка
//   * НовоеПолноеИмя - Строка
//

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

	ТаблицаПереименования = Новый ТаблицаЗначений;
	ТаблицаПереименования.Колонки.Добавить("ПорядокБиблиотеки", Новый ОписаниеТипов("Число"));
	ТаблицаПереименования.Колонки.Добавить("ВерсияЧасть1",      Новый ОписаниеТипов("Число"));
	ТаблицаПереименования.Колонки.Добавить("ВерсияЧасть2",      Новый ОписаниеТипов("Число"));
	ТаблицаПереименования.Колонки.Добавить("ВерсияЧасть3",      Новый ОписаниеТипов("Число"));
	ТаблицаПереименования.Колонки.Добавить("ВерсияЧасть4",      Новый ОписаниеТипов("Число"));
	ТаблицаПереименования.Колонки.Добавить("ПорядокДобавления", Новый ОписаниеТипов("Число"));
	ТаблицаПереименования.Колонки.Добавить("СтароеПолноеИмя",   Новый ОписаниеТипов("Строка"));
	ТаблицаПереименования.Колонки.Добавить("НовоеПолноеИмя",    Новый ОписаниеТипов("Строка"));

	КоллекцииБезКлюча = Новый Соответствие;

	Отбор = Новый Структура("БезКлючаОбъектаМетаданных", Истина);

	КоллекцииБезКлючаОбъектаМетаданных =
		СтандартныеПодсистемыПовтИсп.СвойстваКоллекцийОбъектовМетаданных().НайтиСтроки(Отбор);

	Для каждого Строка Из КоллекцииБезКлючаОбъектаМетаданных Цикл
		КоллекцииБезКлюча.Вставить(ВРег(Строка.ИмяВЕдЧисле), Строка.ИмяВЕдЧисле);
	КонецЦикла;
	КоллекцииБезКлюча.Вставить(ВРег("Роль"), "Роль");

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

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

	ТаблицаПереименования.Сортировать(
		"ПорядокБиблиотеки ВОЗР,
		|ВерсияЧасть1 ВОЗР,
		|ВерсияЧасть2 ВОЗР,
		|ВерсияЧасть3 ВОЗР,
		|ВерсияЧасть4 ВОЗР,
		|ПорядокДобавления ВОЗР");

	Возврат ТаблицаПереименования;

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

// Параметры:
//  ОбъектыРасширений - Булево
//
// Возвращаемое значение:
//  ТаблицаЗначений:
//   * Имя              - Строка
//   * ИмяВЕдЧисле      - Строка
//   * Синоним          - Строка
//   * СинонимВЕдЧисле  - Строка
//   * ПорядокКоллекции - Строка
//   * БезДанных        - Булево
//   * БезКлючаОбъектаМетаданных - Булево
//   * Идентификатор             - УникальныйИдентификатор
//   * ОбъектыРасширений         - Булево
//

[Assistant] Процедура ОбновитьСвойстваИдентификатора(Объект)


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

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

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

	СвойстваОбъектовМетаданных = СвойстваОбъектовМетаданных(ОбъектыРасширений,, ИдентификаторыКлючейРасширений);

	// Найден - состояние, когда для объекта метаданных найден идентификатор.
	СвойстваОбъектовМетаданных.Колонки.Добавить("Найден", Новый ОписаниеТипов("Булево"));

	// Порядок обновления:
	// 1. Переименование объектов метаданных (с учетом нижестоящих подсистем).
	// 2. Обновление предопределенных идентификаторов (коллекций объектов метаданных).
	// 3. Обновление идентификаторов объектов метаданных, которые    имеют ключ  объекта метаданных.
	// 4. Обновление идентификаторов объектов метаданных, которые не имеют ключа объекта метаданных.
	// 5. В процессе 3 и 4 пометка удаления дублей идентификаторов (по полным именам).
	// 6. Добавление новых идентификаторов объектов метаданных.
	// 7. Обновление родителей идентификаторов объектов метаданных и запись обновленных.

	ВерсияРасширений = ПараметрыСеанса.ВерсияРасширений;

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

	НачатьТранзакцию();
	Попытка
		Блокировка.Заблокировать();

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

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

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

		СписокНовыхОбъектовМетаданных = "";
		ДобавитьИдентификаторыНовыхОбъектовМетаданных(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений,
			ЕстьКритичныеИзменения, СписокНовыхОбъектовМетаданных);

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

[Assistant]
Процедура ОбновитьДанные(ЕстьИзменения, ЕстьУдаленные, ТолькоПроверка,
			ЕстьКритичныеИзменения, СписокКритичныхИзменений, ОбъектыРасширений)

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

	СвойстваОбъектовМетаданных = СвойстваОбъектовМетаданных(ОбъектыРасширений,, ИдентификаторыКлючейРасширений);

	// Найден - состояние, когда для объекта метаданных найден идентификатор.
	СвойстваОбъектовМетаданных.Колонки.Добавить("Найден", Новый ОписаниеТипов("Булево"));

	// Порядок обновления:
	// 1. Переименование объектов метаданных (с учетом нижестоящих подсистем).
	// 2. Обновление предопределенных идентификаторов (коллекций объектов метаданных).
	// 3. Обновление идентификаторов объектов метаданных, которые    имеют ключ  объекта метаданных.
	// 4. Обновление идентификаторов объектов метаданных, которые не имеют ключа объекта метаданных.
	// 5. В процессе 3 и 4 пометка удаления дублей идентификаторов (по полным именам).
	// 6. Добавление новых идентификаторов объектов метаданных.
	// 7. Обновление родителей идентификаторов объектов метаданных и запись обновленных.

	ВерсияРасширений = ПараметрыСеанса.ВерсияРасширений;

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

	НачатьТранзакцию();
	Попытка
		Блокировка.Заблокировать();

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

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

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

		СписокНовыхОбъектовМетаданных = "";
		ДобавитьИдентификаторыНовыхОбъектовМетаданных(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений,
			ЕстьКритичныеИзменения, СписокНовыхОбъектовМетаданных);

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

		Если Не ТолькоПроверка
		   И Не ОбъектыРасширений
		   И ЗначениеЗаполнено(СписокКритичныхИзменений)
		   И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда

			ИмяСобытия = НСтр("ru = 'Идентификаторы объектов метаданных.Требуется загрузить критичные изменения'",
				ОбщегоНазначения.КодОсновногоЯзыка());

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

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

		ЕстьТекущиеИзменения = Ложь;
		ОбновитьИдентификаторыОбъектовМетаданных(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений,
			СвойстваРасширений, ВерсияРасширений, ЕстьТекущиеИзменения, ТолькоПроверка);

		Если ЕстьТекущиеИзменения Тогда
			ЕстьИзменения = Истина;
		КонецЕсли;

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

			Если Не ОбъектыРасширений
			   И Не ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда

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

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

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

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


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

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

Процедура ИмяФункции(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений,
			ЕстьКритичныеИзменения, СписокНовыхОбъектовМетаданных)

	СвойстваОбъектов = СвойстваОбъектовМетаданных.НайтиСтроки(Новый Структура("Найден", Ложь));

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

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

Процедура ОбновитьИдентификаторыОбъектовМетаданных(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений,
			СвойстваРасширений, ВерсияРасширений, ЕстьИзменения, ТолькоПроверка)

	// АПК:1327-выкл - №783.1.4.1 Управляемая блокировка устанавливается в вызывающем коде.
	Если ОбъектыРасширений Тогда
		НаборЗаписей = РегистрыСведений.ИдентификаторыОбъектовВерсийРасширений.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.ВерсияРасширений.Установить(ВерсияРасширений);
		НаборЗаписей.Прочитать();
		ТаблицаЗаписей = НаборЗаписей.Выгрузить();
		ТаблицаЗаписей.Колонки.Добавить("Удалить", Новый ОписаниеТипов("Булево"));
		ТаблицаЗаписей.ЗаполнитьЗначения(Истина, "Удалить");
		ТаблицаЗаписей.Индексы.Добавить("Идентификатор, ПолноеИмяОбъекта, ВерсияРасширений");
		ОбновитьНаборЗаписей = Ложь;
	КонецЕсли;

	Для Каждого Свойства Из Выгрузка Цикл

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

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

			Если Свойства.Родитель <> НовыйРодитель Тогда
				Свойства.Родитель = НовыйРодитель;
				Свойства.Обновлен = Истина;
			КонецЕсли;

			Если ОбъектыРасширений
			   И Свойства.ПометкаУдаления = Ложь
			   И СвойстваРасширений.ИменаНеподключенныхРасширений[НРег(Свойства.ИмяРасширения)] = Неопределено
			   И СвойстваРасширений.ИменаНеподключенныхРасширений[НРег(Свойства.ИдентификаторРасширения)] = Неопределено Тогда

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

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

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

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

		ЗаполнитьЗначенияСвойств(ТаблицаОбъект, Свойства);
		ТаблицаОбъект.КлючОбъектаМетаданных = Новый ХранилищеЗначения(Свойства.КлючОбъектаМетаданных);
		ТаблицаОбъект.ОбменДанными.Загрузка = Истина;
		// @skip-check query-in-loop - В вызываемом варианте ветка с запросом не используется
		ПроверитьОбъектПередЗаписью(ТаблицаОбъект, Истина);
		ТаблицаОбъект.Записать();
	КонецЦикла;

	Если ОбъектыРасширений Тогда
		ТаблицаЗаписей.Индексы.Добавить("Удалить");
		Строки = ТаблицаЗаписей.НайтиСтроки(Новый Структура("Удалить", Истина));
		Если Строки.Количество() > 0
		   И (Строки.Количество() <> 1
		      Или ЗначениеЗаполнено(Строки[0].ПолноеИмяОбъекта)
		        И Строки[0].ВерсияРасширений = ВерсияРасширений) Тогда
			ОбновитьНаборЗаписей = Истина;
			Для Каждого Строка Из Строки Цикл
				ТаблицаЗаписей.Удалить(Строка);
			КонецЦикла;
		КонецЕсли;
		Если ТаблицаЗаписей.Количество() = 0
		   И ЗначениеЗаполнено(ВерсияРасширений) Тогда
			// Добавление записи, если в расширении нет объектов метаданных,
			// чтобы при проверке наличия кэша, получить значение Истина.
			ТаблицаЗаписей.Добавить().ВерсияРасширений = ВерсияРасширений;
			ОбновитьНаборЗаписей = Истина;
		КонецЕсли;
		Если ОбновитьНаборЗаписей Тогда
			ЕстьИзменения = Истина;
			Если ТолькоПроверка Тогда
				Возврат;
			КонецЕсли;
			НаборЗаписей.Загрузить(ТаблицаЗаписей);
			НаборЗаписей.Записать();
		КонецЕсли;
	КонецЕсли;
	// АПК:1327-вкл.

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

Процедура ОбновитьСвойстваПомеченногоНаУдаление(Свойства, СвойстваОбновлены = Ложь, ЕстьУдаленные = Ложь, ЭтоДубль = Ложь)

	ОбъектыРасширений = ЭтоОбъектРасширений(Свойства.Ссылка);

	Если ЭтоДубль Тогда
		КлючОбъектаМетаданных = ?(ТипЗнч(Свойства.КлючОбъектаМетаданных) = Тип("ХранилищеЗначения"),
			Свойства.КлючОбъектаМетаданных.Получить(), Свойства.КлючОбъектаМетаданных);
	КонецЕсли;

	Если НЕ Свойства.ПометкаУдаления
	 ИЛИ ЗначениеЗаполнено(Свойства.Родитель)
	 ИЛИ Лев(Свойства.Наименование, 1)  <> "?"
	 ИЛИ Лев(Свойства.Имя, 1)           <> "?"
	 ИЛИ Лев(Свойства.Синоним, 1)       <> "?"
	 ИЛИ Лев(Свойства.ПолноеИмя, 1)     <> "?"
	 ИЛИ Лев(Свойства.ПолныйСиноним, 1) <> "?"
	 ИЛИ ОбъектыРасширений И Лев(Свойства.ИмяРасширения, 1)           <> "?"
	 ИЛИ ОбъектыРасширений И Лев(Свойства.ИдентификаторРасширения, 1) <> "?"
	 ИЛИ ОбъектыРасширений И Лев(Свойства.ХешСуммаРасширения, 1)      <> "?"
	 ИЛИ СтрНайти(Свойства.ПолноеИмя, "(") = 0
	 ИЛИ Свойства.ЗначениеПустойСсылки  <> Неопределено
	 ИЛИ Свойства.ИмяПредопределенныхДанных <> ""
	 ИЛИ ЭтоДубль
	   И КлючОбъектаМетаданных <> Неопределено Тогда

		Если НЕ Свойства.ПометкаУдаления Или Лев(Свойства.ПолноеИмя, 1) <> "?" Тогда
			ЕстьУдаленные = Истина;
		КонецЕсли;

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

		Если ОбъектыРасширений Тогда
			Свойства.ИмяРасширения           = ВставитьЗнакВопроса(Свойства.ИмяРасширения);
			Свойства.ИдентификаторРасширения = ВставитьЗнакВопроса(Свойства.ИдентификаторРасширения);
			Свойства.ХешСуммаРасширения      = ВставитьЗнакВопроса(Свойства.ХешСуммаРасширения);
		КонецЕсли;

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

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

[Assistant]
Процедура ДобавитьИдентификаторыНовыхОбъектовМетаданных(Выгрузка, СвойстваОбъектовМетаданных, ОбъектыРасширений,
			ЕстьКритичныеИзменения, СписокНовыхОбъектовМетаданных)


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

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

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

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

	ДвенадцатиЧасовойФорматВремени = ГрафикиРаботы.ДвенадцатиЧасовойФорматВремени();

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

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

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

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

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

	ДвенадцатиЧасовойФорматВремени = ГрафикиРаботы.ДвенадцатиЧасовойФорматВремени();

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

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

	ДлинаЦикла = 7;

	Объект.ДатаНачала = НачалоГода(ТекущаяДатаСеанса());
	Объект.ДатаОтсчета = НачалоГода(ТекущаяДатаСеанса());

	ЗаполнитьДаннымиТекущегоГода(Параметры.ЗначениеКопирования);

	ПриПолученииДанныхНаСервере();

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

&НаСервере

Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	ДвенадцатиЧасовойФорматВремени = ГрафикиРаботы.ДвенадцатиЧасовойФорматВремени();

	ДлинаЦикла = Объект.ШаблонЗаполнения.Количество();
	ЗаполнитьДаннымиТекущегоГода();

	ПриПолученииДанныхНаСервере(ТекущийОбъект);

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

&НаСервере

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

	Если Не ПараметрыЗаписи.Свойство("НомерГода", НомерГода) Тогда
		НомерГода = НомерТекущегоГода;
	КонецЕсли;

	// Если данные текущего года отредактированы вручную,
	// то записываем их как есть, остальные периоды обновляем по шаблону.

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

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

&НаСервере

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

	ДлинаЦикла = Объект.ШаблонЗаполнения.Количество();

	УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект);

	СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета);

	ЗаполнитьПредставлениеРасписания(ЭтотОбъект);

	УточнитьДатуЗаполненности();

	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Ложь);

	ЗаполнитьДаннымиТекущегоГода();

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

&НаСервере

Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

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

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

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

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

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

&НаКлиенте

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

	УстановитьДоступностьУчитыватьПраздники(ЭтотОбъект);
	УстановитьДоступностьУчитыватьНерабочиеПериоды(ЭтотОбъект);

	УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь);
	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина);

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

&НаКлиенте

Процедура СпособЗаполненияПриИзменении(Элемент)

	УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект);

	УточнитьДатуОтсчета();

	СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета);
	ЗаполнитьПредставлениеРасписания(ЭтотОбъект);

	УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь);
	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина);

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

&НаКлиенте

Процедура ДатаНачалаПриИзменении(Элемент)

	Если Объект.ДатаНачала < Дата(1900, 1, 1) Тогда
		Объект.ДатаНачала = НачалоГода(ОбщегоНазначенияКлиент.ДатаСеанса());
	КонецЕсли;

	УстановитьДоступностьУчитыватьНерабочиеПериоды(ЭтотОбъект);

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

&НаКлиенте

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

&НаКлиенте

Процедура ДатаОтсчетаПриИзменении(Элемент)

	УточнитьДатуОтсчета();

	СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета);

	УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь);
	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина);

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

&НаКлиенте

Процедура ДлинаЦиклаПриИзменении(Элемент)

	СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета);
	ЗаполнитьПредставлениеРасписания(ЭтотОбъект);

	УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь);
	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина);

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

&НаКлиенте

Процедура УчитыватьПраздникиПриИзменении(Элемент)

	УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь);
	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина);

	УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтотОбъект);

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

&НаКлиенте

Процедура УчитыватьНерабочиеПериодыПриИзменении(Элемент)

	УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь);
	УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина);

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

&НаКлиенте

Процедура РасписаниеПредпраздничногоДняНажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	НачатьЗаполнениеРасписанияДня(0);

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

&НаКлиенте

Процедура ГоризонтПланированияПриИзменении(Элемент)

	УточнитьЗаполненностьГрафика(ЭтотОбъект);

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

&НаКлиенте

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

	ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Описание");

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

&НаКлиенте

Процедура НомерТекущегоГодаПриИзменении(Элемент)

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

	ЗаписыватьДанныеГрафика = Ложь;

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

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

	КонецЕсли;

	ОбработатьИзменениеГода(ЗаписыватьДанныеГрафика);

	УстановитьСнятьМодифицированностьРезультата(ЭтотОбъект, Ложь);

	Элементы.ГрафикРаботы.Обновить();

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

&НаКлиенте

Процедура ГрафикРаботыПриВыводеПериода(Элемент, ОформлениеПериода)

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

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

&НаКлиенте


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

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

Процедура ЗначениеНачалоВыбораПослеВыбораТипа(ЭлементСписка, Контекст)
Экспорт

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

	Элемент = Контекст.Элемент;
	ИмяРеквизита = Контекст.ИмяРеквизита;
	ИмяРеквизитаТип = Контекст.ИмяРеквизитаТип;
	ИмяРеквизитаЗначения = Контекст.ИмяРеквизитаЗначения;

	МассивТипов = Новый Массив;
	МассивТипов.Добавить(ЭлементСписка.Значение);

	ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
	НачальноеЗначение = ОписаниеТипов.ПривестиЗначение(ЭтотОбъект[ИмяРеквизитаЗначения]);

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

[Assistant]
Процедура ЗначениеНачалоВыбораПослеВыбораТипа(ЭлементСписка, Контекст) Экспорт

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

	Элемент = Контекст.Элемент;
	ИмяРеквизита = Контекст.ИмяРеквизита;
	ИмяРеквизитаТип = Контекст.ИмяРеквизитаТип;
	ИмяРеквизитаЗначения = Контекст.ИмяРеквизитаЗначения;

	МассивТипов = Новый Массив;
	МассивТипов.Добавить(ЭлементСписка.Значение);

	ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
	НачальноеЗначение = ОписаниеТипов.ПривестиЗначение(ЭтотОбъект[ИмяРеквизитаЗначения]);

	Если ИмяРеквизита = ИмяРеквизитаЗначения Тогда
		ЭтотОбъект[ИмяРеквизитаЗначения] = НачальноеЗначение;
	КонецЕсли;

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	ПараметрыФормы.Вставить("ТекущаяСтрока", НачальноеЗначение);
	ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
	ПараметрыФормы.Вставить("МножественныйВыбор", Ложь);

	ИмяФормыВыбора = ЭтотОбъект[ИмяРеквизитаТип].НайтиПоЗначению(ТипЗнч(НачальноеЗначение)).Представление
		+ ".ФормаВыбора";

	ОткрытьФорму(ИмяФормыВыбора, ПараметрыФормы, Элемент);

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

&НаКлиенте

Процедура ОбработчикОжиданияРеквизитыПриИзмененииДоверитель()

	ОбработчикОжиданияРеквизитыПриИзменении("Доверитель");

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

&НаКлиенте

Процедура ОбработчикОжиданияРеквизитыПриИзмененииЛицоДоверителя()

	ОбработчикОжиданияРеквизитыПриИзменении("ЛицоДоверителя");

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

&НаКлиенте

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

	ОбработчикОжиданияРеквизитыПриИзменении("ПредставительУправляющейКомпании");

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

&НаКлиенте

Процедура ОбработчикОжиданияРеквизитыПриИзмененииПредставитель()

	ОбработчикОжиданияРеквизитыПриИзменении("Представитель");

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

&НаКлиенте

Процедура ОбработчикОжиданияРеквизитыПриИзмененииЛицоПредставителя()

	ОбработчикОжиданияРеквизитыПриИзменении("ЛицоПредставителя");

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

&НаКлиенте

Процедура ОбработчикОжиданияРеквизитыПриИзменении(ИмяЭлементаОрганизация)

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

	ПриИзмененииОрганизацииНаСервере(ИмяЭлементаОрганизация);

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

&НаКлиенте

Процедура ОрганизацияПриИзменении(ИмяЭлементаОрганизация)

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

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

&НаКлиенте

Процедура ОрганизацияОчистка(ИмяЭлементаОрганизация, Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ПриПотереГотовности(ЭтотОбъект);

	ОчиститьСообщения();
	ОчиститьРеквизитыОрганизации(ИмяЭлементаОрганизация);

	УстановитьОтображениеРеквизитовЗависимыхОтОрганизации(ИмяЭлементаОрганизация);

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

&НаСервере

Процедура ДобавитьУчастника(УчастникСсылка, ТипУчастника)

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

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

&НаСервере

Процедура ЗагрузитьЗначенияВФорму()

	Строки = Объект.Доверители.НайтиСтроки(Новый Структура("ИдентификаторРодителя",
		Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")));
	ДоверительНесколько = Строки.Количество() > 1;

	Если Строки.Количество() > 0 Тогда
		ЗагрузитьДоверителяИзСтроки(Строки[0].Идентификатор);
	Иначе
		ЗаполнитьПустоеЗначениеФормы("Доверитель");
		ЗаполнитьПустоеЗначениеФормы("ЛицоДоверителя");
		ЗаполнитьПустоеЗначениеФормы("ПредставительУправляющейКомпании");
	КонецЕсли;

	Строки = Объект.Представители.НайтиСтроки(Новый Структура("ИдентификаторРодителя",
		Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")));
	ПредставительНесколько = Строки.Количество() > 1;

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

	СформироватьЗаголовокПолномочий(ЭтотОбъект);
	УстановитьВидимостьИДоступность(ЭтотОбъект);

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

&НаСервере

Процедура ЗагрузитьДоверителяИзСтроки(ИД)

	ДоверительСтрока = Объект.Доверители.НайтиСтроки(Новый Структура("Идентификатор", ИД))[0];
	ЗагрузитьЗначенияРеквизитаФормы("Доверитель", ДоверительСтрока);

	Если ДоверительРеквизиты <> Неопределено И Не ДоверительРеквизиты.ЭтоФизическоеЛицо Тогда

		Строки = Объект.Доверители.НайтиСтроки(Новый Структура("ИдентификаторРодителя", ИД));
		КоличествоСтрок = Строки.Количество();
		ЛицоДоверителяНесколько = КоличествоСтрок > 1;

		Если КоличествоСтрок > 0 Тогда
			ЗагрузитьЛицоДоверителяИзСтроки(Строки[0].Идентификатор);
		Иначе
			ЗаполнитьПустоеЗначениеФормы("ЛицоДоверителя");
			Если ЛицоДоверителяТипСтрока <> "ФизическоеЛицо" Тогда
				ЗаполнитьПустоеЗначениеФормы("ПредставительУправляющейКомпании");
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;

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

&НаСервере

Процедура ЗагрузитьЛицоДоверителяИзСтроки(ИД)

	ЛицоДоверителяСтрока = Объект.Доверители.НайтиСтроки(Новый Структура("Идентификатор", ИД))[0];
	ЗагрузитьЗначенияРеквизитаФормы("ЛицоДоверителя", ЛицоДоверителяСтрока);

	Если ЛицоДоверителяРеквизиты <> Неопределено И Не ЛицоДоверителяРеквизиты.ЭтоФизическоеЛицо Тогда

		Строки = Объект.Доверители.НайтиСтроки(Новый Структура("ИдентификаторРодителя", ИД));
		КоличествоСтрок = Строки.Количество();
		ПредставительУправляющейКомпанииНесколько = КоличествоСтрок > 1;

		Если КоличествоСтрок > 0 Тогда
			ЗагрузитьПредставителяУправляющейКомпанииИзСтроки(Строки[0].Идентификатор);
		Иначе
			ЗаполнитьПустоеЗначениеФормы("ПредставительУправляющейКомпании");
		КонецЕсли;

	КонецЕсли;

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

&НаСервере

Процедура ЗагрузитьПредставителяУправляющейКомпанииИзСтроки(ИД)

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

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

&НаСервере

Процедура ЗагрузитьПредставителяИзСтроки(ИД)

	ПредставительСтрока = Объект.Представители.НайтиСтроки(Новый Структура("Идентификатор", ИД))[0];
	ЗагрузитьЗначенияРеквизитаФормы("Представитель", ПредставительСтрока, Ложь);

	Если ПредставительРеквизиты <> Неопределено
		И Не ПредставительРеквизиты.ЭтоФизическоеЛицо
		И (ПредставительРеквизиты.ЭтоИндивидуальныйПредприниматель
		Или ПредставительРеквизиты.ЭтоФилиал) Тогда

		Строки = Объект.Представители.НайтиСтроки(Новый Структура("ИдентификаторРодителя", ИД));
		КоличествоСтрок = Строки.Количество();
		ЛицоПредставителяНесколько = КоличествоСтрок > 1;

		Если КоличествоСтрок > 0 Тогда

			Если КоличествоСтрок = 1 Тогда
				ЗагрузитьЛицаПредставителяИзСтроки(Строки[0].Идентификатор);
			Иначе
				СформироватьТаблицуНесколькоПредставителей(Строки[0].ИдентификаторРодителя);
			КонецЕсли;

		Иначе
			ЗаполнитьПустоеЗначениеФормы("ЛицоПредставителя");
		КонецЕсли;
	КонецЕсли;

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

&НаСервере

Процедура ЗагрузитьЛицаПредставителяИзСтроки(ИД)

	ЛицоПредставителяСтрока = Объект.Представители.НайтиСтроки(Новый Структура("Идентификатор", ИД));
	ЗагрузитьЗначенияРеквизитаФормы("ЛицоПредставителя", ЛицоПредставителяСтрока[0], Ложь);

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

&НаСервере


[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]
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ТипПолучателейРассылки        = Параметры.ТипПолучателейРассылки;
	ВидПочтовогоАдресаПолучателей = Параметры.ВидПочтовогоАдресаПолучателей;
	НаименованиеРассылки          = Параметры.НаименованиеРассылки;
	Ссылка = Параметры.Ссылка;

	ЗаполнитьСведенияОТипеПолучателей(Отказ);
	ПодготовитьВидимостьЭлементов(Параметры.Архивировать);
	ЗаполнитьОтборыПоУмолчанию();

	Если ЭтоАдресВременногоХранилища(Параметры.АдресПолучателей) Тогда
		ЗаполнитьПолучателейРассылкиСАдресомЭлектроннойПочты(ПолучитьИзВременногоХранилища(Параметры.АдресПолучателей));
		УдалитьИзВременногоХранилища(Параметры.АдресПолучателей);
	КонецЕсли;

	ТаблицаПолучатели = РеквизитФормыВЗначение("Получатели");
	ЗначениеВРеквизитФормы(ТаблицаПолучатели, "ПолучателиБезОтборов");

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

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

	ИзмененыПаролиСертификаты = Ложь;

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

&НаКлиенте

Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

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

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

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

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

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

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

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

&НаКлиенте

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

&НаКлиенте

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

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

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

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

&НаКлиенте

Процедура ПолучателиПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте

Процедура ПолучателиПарольАрхиваПриИзменении(Элемент)

	СтрокаПолучатели = Элементы.Получатели.ТекущиеДанные;
	СтрокаПолучатели.ПарольИзменен = Истина;

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

	СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора);
	Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда
		СтрокиПолучателиБезОтбора[0].ПарольАрхива = СтрокаПолучатели.ПарольАрхива;
		СтрокиПолучателиБезОтбора[0].ПарольИзменен = Истина;
	КонецЕсли;

	ИзмененыПаролиСертификаты = Истина;

	ОбновитьОтборы();

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

&НаКлиенте

Процедура Подключаемый_ПолучателиСертификатДляШифрованияПриИзменении(Элемент)

	СтрокаПолучатели = Элементы.Получатели.ТекущиеДанные;
	СтрокаПолучатели.СертификатИзменен = Истина;

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

	СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора);
	Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда
		СтрокаПолучателиБезОтбора = СтрокиПолучателиБезОтбора[0];
		СтрокаПолучателиБезОтбора["СертификатДляШифрования"] = СтрокаПолучатели["СертификатДляШифрования"];
		СтрокаПолучателиБезОтбора.СертификатИзменен = Истина;
	КонецЕсли;

	ИзмененыПаролиСертификаты = Истина;

	ОбновитьОтборы();

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

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

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

&НаКлиенте

Процедура ЗаполнитьСертификаты(Команда)

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

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

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

&НаКлиенте

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

	ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр(
		"ru = 'Для получателей рассылки будут установлены пароли.
		|
		|• Нажмите Да, чтобы  устанавливать новые пароли, даже если они уже были установлены.
		|• Нажмите Нет, чтобы установить пароли,  только при их отсутствии.'"));

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

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

&НаКлиенте

Процедура СкрытьПоказатьПароли(Команда)

	Если Элементы.ПолучателиПарольАрхива.Видимость Тогда
		Элементы.ПолучателиПарольАрхива.Видимость = Ложь;
		Элементы.ПолучателиПарольАрхива2.Видимость = Истина;
		Элементы.СкрытьПоказатьПароли.Картинка = БиблиотекаКартинок.ВводимыеСимволыСкрыты;
	Иначе
		Элементы.ПолучателиПарольАрхива.Видимость = Истина;
		Элементы.ПолучателиПарольАрхива2.Видимость = Ложь;
		Элементы.СкрытьПоказатьПароли.Картинка = БиблиотекаКартинок.ВводимыеСимволыВидны;
	КонецЕсли;

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

&НаКлиенте

Процедура ПечатьСпискаПаролей(Команда)

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

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

	ПараметрКоманды = Новый Массив;
	ПараметрКоманды.Добавить(Ссылка);

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

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

&НаКлиенте


[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 = 'Рассылка отчетов (%1) была отправлена не всем получателям. Повторить рассылку для получателей:'"),
			СостояниеРассылки.ПоследнийЗапускНачало);
	Иначе
		Элементы.ЗаголовокДекорация.Заголовок = НСтр("ru = 'Повторная рассылка не требуется.'");
	КонецЕсли;

	ЗаполнитьПолучателейПовторнойРассылки(РассылкаСсылка, СостояниеРассылки);

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

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

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

&НаКлиенте
Процедура ПовторитьРассылку(Команда)

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

	МассивРассылок = Новый Массив;
	МассивРассылок.Добавить(РассылкаСсылка);

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

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

	РассылкаОтчетовКлиент.ВыполнитьСейчасВФоне(СписокПолучателей, ПараметрыЗапуска);

	Закрыть();

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

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

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

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

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

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

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

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

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


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

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

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

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

	ТекущиеДанные = Элементы.Сертификаты.ТекущиеДанные;

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

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

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

	Контекст = Новый Структура;
	Контекст.Вставить("Оповещение",          Оповещение);
	Контекст.Вставить("Результат",           Результат);
	Контекст.Вставить("ТекущиеДанные",       ТекущиеДанные);
	Контекст.Вставить("СохраненныеСвойства", Неопределено);

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

[Assistant]
Процедура ПерейтиКВыборуТекущегоСертификата(Оповещение)

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

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

	ТекущиеДанные = Элементы.Сертификаты.ТекущиеДанные;

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

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

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

	Контекст = Новый Структура;
	Контекст.Вставить("Оповещение",          Оповещение);
	Контекст.Вставить("Результат",           Результат);
	Контекст.Вставить("ТекущиеДанные",       ТекущиеДанные);
	Контекст.Вставить("СохраненныеСвойства", Неопределено);

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

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

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

		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("Отпечаток", МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(ТекущиеДанные.Отпечаток));

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

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

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

// Продолжение процедуры ПерейтиКВыборуТекущегоСертификата.
//
// Параметры:
//   РезультатПоиска - СертификатКриптографии
//   Контекст - Структура
//
&НаКлиенте

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

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

	Контекст.Вставить("СертификатКриптографии", РезультатПоиска);

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

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

// Продолжение процедуры ПерейтиКВыборуТекущегоСертификата.
//
// Параметры:
//   РезультатПоиска - Структура:
//   * Выполнено - Булево
//   * ОписаниеОшибки - Структура:
//   ** Описание - Строка
//   Контекст - Структура
//
&НаКлиенте

Процедура ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачномСервисе(РезультатПоиска, Контекст) Экспорт

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

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

	Контекст.Вставить("СертификатКриптографии", РезультатПоиска.Сертификат);
	ПерейтиКВыборуТекущегоСертификатаПослеВыгрузкиСертификата(РезультатПоиска.Сертификат.Сертификат, Контекст);

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

// Продолжение процедуры ПерейтиКВыборуТекущегоСертификата.
//
// Параметры:
//   РезультатПоиска - Структура:
//   * Выполнено - Булево
//   * Ошибка - Строка
//   Контекст - Структура
//
&НаКлиенте

Tasks-develope/src/cf/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Ext/Form/Module.bsl


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

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

Процедура ИмяФункции(РезультатПоиска, Контекст) Экспорт

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

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

	Контекст.Вставить("СертификатКриптографии", РезультатПоиска.ДанныеСертификата);
	ПерейтиКВыборуТекущегоСертификатаПослеВыгрузкиСертификата(РезультатПоиска.ДанныеСертификата.Сертификат, Контекст);

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

// Продолжение процедуры ПерейтиКВыборуТекущегоСертификата.
&НаКлиенте
Асинх Процедура ПерейтиКВыборуТекущегоСертификатаПослеВыгрузкиСертификата(ВыгруженныеДанные, Контекст) Экспорт

	СертификатАдрес = ПоместитьВоВременноеХранилище(ВыгруженныеДанные, УникальныйИдентификатор);

	СертификатОтпечаток = Контекст.ТекущиеДанные.Отпечаток;

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

	Контекст.СохраненныеСвойства = СохраненныеСвойстваСертификата(Контекст.ТекущиеДанные.Отпечаток,
		СертификатАдрес, СертификатПараметрыРеквизитов);

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

	ПерейтиКВыборуТекущегоСертификатаПослеЗаполненияСвойствСертификата(Контекст);

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

// Продолжение процедуры ПерейтиКВыборуТекущегоСертификата.
&НаКлиенте

Процедура ПерейтиКВыборуТекущегоСертификатаПослеЗаполненияСвойствСертификата(Контекст)

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

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

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

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

	Сертификат             = Контекст.СохраненныеСвойства.Ссылка;
	СертификатОрганизация  = Контекст.СохраненныеСвойства.Организация;
	СертификатНаименование = Контекст.СохраненныеСвойства.Наименование;
	СертификатВводитьПарольВПрограммеЭлектроннойПодписи = Контекст.СохраненныеСвойства.ВводитьПарольВПрограммеЭлектроннойПодписи;

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

	Элементы.ГлавныеСтраницы.ТекущаяСтраница = Элементы.СтраницаУточнениеСвойствСертификата;
	Элементы.Выбрать.КнопкаПоУмолчанию = Истина;

	Если ДобавлениеВСписок Тогда
		Строка = ?(ЗначениеЗаполнено(Сертификат), НСтр("ru = 'Обновить'"), НСтр("ru = 'Добавить'"));
		Если Элементы.Выбрать.Заголовок <> Строка Тогда
			Элементы.Выбрать.Заголовок = Строка;
		КонецЕсли;
	КонецЕсли;

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

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

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

&НаКлиенте

Процедура ОбработчикОжиданияАктивизироватьЭлементПароль()

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

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

&НаСервере

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

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

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

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

&НаСервере

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

	СертификатВводитьПарольВПрограммеЭлектроннойПодписи = Ложь;

	ЭлектроннаяПодписьСлужебный.ЗаписатьСертификатВСправочник(ЭтотОбъект, УчетнаяЗапись, Ложь);

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

&НаКлиенте

Процедура ПриЗакрытииФормыВыбораФизическогоЛица(Значение, Параметры) Экспорт

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

	СертификатФизическоеЛицо = Значение;

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

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

[Assistant] Процедура ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачнойПодписи(РезультатПоиска, Контекст)


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

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

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

	ЭлектроннаяПодписьСлужебный.НастроитьФормуПодписанияШифрованияРасшифровки(ЭтотОбъект);

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

		МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Подписание",
				"ГруппаПодписаниеИКомментарий",
				"ГруппаКонтейнер",
				"ГруппаКонтейнер1",
				"ГруппаКомандыПодтверждения");
		МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат);
    // TODO: допиши оставшуюся часть

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

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

	ЭлектроннаяПодписьСлужебный.НастроитьФормуПодписанияШифрованияРасшифровки(ЭтотОбъект);

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

		МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Подписание",
				"ГруппаПодписаниеИКомментарий",
				"ГруппаКонтейнер",
				"ГруппаКонтейнер1",
				"ГруппаКомандыПодтверждения");
		МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат);
	КонецЕсли;

	УстановитьТипПодписи(Параметры.ТипПодписи);

	Если Не ЭлектроннаяПодпись.ДоступнаУсовершенствованнаяПодпись() Тогда
		ТипПодписи = Неопределено;
		Элементы.ТипПодписи.Видимость = Ложь;
	КонецЕсли;

	ОбновитьВидимостьПредупреждения();

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

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

	Если ЗначениеЗаполнено(ИмяПоляАктивизироватьПоУмолчанию) Тогда
		ТекущийЭлемент = Элементы[ИмяПоляАктивизироватьПоУмолчанию];
	КонецЕсли;

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

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

&НаКлиенте

Процедура ПриЗакрытии(ЗавершениеРаботы)

	ОчиститьПеременныеФормы();

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

&НаКлиенте

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

	Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
		ПодключитьОбработчикОжидания("ПриИзмененииСпискаСертификатов", 0.1, Истина);

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

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

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

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

	КонецЕсли;

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

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

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

&НаКлиенте

Процедура ВыборДоверенностиПриИзменении(Элемент)

	Элементы.ГруппаСтраницы.ТекущаяСтраница = ?(ПоДоверенности, Элементы.СтраницаВыборДоверенности,
		Элементы.СтраницаБезДоверенности);

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

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

&НаКлиенте

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

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

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

&НаКлиенте

Процедура СертификатПриИзменении(Элемент)

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

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

// Продолжение процедуры СертификатПриИзменении.
&НаКлиенте

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

	СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);

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

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

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

&НаКлиенте

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

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

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

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

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

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

&НаКлиенте

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

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

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

&НаКлиенте

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

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

	Если ВыбранноеЗначение = Истина Тогда
		Сертификат = ВнутренниеДанные["ВыбранныйСертификат"];
		ВнутренниеДанные.Удалить("ВыбранныйСертификат");
	Иначе
		Сертификат = ВыбранноеЗначение;
	КонецЕсли;

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

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

// Продолжение процедуры СертификатОбработкаВыбора.
&НаКлиенте

Tasks-develope/src/cf/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Ext/Form/Module.bsl


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

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

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

	СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);

	Если ВыбранноеЗначение = Истина
	   И ВнутренниеДанные["ВыбранныйСертификатПароль"] <> Неопределено Тогда

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

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

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

&НаКлиенте

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

	ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);

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

&НаКлиенте

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

	ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);

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

&НаКлиенте

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

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

	Если Не РазрешитьЗапоминатьПароль
	   И Не ЗапомнитьПароль
	   И Не СвойстваПароля.ПарольПроверен Тогда

		Элементы.ЗапомнитьПароль.ТолькоПросмотр = Истина;
	КонецЕсли;

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

&НаКлиенте

Процедура ЗапомнитьПарольПриИзменении(Элемент)

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

	Если Не РазрешитьЗапоминатьПароль
	   И Не ЗапомнитьПароль
	   И Не СвойстваПароля.ПарольПроверен Тогда

		Элементы.ЗапомнитьПароль.ТолькоПросмотр = Истина;
	КонецЕсли;

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

&НаКлиенте

Процедура ПояснениеУстановленногоПароляНажатие(Элемент)

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

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

&НаКлиенте

Процедура ПояснениеУстановленногоПароляРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)

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

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

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

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

&НаКлиенте

Процедура Расшифровать(Команда)

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

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

	Иначе
		Если Не Элементы.ФормаРасшифровать.Доступность Тогда
			Возврат;
		КонецЕсли;

		Элементы.ФормаРасшифровать.Доступность = Ложь;

		РасшифроватьДанные(Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект));
	КонецЕсли;

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

// Продолжение процедуры Расшифровать.
&НаКлиенте

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

	Элементы.ФормаРасшифровать.Доступность = Истина;

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

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

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

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

&НаКлиенте

Процедура ПродолжитьОткрытие(Оповещение, ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт

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

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

	ОписаниеДанных             = КлиентскиеПараметры.ОписаниеДанных;
	ФормаОбъекта               = КлиентскиеПараметры.Форма;
	ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;

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

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

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

// Продолжение процедуры ПродолжитьОткрытие.
&НаКлиенте

[Assistant] Процедура СертификатОбработкаВыбораЗавершение(ОтпечаткиСертификатовНаКлиенте, ВыбранноеЗначение)

Tasks-develope/src/cf/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Ext/Form/Module.bsl


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

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

Процедура ИмяФункции(Результат, Контекст) Экспорт

	Если Результат <> Истина Тогда
		ПродолжитьОткрытиеЗавершение(Контекст);
		Возврат;
	КонецЕсли;

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

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

	Если Не РазрешитьЗапоминатьПароль
	   И Не ЗапомнитьПароль
	   И Не СвойстваПароля.ПарольПроверен Тогда

		Элементы.ЗапомнитьПароль.ТолькоПросмотр = Истина;
	КонецЕсли;

	Если БезПодтверждения
	   И (    ДополнительныеПараметры.ПарольУказан
	      Или ДополнительныеПараметры.ВводитьПарольВПрограммеЭлектроннойПодписи
	      Или ОблачныйПарольПодтвержден) Тогда

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

	Открыть();

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

	ПродолжитьОткрытиеЗавершение(Контекст);

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

// Продолжение процедуры ПродолжитьОткрытие.
&НаКлиенте

Процедура ПродолжитьОткрытиеПослеРасшифровкиДанных(Результат, Контекст) Экспорт

	ПродолжитьОткрытиеЗавершение(Контекст, Результат = Истина);

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

// Продолжение процедуры ПродолжитьОткрытие.
&НаКлиенте

Процедура ПродолжитьОткрытиеЗавершение(Контекст, Результат = Неопределено)

	Если Не Открыта() Тогда
		ОчиститьПеременныеФормы();
	КонецЕсли;

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

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

&НаКлиенте

Процедура ОчиститьПеременныеФормы()

	ОписаниеДанных             = Неопределено;
	ФормаОбъекта               = Неопределено;
	ТекущийСписокПредставлений = Неопределено;

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

&НаКлиенте

Функция ПеременныеОчищены()

	Возврат ОписаниеДанных = Неопределено
		И ФормаОбъекта = Неопределено
		И ТекущийСписокПредставлений = Неопределено;

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

// АПК:78-выкл: для безопасной передачи данных на клиенте между формами, не отправляя их на сервер.
&НаКлиенте

Процедура ВыполнитьРасшифровку(КлиентскиеПараметры, ОбработкаЗавершения) Экспорт
// АПК:78-вкл: для безопасной передачи данных на клиенте между формами, не отправляя их на сервер.

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

	ОписаниеДанных             = КлиентскиеПараметры.ОписаниеДанных;
	ФормаОбъекта               = КлиентскиеПараметры.Форма;
	ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;

	ОбработкаПослеПредупреждения = ОбработкаЗавершения;

	Контекст = Новый Структура("ОбработкаЗавершения", ОбработкаЗавершения);
	РасшифроватьДанные(Новый ОписаниеОповещения("ВыполнитьРасшифровкуЗавершение", ЭтотОбъект, Контекст));

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

// Продолжение процедуры ВыполнитьРасшифровку.
&НаКлиенте

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

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

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

&НаКлиенте

Процедура ПриИзмененииСпискаСертификатов()

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

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

// Продолжение процедуры ПриИзмененииСпискаСертификатов.
&НаКлиенте

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

	СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте, Истина);

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

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

&НаСервере

Процедура СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте, ПроверитьСсылку = Ложь)

	Если ПроверитьСсылку
	   И ЗначениеЗаполнено(Сертификат)
	   И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Сертификат, "Ссылка") <> Сертификат Тогда

		Сертификат = Неопределено;
	КонецЕсли;

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

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

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

&НаКлиенте

[Assistant] Процедура ПродолжитьОткрытиеПослеНачала(Результат, Контекст)


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

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

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

	СертификатыШифрования = Новый Массив;

	НачатьТранзакцию();
	Попытка
		Для каждого ОписаниеОбъекта Из ОписаниеОбъектов Цикл
			ЭлектроннаяПодпись.ЗаписатьСертификатыШифрования(ОписаниеОбъекта.Ссылка,
				СертификатыШифрования, ИдентификаторФормы, ОписаниеОбъекта.Версия);
		КонецЦикла;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Ошибка.Вставить("ОписаниеОшибки", НСтр("ru = 'При очистке сертификатов шифрования возникла ошибка:'")
			+ Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
	КонецПопытки;

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

&НаКлиенте

Процедура ОбработатьОшибку(Оповещение, ОшибкаНаКлиенте, ОшибкаНаСервере)

	Если ОписаниеДанных.Свойство("ПрекратитьВыполнение") Тогда

		Если Не ОписаниеДанных.Свойство("ОписаниеОшибки") Тогда
			ОписаниеДанных.Вставить("ОписаниеОшибки");
		КонецЕсли;

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

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

	Иначе

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

		ДополнительныеПараметры = Новый Структура("Сертификат", Сертификат);

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

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

	КонецЕсли;

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

// Локализация

&НаКлиенте

Процедура Подключаемый_ПодтверждениеОбработкаКоманды(Команда)

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

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

&НаКлиенте

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

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

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

&НаКлиенте

Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент)

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

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

&НаКлиенте

Процедура Подключаемый_ПодтверждениеОбработчикОжидания()

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

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

&НаКлиенте

Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

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

// Конец Локализация

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

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

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

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

	РежимСоздания = Параметры.РежимСоздания;

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

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

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

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

&НаКлиенте
Процедура СоздатьФайлВыполнить()
	Закрыть(РежимСоздания);
КонецПроцедуры

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