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

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

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

[Assistant]
Процедура ПроверитьФормулуИнтерактивно(Формула, Операнды)

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

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

&НаСервере

Функция КартинкаИнформация32()
	Если ВерсияБСПСоответствуетТребованиям() Тогда
		Возврат БиблиотекаКартинок["Информация32"];
	Иначе
		Возврат Новый Картинка;
	КонецЕсли;
КонецФункции

&НаСервере

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

&НаКлиенте

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

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

	Сообщение.Сообщить();
КонецПроцедуры

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


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

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

Функция СтроковоеПредставлениеТипа(Тип)
Представление = "";

	Если ЭтоСсылка(Тип) Тогда

		ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();
		ИмяОбъекта = СтрРазделить(ПолноеИмя, ".")[1];

		Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "СправочникСсылка";

		ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ДокументСсылка";

		ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "БизнесПроцессСсылка";

		ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланВидовХарактеристикСсылка";

		ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланСчетовСсылка";

		ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланВидовРасчетаСсылка";

		ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ЗадачаСсылка";

		ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланОбменаСсылка";

		ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПеречислениеСсылка";

		КонецЕсли;
    // TODO: допиши оставшуюся часть

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

	Представление = "";

	Если ЭтоСсылка(Тип) Тогда

		ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();
		ИмяОбъекта = СтрРазделить(ПолноеИмя, ".")[1];

		Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "СправочникСсылка";

		ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ДокументСсылка";

		ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "БизнесПроцессСсылка";

		ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланВидовХарактеристикСсылка";

		ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланСчетовСсылка";

		ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланВидовРасчетаСсылка";

		ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ЗадачаСсылка";

		ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПланОбменаСсылка";

		ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда
			Представление = "ПеречислениеСсылка";

		КонецЕсли;

		Результат = ?(Представление = "", Представление, Представление + "." + ИмяОбъекта);

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

		Результат = "Неопределено";

	ИначеЕсли Тип = Тип("Строка") Тогда
		Результат = "Строка";

	ИначеЕсли Тип = Тип("Число") Тогда
		Результат = "Число";

	ИначеЕсли Тип = Тип("Булево") Тогда
		Результат = "Булево";

	ИначеЕсли Тип = Тип("Дата") Тогда
		Результат = "Дата";

	Иначе

		Результат = Строка(Тип);

	КонецЕсли;

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

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

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

Функция ТаблицаЗначенийВМассив(ТаблицаЗначений)

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

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

// Форматирует строку в соответствии с заданным шаблоном.
// Возможные значения тегов выделения:
//	 Строка  - выделяет строку жирным шрифтом.
//	 Строка
//
// Пример:
//	Минимальная версия программы 1.1. Обновите программу.
//
// Возвращаемое значение:
//  ФорматированнаяСтрока
//
&НаСервереБезКонтекста

Функция ФорматированнаяСтрока(Знач Строка)

	СтрокиСВыделением = Новый СписокЗначений;
	Пока СтрНайти(Строка, "") <> 0 Цикл
		НачалоВыделения = СтрНайти(Строка, "");
		СтрокаДоОткрывающегоТега = Лев(Строка, НачалоВыделения - 1);
		СтрокиСВыделением.Добавить(СтрокаДоОткрывающегоТега);
		СтрокаПослеОткрывающегоТега = Сред(Строка, НачалоВыделения + 3);
		КонецВыделения = СтрНайти(СтрокаПослеОткрывающегоТега, "");
		ВыделенныйФрагмент = Лев(СтрокаПослеОткрывающегоТега, КонецВыделения - 1);
		СтрокиСВыделением.Добавить(ВыделенныйФрагмент,, Истина);
		СтрокаПослеВыделения = Сред(СтрокаПослеОткрывающегоТега, КонецВыделения + 4);
		Строка = СтрокаПослеВыделения;
	КонецЦикла;
	СтрокиСВыделением.Добавить(Строка);

	СтрокиСоСсылками = Новый СписокЗначений;
	Для Каждого ЧастьСтроки Из СтрокиСВыделением Цикл

		Строка = ЧастьСтроки.Значение;

		Если ЧастьСтроки.Пометка Тогда
			СтрокиСоСсылками.Добавить(Строка,, Истина);
			Продолжить;
		КонецЕсли;

		НачалоВыделения = СтрНайти(Строка, "<a href = ");
		Пока НачалоВыделения <> 0 Цикл
			СтрокаДоОткрывающегоТега = Лев(Строка, НачалоВыделения - 1);
			СтрокиСоСсылками.Добавить(СтрокаДоОткрывающегоТега, );

			СтрокаПослеОткрывающегоТега = Сред(Строка, НачалоВыделения + 9);
			ЗакрывающийТег = СтрНайти(СтрокаПослеОткрывающегоТега, ">");

			Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2));
			Если СтрНачинаетсяС(Ссылка, """") Тогда
				Ссылка = Сред(Ссылка, 2, СтрДлина(Ссылка) - 1);
			КонецЕсли;
			Если СтрЗаканчиваетсяНа(Ссылка, """") Тогда
				Ссылка = Сред(Ссылка, 1, СтрДлина(Ссылка) - 1);
			КонецЕсли;

			СтрокаПослеСсылки = Сред(СтрокаПослеОткрывающегоТега, ЗакрывающийТег + 1);
			КонецВыделения = СтрНайти(СтрокаПослеСсылки, "");
			ТекстСсылки = Лев(СтрокаПослеСсылки, КонецВыделения - 1);
			СтрокиСоСсылками.Добавить(ТекстСсылки, Ссылка);

			СтрокаПослеВыделения = Сред(СтрокаПослеСсылки, КонецВыделения + 4);
			Строка = СтрокаПослеВыделения;

			НачалоВыделения = СтрНайти(Строка, "<a href = ");
		КонецЦикла;
		СтрокиСоСсылками.Добавить(Строка);

	КонецЦикла;

	МассивСтроки = Новый Массив;
	Для Каждого ЧастьСтроки Из СтрокиСоСсылками Цикл

		Если ЧастьСтроки.Пометка Тогда
			//@skip-check new-font
			МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение, Новый Шрифт(,,Истина))); // АПК:1345 - автономная обработка не может использовать стили
		ИначеЕсли Не ПустаяСтрока(ЧастьСтроки.Представление) Тогда
			МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение,,,, ЧастьСтроки.Представление));
		Иначе
			МассивСтроки.Добавить(ЧастьСтроки.Значение);
		КонецЕсли;

	КонецЦикла;

	Возврат Новый ФорматированнаяСтрока(МассивСтроки); // АПК:1356 - можно использовать составную форматированную строку, так как массив строк формируется из переданного в функцию текста.

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

// Формирует представление числа для определенного языка и параметров числа.
//
// Параметры:
//  Шаблон          - Строка - строка, содержит перечисленные через точку с запятой 6 форм строки
//                             для каждой категории числительного:
//                             %1 обозначает позицию числа;
//  Число           - Число - число, которое будет подставлено в строку вместо параметра "%1".
//  Вид             - ВидЧисловогоЗначения - определяет вид числового значения, для которого формируется представление.
//                             Количественное (по умолчанию) или Порядковое.
//  ФорматнаяСтрока - Строка - строка параметров форматирования. См. аналогичный параметр в СтрокаСЧислом.
//
// Возвращаемое значение:
//  Строка - представление строки числа в требуемой форме.
//
// Пример:
//
//  Строка = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(
//		НСтр("ru=';остался %1 день;;осталось %1 дня;осталось %1 дней;осталось %1 дня';
//		     |en=';left %1 day;;;;left %1 days'"),
//		0.05,, "ЧДЦ=1");
//
&НаСервереБезКонтекста

Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = "ЧН=0;")

	Если ПустаяСтрока(Шаблон) Тогда
		Возврат Формат(Число, ФорматнаяСтрока);
	КонецЕсли;

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

	Возврат СтрокаСЧислом(Шаблон, Число, Вид, ФорматнаяСтрока);

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

// Возвращает признак, является ли конфигурация базовой.
//
// Возвращаемое значение:
//   Булево   - Истина, если конфигурация - базовая.
//
&НаСервереБезКонтекста

Функция ЭтоБазоваяВерсияКонфигурации()

	Возврат СтрНайти(ВРег(Метаданные.Имя), "БАЗОВАЯ") > 0;

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

// Возвращает признак включения условного разделения.
// В случае вызова в неразделенной конфигурации возвращает Ложь.
//
&НаСервереБезКонтекста


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

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

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

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

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

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

	КонецЦикла;

	Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.Валюты");
КонецПроцедуры

Процедура УстановитьРасписаниеРегламентногоЗадания() Экспорт

	ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
	Задержка = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 21600); // С 0 до 6 часов утра.

	Расписание = Новый РасписаниеРегламентногоЗадания;
	Расписание.ПериодПовтораДней = 1;
	Расписание.ПериодНедель = 1;
	Расписание.ВремяНачала = '00010101000000' + Задержка;

	ПараметрыЗадания = Новый Структура;
	ПараметрыЗадания.Вставить("Расписание", Расписание);
	ПараметрыЗадания.Вставить("ИнтервалПовтораПриАварийномЗавершении", 600);
	ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 10);

	УстановитьПараметрыРегламентногоЗадания(ПараметрыЗадания);

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

Процедура УстановитьПараметрыРегламентногоЗадания(ИзменяемыеПараметры)
	РегламентныеЗаданияСервер.УстановитьПараметрыРегламентногоЗадания(
		Метаданные.РегламентныеЗадания.ЗагрузкаКурсовВалют, ИзменяемыеПараметры);
КонецПроцедуры

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

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

// Возвращаемое значение:
//  Массив из СправочникСсылка.Валюты
//

Функция ВалютыЗагружаемыеИзИнтернета() Экспорт

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

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

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

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

Функция КодыВалютЗагружаемыхИзИнтернета() Экспорт

	КлассификаторТаблица = КлассификаторВалют();

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

	Возврат ЗагружаемыеПоКлассификатору;

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

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

// См. ИнтеграцияПодсистемБСП.ПриИзмененииДанныхАутентификацииИнтернетПоддержки.

Процедура ПриИзмененииДанныхАутентификацииИнтернетПоддержки(ДанныеПользователя) Экспорт
	УстановитьПараметрыРегламентногоЗадания(Новый Структура("Использование", ДанныеПользователя <> Неопределено));
КонецПроцедуры

Функция ИдентификаторКлассификатора()

	Возврат "Currencies";

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

Функция КлассификаторВалют() Экспорт

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

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

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

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

				ПотокВПамяти = Новый ПотокВПамяти;
				ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
				ЗаписьДанных.Записать(ДвоичныеДанные);
				ЗаписьДанных.Закрыть();
				ПотокВПамяти.Перейти(0, ПозицияВПотоке.Начало);

				ЧтениеТекста = Новый ЧтениеТекста(ПотокВПамяти);
				КлассификаторXML = ЧтениеТекста.Прочитать();
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

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

	Результат = ОбщегоНазначения.ПрочитатьXMLВТаблицу(КлассификаторXML).Данные;
	Результат.Индексы.Добавить("Code");
	Результат.Индексы.Добавить("RBCLoading");

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

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

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

#КонецЕсли

[Assistant] Процедура ОтключитьЗагрузкуКурсаВалюты643ИзИнтернета(Параметры)


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

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

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

	ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница;

	Если ТекущаяСтраница = Элементы.ШагВыборЦелевогоЭлемента Тогда

		СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект);

	ИначеЕсли ТекущаяСтраница = Элементы.ШагЗамена Тогда

		НастройкиМастера.ПоказатьДиалогПередЗакрытием = Истина;
		ЦелевойЭлементРезультат = ЦелевойЭлемент; // Сохранение параметров запуска.
		ЗапуститьФоновоеЗаданиеКлиент();

	ИначеЕсли ТекущаяСтраница = Элементы.ШагПовторЗамены Тогда

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

		КоличествоЗамен = ЗаменяемыеСсылки.Количество();
		Элементы.РезультатНеудачныеЗамены.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось заменить элементы (%1 из %2). В некоторых местах использования не может быть произведена
			           |автоматическая замена на ""%3""'"),
			Неудачные.Количество(),
			КоличествоЗамен,
			ЦелевойЭлемент);

		// Формирование списка успешных замен и чистка списка заменяемых.
		СписокОбновленного = Новый Массив;
		СписокОбновленного.Добавить(ЦелевойЭлемент);
		Для Номер = 1 По КоличествоЗамен Цикл
			ОбратныйИндекс = КоличествоЗамен - Номер;
			Ссылка = ЗаменяемыеСсылки[ОбратныйИндекс].Ссылка;
			Если Ссылка <> ЦелевойЭлемент И Неудачные[Ссылка] = Неопределено Тогда
				ЗаменяемыеСсылки.Удалить(ОбратныйИндекс);
				СписокОбновленного.Добавить(Ссылка);
			КонецЕсли;
		КонецЦикла;

		// Оповещение о выполненных заменах.
		ОповеститьОбУспешнойЗамене(СписокОбновленного);

	КонецЕсли;

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

&НаКлиенте

Процедура ШагМастераДалее()

	ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница;
	Если ТекущаяСтраница = Элементы.ШагВыборЦелевогоЭлемента Тогда
		ШагВыборЦелевогоЭлементаПриНажатииКнопкиДалее();
	ИначеЕсли ТекущаяСтраница = Элементы.ШагПовторЗамены Тогда
		ПерейтиНаШагМастера(Элементы.ШагЗамена);
	Иначе
		ТекущийШаг = НастройкиМастера.ТекущийШаг; // см. ДобавитьШагМастера
		ПерейтиНаШагМастера(ТекущийШаг.Индекс + 1);
	КонецЕсли;

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

&НаКлиенте

Процедура ШагМастераНазад()

	ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница;
	Если ТекущаяСтраница = Элементы.ШагПовторЗамены Тогда
		ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента);
	Иначе
		Шаг = НастройкиМастера.ТекущийШаг; // см. ДобавитьШагМастера
		ПерейтиНаШагМастера(Шаг.Индекс - 1);
	КонецЕсли;

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

&НаКлиенте

Процедура ШагМастераОтмена()

	ТекущаяСтраница = Элементы.ШагиМастера.ТекущаяСтраница;
	Если ТекущаяСтраница = Элементы.ШагЗамена Тогда
		НастройкиМастера.ПоказатьДиалогПередЗакрытием = Ложь;
	КонецЕсли;

	Если Открыта() Тогда
		Закрыть();
	КонецЕсли;

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

////////////////////////////////////////////////////////////////////////////////
// Служебные процедуры замены и объединения элементов

&НаКлиенте

Процедура ШагВыборЦелевогоЭлементаПриНажатииКнопкиДалее()

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

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

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

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

&НаКлиенте

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

&НаКлиенте

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

&НаКлиенте

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

	// Дополнительная проверка по прикладным данным.
	ПроверкаДопустимостиЗаменыПрикладнойОбласти();
КонецПроцедуры

&НаКлиенте

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

		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить(0, НСтр("ru = 'ОК'"));

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

	Шаг = НастройкиМастера.ТекущийШаг;// см. ДобавитьШагМастера
	ПерейтиНаШагМастера(Шаг.Индекс + 1);
КонецПроцедуры

&НаКлиенте

[Assistant] Процедура ПриАктивацииШагаМастера()


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

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

Функция ЗаявлениеНаВыпускСертификатаДоступно()
Экспорт

	Возврат ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация")
    // TODO: допиши оставшуюся часть

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

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

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

// Действия при создании формы сертификата на сервере.
//
// Параметры:
//   Объект           - СправочникОбъект.СертификатыКлючейЭлектроннойПодписиИШифрования - сертификат.
//   ОткрытьЗаявление - Булево - признак того, что вместо формы сертификата необходимо открыть форму
//                    заявления на выпуск нового сертификата.
//

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

	СостояниеЗаявления = СостояниеЗаявления(Объект);

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

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

// Действия при создании или чтении формы сертификата на сервере.
//
// Параметры:
//   Объект   - СправочникОбъект.СертификатыКлючейЭлектроннойПодписиИШифрования - сертификат.
//   Элементы - ЭлементыФормы - элементы формы, где:
//     * ФормаПоказатьЗаявлениеПоКоторомуБылПолученСертификат - ПолеФормы
//     * ПоказатьЗаявлениеПоКоторомуБылПолученСертификат - ПолеФормы
//

Процедура ПриСозданииНаСервереПриЧтенииНаСервере(Объект, Элементы) Экспорт

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

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

// Параметры:
//  ЭлементУсловногоОформления - ЭлементУсловногоОформленияКомпоновкиДанных
//

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

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

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

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

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

	СписокСертификатов = Новый СписокЗначений;

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

	СостоянияЗаявления = Новый Массив;
	СостоянияЗаявления.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.Отправлено);
	СостоянияЗаявления.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.ИсполненоРаспискаНеОтправлена);
	СостоянияЗаявления.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.ИсполненоСертификатНеУстановлен);
	СостоянияЗаявления.Добавить(Перечисления.СостоянияЗаявленияНаВыпускСертификата.Исполнено);

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

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

		СписокСертификатов.Добавить(Выборка.Сертификат,
			СтрШаблон("%1 (%2)", Выборка.Представление, Состояние));

	КонецЦикла;

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

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

Процедура ДополнитьЗапросПриДобавленииСертификатов(ТекстЗапроса) Экспорт

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

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"И &ДополнительноеСоединение", "
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаявленияНаВыпускСертификата КАК ЗаявленияНаВыпускСертификата
		|		ПО Сертификаты.Ссылка = ЗаявленияНаВыпускСертификата.Сертификат");

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

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

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

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ДополнительноеУсловие",
		"ЗаявленияНаВыпускСертификата.СостояниеЗаявления Есть NULL
		|	 ИЛИ ЗаявленияНаВыпускСертификата.СостояниеЗаявления = ЗНАЧЕНИЕ(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено)");

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

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

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"И &ДополнительноеСоединение", "
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаявленияНаВыпускСертификата КАК ЗаявленияНаВыпускСертификата
		|		ПО СертификатыПереопределяемый.Ссылка = ЗаявленияНаВыпускСертификата.Сертификат");

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ДополнительноеПоле",
		"ЗаявленияНаВыпускСертификата.СостояниеЗаявления");

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ЭтоЗаявление",
		"НЕ ЗаявленияНаВыпускСертификата.СостояниеЗаявления Есть NULL
		|	И ЗаявленияНаВыпускСертификата.СостояниеЗаявления <> Значение(Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено)");

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

// Добавить легенду.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ГруппаЛегенда - ГруппаФормы
//

Tasks-develope/src/cf/DataProcessors/ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата/Ext/ManagerModule.bsl


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

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

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

	Если ВариантВыгрузки <= 0 Тогда
		// без изменений
		Возврат;
	КонецЕсли;

	ДеревоИзменений = СформироватьДеревоЗначений();

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

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

//  Возвращает список значений из представлений возможных настроек.
//
//  Параметры:
//      УзелОбмена - ПланОбменаСсылка - узел обмена для возвращаемых настроек. Если не указано, то используется
//                                      текущее значение реквизита "УзелИнформационнойБазы".
//      Варианты - Массив             - если указано, то фильтруем восстанавливаемые настройки по вариантам
//                                      0 - без отбора, 1 - отбор всех документов, 2 - подробный, 3 - сценарий узла.
//
//  Возвращаемое значение:
//      СписокЗначений - возможные настройки.
//

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

	ПараметрыНастроек = СтруктураПараметровНастроек(УзелОбмена);

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

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

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

//  Восстанавливает значения реквизитов текущего объекта из указанного элемента списка.
//
//  Параметры:
//      Представление       - Строка - представление восстанавливаемых настроек.
//      Варианты            - Массив - если указано, то фильтруем восстанавливаемые настройки по вариантам
//                                     0 - без отбора, 1 - отбор всех документов, 2 - подробный, 3 - сценарий узла.
//      АдресХранилищаФормы - Строка
//                          - УникальныйИдентификатор - необязательный адрес для сохранения.
//
// Возвращаемое значение:
//      Булево - Истина - успешно восстановлено, Ложь - настройка не найдена.
//

Функция ВосстановитьТекущееИзНастроек(Представление, Варианты = Неопределено, АдресХранилищаФормы = Неопределено) Экспорт

	СписокВариантов = ПрочитатьСписокНастроек(Варианты);
	ЭлементСписка = НайтиПоПредставлениюЭлементСписка(СписокВариантов, Представление);

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

		// Компоновщик собираем по частям.
		Данные = КомпоновщикНастроекОбщегоОтбора();
		КомпоновщикОтбораВсехДокументов = Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикОтбораВсехДокументов.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки));
		КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ЭлементСписка.Значение._НастройкиКомпоновщикаОтбораВсехДокументов);

		// Инициализация вспомогательного.
		Если АдресХранилищаФормы<>Неопределено Тогда
			АдресКомпоновщикаВсехДокументов = ПоместитьВоВременноеХранилище(Данные, АдресХранилищаФормы);
		КонецЕсли;
	КонецЕсли;

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

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

Процедура СохранитьТекущееВНастройки(Представление) Экспорт
	СписокВариантов = ПрочитатьСписокНастроек();

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

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

	ЭлементСписка.Значение = Новый Структура(СохраняемыеРеквизиты);
	ЗаполнитьЗначенияСвойств(ЭлементСписка.Значение, ЭтотОбъект);

	ЭлементСписка.Значение.Вставить("_НастройкиКомпоновщикаОтбораВсехДокументов", КомпоновщикОтбораВсехДокументов.Настройки);

	ПараметрыНастроек = СтруктураПараметровНастроек();

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

//  Удаляет вариант настроек из списка.
//
//  Параметры:
//      Представление          - Строка - представление настроек.
//

Процедура УдалитьВариантНастроек(Представление) Экспорт
	СписокВариантов = ПрочитатьСписокНастроек();
	ЭлементСписка = НайтиПоПредставлениюЭлементСписка(СписокВариантов, Представление);

	Если ЭлементСписка<>Неопределено Тогда
		СписокВариантов.Удалить(ЭлементСписка);
		СписокВариантов.СортироватьПоПредставлению();
		СохранитьСписокНастроек(СписокВариантов);
	КонецЕсли;

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

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

[Assistant] Процедура ЗарегистрироватьДополнительныеИзменения()


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

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

Функция ЗаписатьВПротоколВыполнения(Код = "",
									СтруктураЗаписи=Неопределено,
									ВзвестиФлагОшибок=Истина,
									Уровень=0,
									Выравнивание=22,
									БезусловнаяЗаписьВПротоколОбмена = Ложь,
									Знач РезультатВыполненияОбмена = Неопределено)
Экспорт
	//
	Отступ = "";
	Для Сч = 0 По Уровень-1 Цикл
		Отступ = Отступ + Символы.Таб;
	КонецЦикла;

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

		Если СообщенияОбОшибках = Неопределено Тогда
			ИнициализацияСообщений();
		КонецЕсли;

		Стр = СообщенияОбОшибках[Код];

	Иначе

		Стр = Строка(Код);

	КонецЕсли;

	Стр = Отступ + Стр;

	Если СтруктураЗаписи <> Неопределено Тогда

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

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

		КонецЦикла;

	КонецЕсли;

	ПолеСтрокаСообщенияОбОшибке = Стр;

	Если ВзвестиФлагОшибок Тогда

		УстановитьФлагОшибки();

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

	УстановитьРезультатВыполненияОбмена(РезультатВыполненияОбмена);

	Если ФайлПротоколаДанных <> Неопределено Тогда

		Если ВзвестиФлагОшибок Тогда

			ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + "Ошибка.");

		КонецЕсли;

		Если ВзвестиФлагОшибок ИЛИ БезусловнаяЗаписьВПротоколОбмена ИЛИ ВыводВПротоколИнформационныхСообщений Тогда

			ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + СтрокаСообщенияОбОшибке());

		КонецЕсли;

	КонецЕсли;

	Если РезультатВыполненияОбменаОшибка(РезультатВыполненияОбмена) Тогда

		УровеньЖР = УровеньЖурналаРегистрации.Ошибка;

	ИначеЕсли РезультатВыполненияОбменаПредупреждение(РезультатВыполненияОбмена) Тогда
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ЗаписатьВПротоколВыполнения(Код = "",
									СтруктураЗаписи=Неопределено,
									ВзвестиФлагОшибок=Истина,
									Уровень=0,
									Выравнивание=22,
									БезусловнаяЗаписьВПротоколОбмена = Ложь,
									Знач РезультатВыполненияОбмена = Неопределено) Экспорт
	//
	Отступ = "";
	Для Сч = 0 По Уровень-1 Цикл
		Отступ = Отступ + Символы.Таб;
	КонецЦикла;

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

		Если СообщенияОбОшибках = Неопределено Тогда
			ИнициализацияСообщений();
		КонецЕсли;

		Стр = СообщенияОбОшибках[Код];

	Иначе

		Стр = Строка(Код);

	КонецЕсли;

	Стр = Отступ + Стр;

	Если СтруктураЗаписи <> Неопределено Тогда

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

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

		КонецЦикла;

	КонецЕсли;

	ПолеСтрокаСообщенияОбОшибке = Стр;

	Если ВзвестиФлагОшибок Тогда

		УстановитьФлагОшибки();

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

	УстановитьРезультатВыполненияОбмена(РезультатВыполненияОбмена);

	Если ФайлПротоколаДанных <> Неопределено Тогда

		Если ВзвестиФлагОшибок Тогда

			ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + "Ошибка.");

		КонецЕсли;

		Если ВзвестиФлагОшибок ИЛИ БезусловнаяЗаписьВПротоколОбмена ИЛИ ВыводВПротоколИнформационныхСообщений Тогда

			ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + СтрокаСообщенияОбОшибке());

		КонецЕсли;

	КонецЕсли;

	Если РезультатВыполненияОбменаОшибка(РезультатВыполненияОбмена) Тогда

		УровеньЖР = УровеньЖурналаРегистрации.Ошибка;

	ИначеЕсли РезультатВыполненияОбменаПредупреждение(РезультатВыполненияОбмена) Тогда

		УровеньЖР = УровеньЖурналаРегистрации.Предупреждение;

	Иначе

		УровеньЖР = УровеньЖурналаРегистрации.Информация;

	КонецЕсли;

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

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

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

	КонецЕсли;

	Если ЗаписатьВРезультатыОбменаДанными Тогда

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

		Если ЗначениеЗаполнено(СсылкаДляПереходаПриВозникновенииОшибки) Тогда

			ПараметрыЗаписи.ПроблемныйОбъект = СсылкаДляПереходаПриВозникновенииОшибки;

		КонецЕсли;

		Если РежимОбмена = "Выгрузка" Тогда

			ПараметрыЗаписи.ТипПроблемы = Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриОтправкеДанных;

		ИначеЕсли РежимОбмена = "Загрузка" Тогда

			ПараметрыЗаписи.ТипПроблемы = Перечисления.ТипыПроблемОбменаДанными.ОшибкаВыполненияКодаОбработчиковПриПолученииДанных;

		КонецЕсли;

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

	КонецЕсли;

	Возврат СтрокаСообщенияОбОшибке();

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

Функция ЗаписатьИнформациюОбОшибкеВПротокол(КСообщенияОбОшибках, СтрокаОшибки, Объект, ТипОбъекта = Неопределено)

	ЗП         = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки);
	ЗП.Объект  = Объект;

	Если ТипОбъекта <> Неопределено Тогда
		ЗП.ТипОбъекта     = ТипОбъекта;
	КонецЕсли;

	СтрокаОшибки = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП);

	Возврат СтрокаОшибки;

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

Процедура ЗаписатьИнформациюОбОшибкеОбработчикаОчисткиДанных(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравилаОчисткиДанных, Объект = "", ИмяОбработчика = "")

	ЗП                        = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки);
	ЗП.ПОД                    = ИмяПравилаОчисткиДанных;

	Если Объект <> "" Тогда
		ЗП.Объект                 = Строка(Объект) + "  (" + ТипЗнч(Объект) + ")";
	КонецЕсли;

	Если ИмяОбработчика <> "" Тогда
		ЗП.Обработчик             = ИмяОбработчика;
	КонецЕсли;

	СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП);

	Если Не ПродолжитьПриОшибке Тогда
		ВызватьИсключение СтрокаСообщенияОбОшибке;
	КонецЕсли;

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

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

	ЗП                        = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки);
	ЗП.ИмяПКО                 = ИмяПравила;
	ЗП.ТипОбъекта             = ТипОбъекта;
	ЗП.Обработчик             = ИмяОбработчика;

	Если Не ПустаяСтрока(Источник) Тогда

		ЗП.Источник           = Источник;

	КонецЕсли;

	Если Объект <> Неопределено Тогда

		ЗП.Объект                 = Строка(Объект);

	КонецЕсли;

	СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП);

	Если Не ПродолжитьПриОшибке Тогда
		ВызватьИсключение СтрокаСообщенияОбОшибке;
	КонецЕсли;

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

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

	ЗП                        = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки);
	ЗП.ПКО                    = ПКО.Имя + "  (" + ПКО.Наименование + ")";

	Попытка
		ЗП.Объект                 = Строка(Источник) + "  (" + ТипЗнч(Источник) + ")";
	Исключение
		ЗП.Объект                 = "(" + ТипЗнч(Источник) + ")";
	КонецПопытки;

	ЗП.Обработчик             = ИмяОбработчика;

	СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП);

	Если Не ПродолжитьПриОшибке Тогда
		ВызватьИсключение СтрокаСообщенияОбОшибке;
	КонецЕсли;

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

Процедура ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КСообщенияОбОшибках, СтрокаОшибки, ПКО, ПКС, Источник = "",
	ИмяОбработчика = "", Значение = Неопределено)

	ЗП                        = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки);
	ЗП.ПКО                    = ПКО.Имя + "  (" + ПКО.Наименование + ")";
	ЗП.ПКС                    = ПКС.Имя + "  (" + ПКС.Наименование + ")";

	Попытка
		ЗП.Объект                 = Строка(Источник) + "  (" + ТипЗнч(Источник) + ")";
	Исключение
		ЗП.Объект                 = "(" + ТипЗнч(Источник) + ")";
	КонецПопытки;

	ЗП.СвойствоПриемника      = ПКС.Приемник + "  (" + ПКС.ТипПриемника + ")";

	Если ИмяОбработчика <> "" Тогда
		ЗП.Обработчик         = ИмяОбработчика;
	КонецЕсли;

	Если Значение <> Неопределено Тогда
		ЗП.КонвертируемоеЗначение = Строка(Значение) + "  (" + ТипЗнч(Значение) + ")";
	КонецЕсли;

	СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП);

	Если Не ПродолжитьПриОшибке Тогда
		ВызватьИсключение СтрокаСообщенияОбОшибке;
	КонецЕсли;

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

Процедура ЗаписатьИнформациюОбОшибкеОбработчикиПВД(КСообщенияОбОшибках, СтрокаОшибки, ИмяПравила, ИмяОбработчика, Объект = Неопределено)

	ЗП                        = ЗаписьПротоколаОбмена(КСообщенияОбОшибках, СтрокаОшибки);
	ЗП.ПВД                    = ИмяПравила;

	Если Объект <> Неопределено Тогда
		ЗП.Объект                 = Строка(Объект) + "  (" + ТипЗнч(Объект) + ")";
	КонецЕсли;

	ЗП.Обработчик             = ИмяОбработчика;

	СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(КСообщенияОбОшибках, ЗП);

	Если Не ПродолжитьПриОшибке Тогда
		ВызватьИсключение СтрокаСообщенияОбОшибке;
	КонецЕсли;

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


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

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

Процедура ИмяФункции(Отказ, ЧтениеXML, Знач ЗагрузитьТолькоПараметры, Знач ЗагрузитьМетаданные, СообщениеОбОшибке = "")

	ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

	Попытка
		ЧтениеСообщения.НачатьЧтение(ЧтениеXML, ДопустимыйНомерСообщения.Больший);
	Исключение
		// Задан неизвестный план обмена;
		// указан узел, не входящий в план обмена;
		// номер сообщения не соответствует ожидаемому.
		СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ЗафиксироватьЗавершениеОбмена(Отказ, СообщениеОбОшибке, ОшибкаНачалаЧтенияФайлаСообщенияОбмена());
		Возврат;
	КонецПопытки;

	УзелОбщихДанных = Неопределено;
	НомерПринятого = ЧтениеСообщения.НомерПринятого;
	УзелОбмена = ЧтениеСообщения.Отправитель;

	Если ЗагрузитьТолькоПараметры Тогда

		Если ЗагрузитьМетаданные Тогда

			Попытка

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

				// Получаем изменения конфигурации, изменения данных игнорируем.
				ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции);

				// Читаем приоритетные данные (предопределенные элементы, идентификаторы объектов метаданных).
				ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения, УзелОбщихДанных);

				// Сообщение считаем не принятым, для этого прерываем чтение.
				ЧтениеСообщения.ПрерватьЧтение();

				УстановитьПривилегированныйРежим(Истина);
				ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском(
					"ЗагрузкаПараметровРаботыПрограммы", Ложь);
				УстановитьПривилегированныйРежим(Ложь);
			Исключение
				УстановитьПривилегированныйРежим(Истина);
				ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском(
					"ЗагрузкаПараметровРаботыПрограммы", Ложь);
				УстановитьПривилегированныйРежим(Ложь);

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

		Иначе

			Попытка

				// Пропускаем изменения конфигурации и изменения данных в сообщении обмена.
				ЧтениеСообщения.ЧтениеXML.Пропустить(); // <Changes>...</Changes>

				ЧтениеСообщения.ЧтениеXML.Прочитать(); // </Changes>

				// Читаем приоритетные данные (предопределенные элементы, идентификаторы объектов метаданных).
				ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения, УзелОбщихДанных);

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

		КонецЕсли;

	Иначе

		Если ЕстьРасширениеВСообщениеОбмена(ЧтениеСообщения) Тогда
			ОбменДаннымиСлужебный.ВключитьЗагрузкуРасширенийИзменяющиеСтруктуруДанных();
		КонецЕсли;

		Попытка

			// Получаем изменения конфигурации и изменения данных из сообщения обмена.
			ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции);

			// Читаем приоритетные данные (предопределенные элементы, идентификаторы объектов метаданных).
			ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения, УзелОбщихДанных);

			// Сообщение считаем принятым
			ЧтениеСообщения.ЗакончитьЧтение();

	        // Если сообщение обмена принято без ошибок, то нет необходимости в загрузке расширений
			ОбменДаннымиСлужебный.ОтключитьЗагрузкуРасширенийИзменяющихСтруктуруДанных();

		Исключение

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

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

	КонецЕсли;

	// Запись общих данных узлов выполняется после чтения сообщения.
	Если УзелОбщихДанных <> Неопределено Тогда

		ГлавныйУзелСсылка  = ПланыОбмена.ГлавныйУзел();

		НачатьТранзакцию();
		Попытка
		    Блокировка = Новый БлокировкаДанных;

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

			Блокировка.Заблокировать();

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

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

	КонецЕсли;

	РегистрыСведений.ИзмененияОбщихДанныхУзлов.УдалитьРегистрациюИзменений(УзелОбмена, НомерПринятого);

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

Процедура ЗаписатьИзмененияВФайлСообщенияОбмена(Отказ, ЗаписьXML, СообщениеОбОшибке = "")

	ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

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

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

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

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

	Попытка
		ОбменДаннымиСлужебный.ОчиститьПриоритетныеДанныеОбмена();

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

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

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

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

// Запись приоритетных данных в сообщение обмена.
// Например, предопределенных элементов и идентификаторов объектов метаданных.
//

[Assistant] Процедура ПрочитатьФайлСообщенияОбмена(Отказ, ЧтениеXML, Знач ЗагрузитьТолькоПараметры, Знач ЗагрузитьМетаданные, СообщениеОбОшибке = "")

Tasks-develope/src/cf/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/Ext/ObjectModule.bsl


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

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

Процедура ИмяФункции(Данные)

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

	МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Данные.Ссылка);

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

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

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

	Иначе
		// Если предопределенный элемент существует предварительная загрузка не требуется.
	КонецЕсли;

	Данные = Объект;

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

Процедура ДобавитьОписаниеДублейПредопределенного(ЗаписанныйОбъект, ДублиПредопределенных, Отказ, ОписаниеОтказа)

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

	Таблица = МетаданныеОбъекта.ПолноеИмя();
	ИмяПредопределенныхДанных = ЗаписанныйОбъект.ИмяПредопределенныхДанных;
	Ссылка = ЗаписанныйОбъект.Ссылка;

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

	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", Таблица);
	Выборка = Запрос.Выполнить().Выбрать();

	ИдентификаторыСсылокДублей = "";
	КоличествоДублей = 0;
	НайденныеСсылки = Новый Соответствие;
	ЗагружаемаяСсылкаНайдена = Ложь;

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

	Если КоличествоДублей = 0 Тогда
		Возврат;
	КонецЕсли;

	ЗаписатьВЖурнал = Истина;

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

		Описание = "";
		МодульУправлениеДоступомСлужебный.ПриОбнаруженииНеУникальностиПредопределенного(
			ЗаписанныйОбъект, ЗаписатьВЖурнал, Отказ, Описание);

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

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

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

Функция НайденыНеУникальныеЗаписи(Таблица)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ИСТИНА КАК ЗначениеИстина
	|ИЗ
	|	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных
	|
	|СГРУППИРОВАТЬ ПО
	|	ИдентификаторыОбъектовМетаданных.Ссылка
	|
	|ИМЕЮЩИЕ
	|	КОЛИЧЕСТВО(ИдентификаторыОбъектовМетаданных.Ссылка) > 1";

	Возврат Не Запрос.Выполнить().Пустой();

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

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

Процедура ОбновитьУдалениеПредопределенных()

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

	КоллекцииМетаданных = Новый Массив;
	КоллекцииМетаданных.Добавить(Метаданные.Справочники);
	КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик);
	КоллекцииМетаданных.Добавить(Метаданные.ПланыСчетов);
	КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовРасчета);

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

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

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


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

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

Процедура ИмяФункции(Таблица)

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

	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", Таблица);

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

	Пока Выборка.Следующий() Цикл

		Если СтрНачинаетсяС(Выборка.ИмяПредопределенныхДанных, "#") Тогда

			Объект = Выборка.Ссылка.ПолучитьОбъект();
			Объект.ИмяПредопределенныхДанных = "";
			Объект.ПометкаУдаления = Истина;

			Объект.ДополнительныеСвойства.Вставить("ПропуститьЗаписьВерсииОбъекта");
			ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект);

		КонецЕсли;

	КонецЦикла;

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

////////////////////////////////////////////////////////////////////////////////
// Локальные служебные функции-свойства.

Функция ИмяФайлаСообщенияОбмена()

	Если Не ЗначениеЗаполнено(ПолеИмяФайлаСообщенияОбмена) Тогда

		ПолеИмяФайлаСообщенияОбмена = "";

	КонецЕсли;

	Возврат ПолеИмяФайлаСообщенияОбмена;

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

////////////////////////////////////////////////////////////////////////////////
// Описания ошибок контекста выполнения.

Функция ОшибкаОткрытияФайлаСообщенияОбмена()

	Возврат НСтр("ru = 'Ошибка открытия файла сообщения обмена'", ОбщегоНазначения.КодОсновногоЯзыка());

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

Функция ОшибкаНачалаЧтенияФайлаСообщенияОбмена()

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

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

Функция ОшибкаНачалаЗаписиФайлаСообщенияОбмена()

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

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

Функция ОшибкаЧтенияФайлаСообщенияОбмена()

	Возврат НСтр("ru = 'Ошибка чтения файла сообщения обмена'", ОбщегоНазначения.КодОсновногоЯзыка());

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

Функция ОшибкаЗаписиФайлаСообщенияОбмена()

	Возврат НСтр("ru = 'Ошибка записи данных в файл сообщения обмена'");

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

Функция ОшибкаВидаОбменаДанными()

	Возврат НСтр("ru = 'Обмен не по правилам конвертации не поддерживается'", ОбщегоНазначения.КодОсновногоЯзыка());

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

Функция ЕстьРасширениеВСообщениеОбмена(ЧтениеСообщения)

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

	ЕстьРасширения = Ложь;
	ЕстьРасширенияИзменяющиеСтруктуруДанных = Ложь;

	ФайлОбмена = Новый ЧтениеXML;

	ФайлОбмена.ОткрытьФайл(ЧтениеСообщения.ЧтениеXML.БазовыйURI);

	Пока ФайлОбмена.Прочитать() Цикл

		Если ФайлОбмена.Имя = "v8de:Data"
			Или ФайлОбмена.ЛокальноеИмя = "v8de:ConfigurationExtensions"
			И ФайлОбмена.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда

			Прервать;

		КонецЕсли;

		Если ФайлОбмена.Имя = "v8de:ConfigurationExtensions" Тогда

			ЕстьРасширения = Истина;
			Продолжить;

		КонецЕсли;

		Если ЕстьРасширения И ФайлОбмена.Имя = "v8md:Metadata"
			Или ФайлОбмена.Имя = "v8de:ConfigurationExtensionDeletion" Тогда

			ЕстьРасширенияИзменяющиеСтруктуруДанных = Истина;
			Прервать;

		КонецЕсли;

	КонецЦикла;

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

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

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

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

[Assistant] Процедура ОбновитьУдалениеПредопределенного(Таблица)


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

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

Функция ИмяФункции() Экспорт

	Если ДельтаБезУчетаВладельцев.Добавляемые.Количество() > 0 Тогда
		Возврат Истина;
	КонецЕсли;

	Если ДельтаБезУчетаВладельцев.Удаляемые.Количество() > 0 Тогда
		Возврат Истина;
	КонецЕсли;

	Для Каждого ОперацияАдминистрирования Из ОперацииАдминистрирования Цикл
		Если ОперацияАдминистрирования.Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Удаление Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;

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

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

// Проверяет необходимости записи разрешений в регистры.
//
// Возвращаемое значение:
//   Булево
//

Функция ТребуетсяЗаписьРазрешенийВРегистр() Экспорт

	Если ДельтаВРазрезеВладельцев.Добавляемые.Количество() > 0 Тогда
		Возврат Истина;
	КонецЕсли;

	Если ДельтаВРазрезеВладельцев.Удаляемые.Количество() > 0 Тогда
		Возврат Истина;
	КонецЕсли;

	Для Каждого ОперацияАдминистрирования Из ОперацииАдминистрирования Цикл
		Если ОперацияАдминистрирования.Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Удаление Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;

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

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

// Возвращает представление запросов разрешений на использование внешних ресурсов.
//
// Параметры:
//  КакТребуемые - Булево - представление формируется как список разрешений, а не как список операций
//    при изменении разрешений.
//
// Возвращаемое значение:
//   ТабличныйДокумент
//

Функция Представление(Знач КакТребуемые = Ложь) Экспорт

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

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

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

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

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

	Для Каждого Описание Из ОперацииАдминистрирования Цикл

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

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

		Если ЭтоПрофильКонфигурации Тогда

			ПриоритетДополнительнойОперации = Ложь;

			Если Описание.Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Создание Тогда
				ДополнительнаяОперация = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Назначение;
			КонецЕсли;

			Если Описание.Операция = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.Удаление Тогда
				ДополнительнаяОперация = Перечисления.ОперацииАдминистрированияПрофилейБезопасности.УдалениеНазначения;
				ПриоритетДополнительнойОперации = Истина;
			КонецЕсли;

			ДополнительныйЭлемент = Новый Структура("Операция,Профиль,Разрешения", ДополнительнаяОперация, Описание.Имя);

		КонецЕсли;

		Если ЭтоПрофильКонфигурации И ПриоритетДополнительнойОперации Тогда

			Результат.Добавить(ДополнительныйЭлемент);

		КонецЕсли;

		Результат.Добавить(ЭлементРезультата);

		Если ЭтоПрофильКонфигурации И Не ПриоритетДополнительнойОперации Тогда

			Результат.Добавить(ДополнительныйЭлемент);

		КонецЕсли;

	КонецЦикла;

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

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

// Сериализует внутреннее состояние объекта.
//
// Возвращаемое значение:
//   Строка.
//

Функция ЗаписатьСостояниеВСтрокуXML() Экспорт

	Состояние = Новый Структура();

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

	Возврат ОбщегоНазначения.ЗначениеВСтрокуXML(Состояние);

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

// Десериализует внутреннее состояние объекта.
//
// Параметры:
//  СтрокаXML - Строка - результат, возвращенный функцией ЗаписатьСостояниеВСтрокуXML().
//

Процедура ПрочитатьСостояниеИзСтрокиXML(Знач СтрокаXML) Экспорт

	Состояние = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);

	ИсходныйСрезРазрешенийВРазрезеВладельцев = Состояние.ИсходныйСрезРазрешенийВРазрезеВладельцев;
	РезультатПримененияЗапросовВРазрезеВладельцев = Состояние.РезультатПримененияЗапросовВРазрезеВладельцев;
	ДельтаВРазрезеВладельцев = Состояние.ДельтаВРазрезеВладельцев;
	ИсходныйСрезРазрешенийБезУчетаВладельцев = Состояние.ИсходныйСрезРазрешенийБезУчетаВладельцев;
	РезультатПримененияЗапросовБезУчетаВладельцев = Состояние.РезультатПримененияЗапросовБезУчетаВладельцев;
	ДельтаБезУчетаВладельцев = Состояние.ДельтаБезУчетаВладельцев;
	ОперацииАдминистрирования = Состояние.ОперацииАдминистрирования;
	ИдентификаторыЗапросов = Состояние.ИдентификаторыЗапросов;
	ОчисткаРазрешенийПередПрименением = Состояние.ОчисткаРазрешенийПередПрименением;

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

// Фиксирует в ИБ факт применения запросов на использование внешних ресурсов.
//

[Assistant] Функция ТребуетсяПрименениеРазрешенийВКластереСерверов()


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

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

Процедура РассчитатьДельтуВРазрезеВладельцев()
ДельтаВРазрезеВладельцев = Новый Структура();

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

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

	// Сравниваем исходные разрешения с результирующими.

	Для Каждого Строка Из ИсходныйСрезРазрешенийВРазрезеВладельцев Цикл

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

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

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Если СтрокаРезультата = Неопределено Или СтрокаРезультата.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

				// Разрешение было в исходных, но отсутствует в результирующих - это удаляемое разрешение.

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

				Если СтрокаУдаляемых.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

					СтрокаУдаляемых.Разрешения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

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

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура РассчитатьДельтуВРазрезеВладельцев()

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

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

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

	// Сравниваем исходные разрешения с результирующими.

	Для Каждого Строка Из ИсходныйСрезРазрешенийВРазрезеВладельцев Цикл

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

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

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Если СтрокаРезультата = Неопределено Или СтрокаРезультата.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

				// Разрешение было в исходных, но отсутствует в результирующих - это удаляемое разрешение.

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

				Если СтрокаУдаляемых.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

					СтрокаУдаляемых.Разрешения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

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

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

	// Сравниваем результирующие разрешения с исходными.

	Для Каждого Строка Из РезультатПримененияЗапросовВРазрезеВладельцев Цикл

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

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

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Если ИсходнаяСтрока = Неопределено ИЛИ ИсходнаяСтрока.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

				// Разрешение есть в результирующих, но отсутствует в исходных - это добавляемое разрешение.

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

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

					СтрокаДобавляемых.Разрешения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

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

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

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

// Рассчитывает дельту двух срезов разрешений без учета владельцев разрешений.
//


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

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

Процедура РассчитатьДельтуБезУчетаВладельцев()
ДельтаБезУчетаВладельцев = Новый Структура();

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

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

	// Сравниваем исходные разрешения с результирующими.

	Для Каждого Строка Из ИсходныйСрезРазрешенийБезУчетаВладельцев Цикл

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

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

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Если СтрокаРезультата = Неопределено ИЛИ СтрокаРезультата.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

				// Разрешение было в исходных, но отсутствует в результирующих - это удаляемое разрешение.

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

				Если СтрокаУдаляемых.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

					СтрокаУдаляемых.Разрешения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

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

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

	// Сравниваем результирующие разрешения с исходными.
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура РассчитатьДельтуБезУчетаВладельцев()

	ДельтаБезУчетаВладельцев = Новый Структура();

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

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

	// Сравниваем исходные разрешения с результирующими.

	Для Каждого Строка Из ИсходныйСрезРазрешенийБезУчетаВладельцев Цикл

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

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

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Если СтрокаРезультата = Неопределено ИЛИ СтрокаРезультата.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

				// Разрешение было в исходных, но отсутствует в результирующих - это удаляемое разрешение.

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

				Если СтрокаУдаляемых.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

					СтрокаУдаляемых.Разрешения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

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

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

	// Сравниваем результирующие разрешения с исходными.

	Для Каждого Строка Из РезультатПримененияЗапросовБезУчетаВладельцев Цикл

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

		Строки = ИсходныйСрезРазрешенийБезУчетаВладельцев.НайтиСтроки(Отбор);
		Если Строки.Количество() > 0 Тогда
			ИсходнаяСтрока = Строки.Получить(0);
		Иначе
			ИсходнаяСтрока = Неопределено;
		КонецЕсли;

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Если ИсходнаяСтрока = Неопределено ИЛИ ИсходнаяСтрока.Разрешения.Получить(КлючИЗначение.Ключ) = Неопределено Тогда

				// Разрешение есть в результирующих, но отсутствует в исходных - это добавляемое разрешение.

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

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

					СтрокаДобавляемых.Разрешения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

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

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

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

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


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

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

Функция ИмяФункции(Знач ИмяПрофиля, Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля)

	Профиль = АдминистрированиеКластера.СвойстваПрофиляБезопасности();
	Профиль.Имя = ИмяПрофиля;
	Профиль.Описание = НовоеОписаниеПрофиляБезопасности(ТипПрограммногоМодуля, ИдентификаторПрограммногоМодуля);
	Профиль.ПрофильБезопасногоРежима = Истина;

	Профиль.ПолныйДоступКФайловойСистеме = Ложь;
	Профиль.ПолныйДоступКCOMОбъектам = Ложь;
	Профиль.ПолныйДоступКВнешнимКомпонентам = Ложь;
	Профиль.ПолныйДоступКВнешнимМодулям = Ложь;
	Профиль.ПолныйДоступКПриложениямОперационнойСистемы = Ложь;
	Профиль.ПолныйДоступКИнтернетРесурсам = Ложь;

	Профиль.ПолныйДоступКПривилегированномуРежиму = Ложь;

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

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

	Для Каждого Строка Из Строки Цикл

		Для Каждого КлючИЗначение Из Строка.Разрешения Цикл

			Разрешение = ОбщегоНазначения.ОбъектXDTOИзСтрокиXML(КлючИЗначение.Значение);

			Если Строка.Тип = "FileSystemAccess" Тогда

				Если СтандартныеВиртуальныеКаталоги().Получить(Разрешение.Path) <> Неопределено Тогда

					ВиртуальныйКаталог = АдминистрированиеКластера.СвойстваВиртуальногоКаталога();
					ВиртуальныйКаталог.ЛогическийURL = Разрешение.Path;
					ВиртуальныйКаталог.ФизическийURL = СтандартныеВиртуальныеКаталоги().Получить(Разрешение.Path);
					ВиртуальныйКаталог.ЧтениеДанных = Разрешение.AllowedRead;
					ВиртуальныйКаталог.ЗаписьДанных = Разрешение.AllowedWrite;
					ВиртуальныйКаталог.Описание = Разрешение.Description;
					Профиль.ВиртуальныеКаталоги.Добавить(ВиртуальныйКаталог);

				Иначе

					ВиртуальныйКаталог = АдминистрированиеКластера.СвойстваВиртуальногоКаталога();
					ВиртуальныйКаталог.ЛогическийURL = Разрешение.Path;
					ВиртуальныйКаталог.ФизическийURL = ЭкранироватьСимволПроцент(Разрешение.Path);
					ВиртуальныйКаталог.ЧтениеДанных = Разрешение.AllowedRead;
					ВиртуальныйКаталог.ЗаписьДанных = Разрешение.AllowedWrite;
					ВиртуальныйКаталог.Описание = Разрешение.Description;
					Профиль.ВиртуальныеКаталоги.Добавить(ВиртуальныйКаталог);

				КонецЕсли;

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

				COMКласс = АдминистрированиеКластера.СвойстваCOMКласса();
				COMКласс.Имя = Разрешение.ProgId;
				COMКласс.CLSID = Разрешение.CLSID;
				COMКласс.Компьютер = Разрешение.ComputerName;
				COMКласс.Описание = Разрешение.Description;
				Профиль.COMКлассы.Добавить(COMКласс);

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

				Дополнение = ОбщегоНазначения.ЗначениеИзСтрокиXML(Строка.ДополненияРазрешений.Получить(КлючИЗначение.Ключ));
				Для Каждого КлючИЗначениеДополнения Из Дополнение Цикл

					ВнешнийКомпонент = АдминистрированиеКластера.СвойстваВнешнейКомпоненты();
					ВнешнийКомпонент.Имя = Разрешение.TemplateName + "\" + КлючИЗначениеДополнения.Ключ;
					ВнешнийКомпонент.ХешСумма = КлючИЗначениеДополнения.Значение;
					ВнешнийКомпонент.Описание = Разрешение.Description;
					Профиль.ВнешниеКомпоненты.Добавить(ВнешнийКомпонент);

				КонецЦикла;

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

				ВнешнийМодуль = АдминистрированиеКластера.СвойстваВнешнегоМодуля();
				ВнешнийМодуль.Имя = Разрешение.Name;
				ВнешнийМодуль.ХешСумма = Разрешение.Hash;
				ВнешнийМодуль.Описание = Разрешение.Description;
				Профиль.ВнешниеМодули.Добавить(ВнешнийМодуль);

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

				ПриложениеОС = АдминистрированиеКластера.СвойстваПриложенияОС();
				ПриложениеОС.Имя = Разрешение.CommandMask;
				ПриложениеОС.ШаблонСтрокиЗапуска = Разрешение.CommandMask;
				ПриложениеОС.Описание = Разрешение.Description;
				Профиль.ПриложенияОС.Добавить(ПриложениеОС);

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

				ИнтернетРесурс = АдминистрированиеКластера.СвойстваИнтернетРесурса();
				ИнтернетРесурс.Имя = НРег(Разрешение.Protocol) + "://" + НРег(Разрешение.Host) + ":" + Разрешение.Port;
				ИнтернетРесурс.Протокол = Разрешение.Protocol;
				ИнтернетРесурс.Адрес = Разрешение.Host;
				ИнтернетРесурс.Порт = Разрешение.Port;
				ИнтернетРесурс.Описание = Разрешение.Description;
				Профиль.ИнтернетРесурсы.Добавить(ИнтернетРесурс);

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

				Профиль.ПолныйДоступКПривилегированномуРежиму = Истина;

			КонецЕсли;

		КонецЦикла;

	КонецЦикла;

	Возврат Профиль;

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

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

Функция НовоеОписаниеПрофиляБезопасности(Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля)

	Шаблон = НСтр("ru = '[ИБ %1] %2 ""%3""'");

	ИмяИБ = "";
	СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
	Подстроки = СтрРазделить(СтрокаСоединения, ";");
	Для Каждого Подстрока Из Подстроки Цикл
		Если СтрНачинаетсяС(Подстрока, "Ref") Тогда
			ИмяИБ = СтрЗаменить(Прав(Подстрока, СтрДлина(Подстрока) - 4), """", "");
		КонецЕсли;
	КонецЦикла;
	Если ПустаяСтрока(ИмяИБ) Тогда
		ВызватьИсключение НСтр("ru = 'Строка соединения информационной базы должна содержать информационной базы'");
	КонецЕсли;

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

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

// Возвращает физические пути стандартных виртуальных каталогов.
//
// Возвращаемое значение:
//   Соответствие из КлючИЗначение:
//                         * Ключ - Строка - псевдоним виртуального каталога,
//                         * Значение - Строка - физический путь.
//

Функция СтандартныеВиртуальныеКаталоги()

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

	Результат.Вставить("/temp", "%t/%r/%s/%p");
	Результат.Вставить("/bin", "%e");

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

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

// Экранирует символ процент в физическом пути виртуального каталога.
//
// Параметры:
//  ИсходнаяСтрока - Строка - исходный физический путь виртуального каталога.
//
// Возвращаемое значение:
//   Строка
//

Функция ЭкранироватьСимволПроцент(Знач ИсходнаяСтрока)

	Возврат СтрЗаменить(ИсходнаяСтрока, "%", "%%");

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

// Возвращает семафор применения запросов на использование внешних ресурсов.
//
// Возвращаемое значение:
//   РегистрСведенийКлючЗаписи.ЗапросыРазрешенийНаИспользованиеВнешнихРесурсов.
//

[Assistant] Функция ПрофильВНотацииИнтерфейсаАдминистрированияКластера(Знач ИмяПрофиля, Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля)