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

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

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

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

	Если Не ИспользуетсяАдресныйКлассификатор Тогда
		ОтключитьВозможностьВыбораАдресныхСведенийИзКлассификатора();
	КонецЕсли;

	ЕстьПравоЗагружатьКлассификатор = Обработки.РасширенныйВводКонтактнойИнформации.ЕстьВозможностьИзмененияАдресногоКлассификатора();

	Параметры.Свойство("ВозвращатьСписокЗначений", ВозвращатьСписокЗначений);

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

	Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), Строка(ВидКИ.Ссылка), Параметры.Заголовок);

	СкрыватьНеактуальныеАдреса  = ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса;
	ТолькоНациональныйАдрес     = ВидКонтактнойИнформации.ТолькоНациональныйАдрес;
	ТипКонтактнойИнформации     = ВидКонтактнойИнформации.Тип;
	МеждународныйФорматАдреса   = ВидКонтактнойИнформации.МеждународныйФорматАдреса;

	Элементы.АдресВСвободнойФорме.Видимость                                         = Не ВидКонтактнойИнформации.ПроверятьКорректность;
	Элементы.ПредставлениеАдресаКонтекстноеМенюВвестиАдресВСвободнойФорме.Видимость = Не ВидКонтактнойИнформации.ПроверятьКорректность;

	// Пытаемся заполнить из параметров.
	ЗначенияПолей = ОпределитьЗначениеАдреса(Параметры);

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

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

	ЗаполнениеПолейАдресаДляРанееВведенныхАдресов();
	ЗаполнитьПредопределенныеВариантыАдреса(Параметры);

	УстановитьЗначениеРеквизитовПоКонтактнойИнформации(НаселенныйПунктДетально);

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

	Если ТолькоНациональныйАдрес Тогда

		Элементы.Страна.Видимость = Ложь;
		Элементы.ОКТМО.Видимость  = ВидКонтактнойИнформации.УказыватьОКТМО;

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

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

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

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

	Если Не ИспользуетсяАдресныйКлассификатор Тогда
		ОтключитьВозможностьВыбораАдресныхСведенийИзКлассификатора();
	КонецЕсли;

	ЕстьПравоЗагружатьКлассификатор = Обработки.РасширенныйВводКонтактнойИнформации.ЕстьВозможностьИзмененияАдресногоКлассификатора();

	Параметры.Свойство("ВозвращатьСписокЗначений", ВозвращатьСписокЗначений);

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

	Заголовок = ?(ПустаяСтрока(Параметры.Заголовок), Строка(ВидКИ.Ссылка), Параметры.Заголовок);

	СкрыватьНеактуальныеАдреса  = ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса;
	ТолькоНациональныйАдрес     = ВидКонтактнойИнформации.ТолькоНациональныйАдрес;
	ТипКонтактнойИнформации     = ВидКонтактнойИнформации.Тип;
	МеждународныйФорматАдреса   = ВидКонтактнойИнформации.МеждународныйФорматАдреса;

	Элементы.АдресВСвободнойФорме.Видимость                                         = Не ВидКонтактнойИнформации.ПроверятьКорректность;
	Элементы.ПредставлениеАдресаКонтекстноеМенюВвестиАдресВСвободнойФорме.Видимость = Не ВидКонтактнойИнформации.ПроверятьКорректность;

	// Пытаемся заполнить из параметров.
	ЗначенияПолей = ОпределитьЗначениеАдреса(Параметры);

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

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

	ЗаполнениеПолейАдресаДляРанееВведенныхАдресов();
	ЗаполнитьПредопределенныеВариантыАдреса(Параметры);

	УстановитьЗначениеРеквизитовПоКонтактнойИнформации(НаселенныйПунктДетально);

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

	Если ТолькоНациональныйАдрес Тогда

		Элементы.Страна.Видимость = Ложь;
		Элементы.ОКТМО.Видимость  = ВидКонтактнойИнформации.УказыватьОКТМО;

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

		КонецЕсли;

		Если СтрНачинаетсяС(ВРег(НаселенныйПунктДетально.value), ВРег(НаселенныйПунктДетально.country) + ",") Тогда
			ЧастиАдреса                   = СтрРазделить(НаселенныйПунктДетально.value, ",");
			ЧастиАдреса.Удалить(0);
			НаселенныйПунктДетально.value = СокрЛП(СтрСоединить(ЧастиАдреса, ","));
			ПредставлениеАдреса           = НаселенныйПунктДетально.value;
		КонецЕсли;

		Страна                          = ОсновнаяСтрана;

	ИначеЕсли МеждународныйФорматАдреса Тогда

		Элементы.ПроверитьЗаполнениеАдреса.Видимость             = Ложь;
		Элементы.АдресныйКлассификаторУстарел.Видимость          = Ложь;
		Элементы.МуниципальноеДеление.Видимость                  = Ложь;
		Элементы.АдминистративноТерриториальноеДеление.Видимость = Ложь;
		Элементы.ЗаполнитьПоПочтовомуИндексу.Видимость           = Ложь;
		Элементы.ЗагрузитьКлассификатор.Видимость                = Ложь;
		Элементы.ГруппаИнформация.Видимость                      = Ложь;
		Элементы.НужнаПомощь.Видимость                           = Ложь;
		Элементы.СтраницаТипАдреса.ТекущаяСтраница               = Элементы.СтраницаДругойАдрес;

	КонецЕсли;
	НаселенныйПунктДетально.Country = НаименованиеСтраны(Страна, МеждународныйФорматАдреса);

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

	ОпределитьОтображениеЭлементовНаФорме(Параметры.ТолькоПросмотр);

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

	УстановитьКлючИспользованияФормы();
	СформироватьМенюДобавленияСтроенийИПомещений();

	СформироватьТекстНужнаПомощь();

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

&НаКлиенте

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

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

	ОтобразитьПоляПоТипуАдреса();
	ОбновитьМенюДобавленияСтроенийИПомещений();
	ПоказатьПодсказкуПоТипАдреса();

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

&НаКлиенте


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

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

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

	АдресВосстановлен = Ложь;
	ОчиститьИдентификаторыАдреса();
	Если РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) И Не МеждународныйФорматАдреса Тогда

		ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.AddressType, Ложь);
		АдресВосстановлен = ВосстановитьНаселенныйПунктАдреса(НаселенныйПункт, НаселенныйПунктДетально, ИменаУровнейАдреса);

	КонецЕсли;

	Если Не АдресВосстановлен Тогда

		Если МеждународныйФорматАдреса Тогда
			ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
		ИначеЕсли Не ЭтоРФАдрес() Тогда

			Если Не СведенияОСтране.УчастникЕАЭС Тогда

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

			КонецЕсли;

			ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС();

		КонецЕсли;

		ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.addressType, Ложь);

		ПорядокУровнейВАдресе = Новый Массив;

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

			ЭлементыАдреса = СтрРазделить(НаселенныйПункт, ",", Истина);
			Для ИндексАдреса = 0 По ИменаУровнейАдреса.Количество() - 1 Цикл
				ИмяУровня = ИменаУровнейАдреса[ИндексАдреса];

				Если ЭлементыАдреса.Количество() > 0 Тогда
					ЗначениеПоля = СокрЛП(ЭлементыАдреса[0]);

					Если ЭтоРФАдрес() Тогда
						Позиция = СтрНайти(ЗначениеПоля, " ", НаправлениеПоиска.СНачала);
					Иначе
						Позиция = 0;
					КонецЕсли;
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ИзменитьСведенияОНаселенномПункте()

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

	АдресВосстановлен = Ложь;
	ОчиститьИдентификаторыАдреса();
	Если РаботаСАдресамиКлиентСервер.ЭтоОсновнаяСтрана(Страна) И Не МеждународныйФорматАдреса Тогда

		ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.AddressType, Ложь);
		АдресВосстановлен = ВосстановитьНаселенныйПунктАдреса(НаселенныйПункт, НаселенныйПунктДетально, ИменаУровнейАдреса);

	КонецЕсли;

	Если Не АдресВосстановлен Тогда

		Если МеждународныйФорматАдреса Тогда
			ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес();
		ИначеЕсли Не ЭтоРФАдрес() Тогда

			Если Не СведенияОСтране.УчастникЕАЭС Тогда

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

			КонецЕсли;

			ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС();

		КонецЕсли;

		ИменаУровнейАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(НаселенныйПунктДетально.addressType, Ложь);

		ПорядокУровнейВАдресе = Новый Массив;

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

			ЭлементыАдреса = СтрРазделить(НаселенныйПункт, ",", Истина);
			Для ИндексАдреса = 0 По ИменаУровнейАдреса.Количество() - 1 Цикл
				ИмяУровня = ИменаУровнейАдреса[ИндексАдреса];

				Если ЭлементыАдреса.Количество() > 0 Тогда
					ЗначениеПоля = СокрЛП(ЭлементыАдреса[0]);

					Если ЭтоРФАдрес() Тогда
						Позиция = СтрНайти(ЗначениеПоля, " ", НаправлениеПоиска.СНачала);
					Иначе
						Позиция = 0;
					КонецЕсли;

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

			Если РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(НаселенныйПунктДетально.addressType) Тогда
				НаселенныйПунктДетально.munLevels = ПорядокУровнейВАдресе;
				ИмяПоляДругогоТипаАдреса = "admLevels";
				ИменаУровнейДругогоТипаАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(
					РаботаСАдресамиКлиентСервер.АдминистративноТерриториальныйАдрес(), Ложь);
			Иначе
				НаселенныйПунктДетально.admLevels = ПорядокУровнейВАдресе;
				ИмяПоляДругогоТипаАдреса = "munLevels";
				ИменаУровнейДругогоТипаАдреса = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(
					РаботаСАдресамиКлиентСервер.МуниципальныйАдрес(), Ложь);
			КонецЕсли;

			НаселенныйПунктДетально[ИмяПоляДругогоТипаАдреса] = Новый Массив;
			Для каждого ИмяУровня Из ИменаУровнейДругогоТипаАдреса Цикл
				ОбновитьСписокУровней(НаселенныйПунктДетально, ИмяУровня, ЗначениеЗаполнено(НаселенныйПунктДетально[ИмяУровня]));
			КонецЦикла;

			Если ЭлементыАдреса.Количество() > 0 Тогда
				НаселенныйПунктДетально[ИменаУровнейАдреса[ИменаУровнейАдреса.Количество() - 1]] = СокрЛП(СтрСоединить(ЭлементыАдреса, ","));
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;

	ОбновитьПредставлениеАдреса();

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

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

Функция ВосстановитьНаселенныйПунктАдреса(НаселенныйПункт, НаселенныйПунктДетально, ИменаУровнейАдреса)

	Результат = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(НаселенныйПункт, Перечисления.ТипыКонтактнойИнформации.Адрес);

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

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

	УстановитьИдентификаторыАдреса(НаселенныйПунктДетально);

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

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

&НаКлиенте

Процедура ПоказатьПодсказкуПоТипАдреса()

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

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

&НаКлиенте

Процедура ОбработкаИзмененияАдреса(ОбновитьДополнительныеЗдания = Истина)

	НаселенныйПункт = ПредставлениеНаселенногоПунктаАдреса(НаселенныйПунктДетально);

	Улица = ?(ПустаяСтрока(НаселенныйПунктДетально.Street), "",
		УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(
			НаселенныйПунктДетально.Street, НаселенныйПунктДетально.StreetType));

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

	ОбновитьПредставлениеАдреса();

	ФорматАдреса = НаселенныйПунктДетально.AddressType;
	Индекс       = НаселенныйПунктДетально.ZIPCode;
	ОКТМО        = НаселенныйПунктДетально.OKTMO;

	Если ЗначениеЗаполнено(НаселенныйПунктДетально.HouseType) Тогда
		ТипДома = НаселенныйПунктДетально.HouseType;
	КонецЕсли;

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

	Если НаселенныйПунктДетально.buildings.Количество() > 0 Тогда
		Если ЗначениеЗаполнено(НаселенныйПунктДетально.buildings[0].Type) Тогда
			ТипСтроения = НаселенныйПунктДетально.buildings[0].Type;
		КонецЕсли;

		Строение = НаселенныйПунктДетально.buildings[0].Number;
	Иначе
		Строение = "";
	КонецЕсли;

	Если НаселенныйПунктДетально.Apartments.Количество() > 0 Тогда
		Если ЗначениеЗаполнено(НаселенныйПунктДетально.Apartments[0].Type) Тогда
			ТипПомещения = НаселенныйПунктДетально.Apartments[0].Type;
		КонецЕсли;

		Помещение = НаселенныйПунктДетально.Apartments[0].Number;

	Иначе
		Помещение = "";
	КонецЕсли;

	УстановитьФлагиВМенюПоТипуАдреса();
	Если ОбновитьДополнительныеЗдания Тогда
		ПодключитьОбработчикОжидания("ОбновитьДополнительныеЗдания", 0.1, Истина);
	КонецЕсли;

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

	Модифицированность = Истина;

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

&НаКлиенте


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

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

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

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

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

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

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

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

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

	НаселенныйПунктДетально = НаселенныйПунктДетальноПоИдентификатору(СведенияОбАдресе);

	ОпределитьПоляАдреса(ВыбранноеЗначение.Уровень);
	Элемент.ОбновитьТекстРедактирования();

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

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

&НаСервере

Процедура ОтключитьКнопкиВыбораУЧастейАдреса()

	Элементы.СубъектРФ.КнопкаВыбора            = Ложь;
	Элементы.Район.КнопкаВыбора                = Ложь;
	Элементы.МуниципальныйРайон.КнопкаВыбора   = Ложь;
	Элементы.Город.КнопкаВыбора                = Ложь;
	Элементы.Поселение.КнопкаВыбора            = Ложь;
	Элементы.НаселенныйПункт.КнопкаВыбора      = Ложь;
	Элементы.Территория.КнопкаВыбора           = Ложь;

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

&НаКлиенте

Функция ИмяУровняПоНазваниюЭлемента(ИмяЭлемента)

	ИменаУровней = Новый Соответствие;
	ИменаУровней.Вставить("СубъектРФ",          "area");
	ИменаУровней.Вставить("Район",              "district");
	ИменаУровней.Вставить("МуниципальныйРайон", "munDistrict");
	ИменаУровней.Вставить("Город",              "city");
	ИменаУровней.Вставить("Поселение",          "settlement");
	ИменаУровней.Вставить("НаселенныйПункт",    "locality");
	ИменаУровней.Вставить("Территория",         "territory");

	Возврат ИменаУровней[ИмяЭлемента];

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

&НаКлиенте

Функция ВозвращаемыеДанныеОбАдресе()

	Результат = РаботаСАдресамиКлиентСервер.ВозвращаемыеДанныеОбАдресе();

	Результат.НаселенныйПунктДетально = НаселенныйПунктДетально;

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

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

&НаКлиенте

Функция ПорядокУровнейАдреса(ТипАдреса)

	ИменаУровней = РаботаСАдресамиКлиентСервер.ИменаУровнейАдреса(ТипАдреса, Истина);
	НаборУровней = Новый Массив;

	Для каждого ИмяУровня Из ИменаУровней Цикл
		Если ЗначениеЗаполнено(НаселенныйПунктДетально[ИмяУровня])
			 Или ЗначениеЗаполнено(НаселенныйПунктДетально[ИмяУровня + "Type"]) Тогда
				НаборУровней.Добавить(ИмяУровня);
		КонецЕсли;
	КонецЦикла;

	Если ЗначениеЗаполнено(НаселенныйПунктДетально.houseNumber)
		Или НаселенныйПунктДетально.apartments.Количество() >0 Тогда
			НаборУровней.Добавить("house");
	КонецЕсли;

	Возврат НаборУровней;

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

&НаКлиенте

Процедура ОткрытьФормуВыбораАдресныхОбъектов(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	ИмяУровня = ИмяУровняПоНазваниюЭлемента(Элемент.Имя);

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

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

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

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

&НаКлиенте

Процедура ОпределитьПоляАдреса(Знач Уровень)

	Регион               = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "area");
	Район                = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "district");
	МуниципальныйРайон   = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "munDistrict");
	Город                = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "city");
	Поселение            = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "settlement");
	НаселенныйПункт      = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "locality");
	Территория           = ПредставлениеУровняАдреса(НаселенныйПунктДетально, "territory");

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

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

Функция ПредставлениеУровняАдреса(Адрес, ИмяУровня)

	СкорректироватьИмяУровняКогдаГородВРайоне(Адрес, ИмяУровня);

	ИменаУровнейАдресаПоАдресу = РаботаСАдресамиКлиентСервер.ИменаУровнейАдресаПоАдресу(Адрес, Ложь);

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

	Если СтрСравнить(ИмяУровня, "area") = 0 И ЗначениеЗаполнено(Адрес.areaValue) Тогда
		Возврат Адрес.areaValue;
	КонецЕсли;

	Если Адрес.Свойство(ИмяУровня) И ЗначениеЗаполнено(Адрес[ИмяУровня]) Тогда
		Возврат УправлениеКонтактнойИнформациейКлиентСервер.СоединитьНаименованиеИТипАдресногоОбъекта(
			Адрес[ИмяУровня], Адрес[ИмяУровня +"Type"], СтрСравнить(ИмяУровня, "area") = 0);
	КонецЕсли;

	Возврат "";

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

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

Процедура СкорректироватьИмяУровняКогдаГородВРайоне(Адрес, ИмяУровня)

	ТипАдреса = Адрес.AddressType;

	Если РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(ТипАдреса)
		И СтрСравнить(ИмяУровня, "city") = 0
		И ПустаяСтрока(Адрес["city"])
		И (СтрСравнить(Адрес["districtType"], "Г") = 0
			Или СтрСравнить(Адрес["districtType"], "Г.") = 0) Тогда

			ИмяУровня = "district";

	КонецЕсли;

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

&НаКлиенте

Процедура ОтобразитьПоляПоТипуАдреса()

	Если СтрСравнить(УправлениеКонтактнойИнформациейКлиентСервер.АдресЕАЭС(), ТипАдреса) <> 0 Тогда

		ЭтоМуниципальныйАдрес = РаботаСАдресамиКлиентСервер.ЭтоМуниципальныйАдрес(ТипАдреса);
		Элементы.Район.Видимость              = НЕ ЭтоМуниципальныйАдрес;
		Элементы.МуниципальныйРайон.Видимость = ЭтоМуниципальныйАдрес;
		Элементы.Поселение.Видимость          = ЭтоМуниципальныйАдрес;

	Иначе

		Элементы.ТипАдреса.Видимость            = Ложь;
		Элементы.МуниципальныйРайон.Видимость   = Ложь;
		Элементы.Поселение.Видимость            = Ложь;
		Элементы.Территория.Видимость           = Ложь;
		Элементы.СубъектРФ.Заголовок            = НСтр("ru = 'Регион'");
		Элементы.СубъектРФ.КнопкаВыбора         = Ложь;
		Элементы.Район.КнопкаВыбора             = Ложь;
		Элементы.Город.КнопкаВыбора             = Ложь;
		Элементы.НаселенныйПункт.КнопкаВыбора   = Ложь;

	КонецЕсли;

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

&НаКлиенте

Процедура АвтоПодборПоУровню( Знач Текст, ДанныеВыбора, ИмяУровня, СтандартнаяОбработка)

	Если ИспользоватьАвтоподбор И ЗначениеЗаполнено(Текст) Тогда

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

	КонецЕсли;

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

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

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

Tasks-develope/src/cf/DataProcessors/РасширенныйВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Ext/Form/Module.bsl


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

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

Процедура НастроитьРедактированиеИзмененийСервер(ТекущаяСтрока)
Если ТекущаяСтрока = Неопределено Тогда

		ИмяТаблицы = "";
		Наименование = ДеревоМетаданных.ПолучитьЭлементы()[0].Наименование;
		ТекущийОбъект = Неопределено;

	Иначе

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

		ИмяТаблицы   = Данные.МетаПолноеИмя;
		Наименование = Данные.Наименование;
		ТекущийОбъект   = ЭтотОбъект();

	КонецЕсли;

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

	Если Мета = Неопределено Тогда
		НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
		НовСтраница = Элементы.СтраницаПустая;

	ИначеЕсли Мета = Метаданные.Константы Тогда
		// Все константы системы
		НастроитьСписокКонстант();
		НовСтраница = Элементы.СтраницаКонстанты;

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

	ИначеЕсли Метаданные.Константы.Содержит(Мета) Тогда
		// Одиночная константа
		НастроитьСписокКонстант(ИмяТаблицы, Наименование);
		НовСтраница = Элементы.СтраницаКонстанты;

	ИначеЕсли Метаданные.Справочники.Содержит(Мета)
		Или Метаданные.Документы.Содержит(Мета)
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура НастроитьРедактированиеИзмененийСервер(ТекущаяСтрока)

	Если ТекущаяСтрока = Неопределено Тогда

		ИмяТаблицы = "";
		Наименование = ДеревоМетаданных.ПолучитьЭлементы()[0].Наименование;
		ТекущийОбъект = Неопределено;

	Иначе

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

		ИмяТаблицы   = Данные.МетаПолноеИмя;
		Наименование = Данные.Наименование;
		ТекущийОбъект   = ЭтотОбъект();

	КонецЕсли;

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

	Если Мета = Неопределено Тогда
		НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
		НовСтраница = Элементы.СтраницаПустая;

	ИначеЕсли Мета = Метаданные.Константы Тогда
		// Все константы системы
		НастроитьСписокКонстант();
		НовСтраница = Элементы.СтраницаКонстанты;

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

	ИначеЕсли Метаданные.Константы.Содержит(Мета) Тогда
		// Одиночная константа
		НастроитьСписокКонстант(ИмяТаблицы, Наименование);
		НовСтраница = Элементы.СтраницаКонстанты;

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

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

	КонецЕсли;

	Элементы.СтраницаКонстанты.Видимость    = Ложь;
	Элементы.СтраницаСписокСсылок.Видимость = Ложь;
	Элементы.СтраницаНаборЗаписей.Видимость = Ложь;
	Элементы.СтраницаПустая.Видимость       = Ложь;

	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = НовСтраница;
	НовСтраница.Видимость = Истина;

	НастроитьВидимостьКомандОбщегоМеню();

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

// Вывод изменений для ссылочного типа (справочник, документ, план видов характеристик,
// план счетов, вид расчета, бизнес-процессы, задачи).
//
&НаСервере

Процедура НастроитьСписокСсылок(ИмяТаблицы, Наименование)

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

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

	УстановитьСвойстваДинамическогоСписка(Элементы.СписокСсылок, СвойстваСписка);

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

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

// Вывод изменений для констант.
//
&НаСервере

Процедура НастроитьСписокКонстант(ИмяТаблицы = Неопределено, Наименование = "")

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

	ШаблонТекстаЗапроса =
	"ВЫБРАТЬ
	|	&ИндексКартинкиАвторегистрация КАК ИндексКартинкиАвторегистрация,
	|	2 КАК ИндексКартинки,
	|	""&ПользовательскоеПредставлениеКонстанты"" КАК Наименование,
	|	""&ИмяТаблицыМетаданныхПредставление"" КАК МетаПолноеИмя,
	|	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
	|	ВЫБОР
	|		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК НеВыгружалось
	|ИЗ
	|	&ИмяТаблицыМетаданных КАК ТаблицаИзменений
	|ГДЕ
	|	ТаблицаИзменений.Узел = &ВыбранныйУзел";

	// И помнить про ограничение на количество таблиц.
	Текст = "";
	Для Индекс = 0 По Имена.ВГраница() Цикл

		Имя = Имена[Индекс];

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

			Текст = Текст + Символы.ПС + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС;

		КонецЕсли;

		ТекстПодзапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИндексКартинкиАвторегистрация", Формат(Авторегистрация[Индекс], "ЧН=; ЧГ="));
		ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ПользовательскоеПредставлениеКонстанты", ОбработатьКавычкиВСтроке(Представления[Индекс]));
		ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ИмяТаблицыМетаданныхПредставление", Имя);
		ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ИмяТаблицыМетаданных", ПодставитьПараметрыВСтроку("%1.Изменения", Имя));

		Текст = Текст + ТекстПодзапроса;

	КонецЦикла;

	СвойстваСписка = СтруктураСвойствДинамическогоСписка();
	СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;

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

	ИтоговыйТекстЗапроса = СтрЗаменить(ИтоговыйТекстЗапроса, "&ТекстВложенногоЗапроса", ПодставитьПараметрыВСтроку("(%1)", Текст));
	СвойстваСписка.ТекстЗапроса = ИтоговыйТекстЗапроса;

	УстановитьСвойстваДинамическогоСписка(Элементы.СписокКонстант, СвойстваСписка);

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

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

// Вывод заглушки с пустой страницей.
&НаСервере


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

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

Функция ИмяФункции()

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

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

	Объект.ФайлЗагрузкиРезервнойКопии = СокрЛП(Объект.ФайлЗагрузкиРезервнойКопии);
	ИмяФайла = СокрЛП(Объект.ФайлЗагрузкиРезервнойКопии);

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

	ФайлАрхива = Новый Файл(ИмяФайла);
	Если ВРег(ФайлАрхива.Расширение) <> ".ZIP" И ВРег(ФайлАрхива.Расширение) <> ".1CD"  Тогда

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

	КонецЕсли;

	Если ВРег(ФайлАрхива.Расширение) = ".1CD" Тогда

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

	Иначе

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

		Если ZipФайл.Элементы.Количество() <> 1 Тогда

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

		КонецЕсли;

		ФайлВАрхиве = ZipФайл.Элементы[0];

		Если ВРег(ФайлВАрхиве.Расширение) <> "1CD" Тогда

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

		КонецЕсли;

		Если ВРег(ФайлВАрхиве.ИмяБезРасширения) <> "1CV8" Тогда

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

		КонецЕсли;

	КонецЕсли;

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

#КонецЕсли

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

////////////////////////////////////////////////////////////////////////////////
// Процедуры обработчиков ожидания.

&НаКлиенте

Процедура ИстечениеВремениОжидания()

	ОтключитьОбработчикОжидания("ПроверкаНаЕдинственностьПодключения");
	ОтменитьПодготовку();

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

&НаСервере

Процедура ОтменитьПодготовку()

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

	СоединенияИБ.РазрешитьРаботуПользователей();

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

&НаКлиенте

Процедура ПроверкаНаЕдинственностьПодключения()

	Если КоличествоСеансовИнформационнойБазы() = 1 Тогда
		НачатьВосстановлениеДанных();
	КонецЕсли;

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

&НаКлиенте

Процедура НачатьВосстановлениеДанных()

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

	РезервноеКопированиеИБКлиент.НеОстанавливатьВыполнениеСценариев();

	ИмяГлавногоФайлаСкрипта = СформироватьФайлыСкрипта();
	ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(
		РезервноеКопированиеИБКлиент.СобытиеЖурналаРегистрации(),
		"Информация",
		НСтр("ru = 'Выполняется восстановление данных информационной базы:'") + " " + ИмяГлавногоФайлаСкрипта);

	ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы", Истина);

	ПутьКПрограммеЗапуска = СтандартныеПодсистемыКлиент.КаталогСистемныхПриложений() + "mshta.exe";

	СтрокаЗапуска = """%1"" ""%2"" [p1]%3[/p1]";
	СтрокаЗапуска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		СтрокаЗапуска,
		ПутьКПрограммеЗапуска,
		ИмяГлавногоФайлаСкрипта,
		РезервноеКопированиеИБКлиент.СтрокаUnicode(ПарольАдминистратораИБ));

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

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

#КонецЕсли

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

&НаКлиенте

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

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

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

//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции подготовки восстановления данных.

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

&НаКлиенте

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

Tasks-develope/src/cf/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Ext/Form/Module.bsl


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

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

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

	Статус = РезультатВыполненияУправляющегоФЗ.Статус;

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

	// Обновление прогресса.
	ВыполненоПроцедур = 0;
	Обработчики = ОбновлениеИнформационнойБазыСлужебный.ОбработчикиДляОтложеннойРегистрацииДанных();
	Для Каждого Обработчик Из Обработчики Цикл
		ОписаниеОбрабатываемыхДанных = Обработчик.ОбрабатываемыеДанные.Получить();
    // TODO: допиши оставшуюся часть

[Assistant]
Функция ПроверитьПроцедурыЗаполненияОтложенныхОбработчиков(РезультатВыполненияУправляющегоФЗ = Неопределено)

	Если РезультатВыполненияУправляющегоФЗ = Неопределено Тогда
		РезультатВыполненияУправляющегоФЗ = ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания);
	КонецЕсли;

	Статус = РезультатВыполненияУправляющегоФЗ.Статус;

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

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

	ХодРегистрации.ВыполненоПроцедур = ВыполненоПроцедур;
	Если ХодРегистрации.ВсегоПроцедур <> 0 Тогда
		ПрибавкаПрогресса = ХодРегистрации.ВыполненоПроцедур / ХодРегистрации.ВсегоПроцедур * (100 - ХодРегистрации.НачальныйПрогресс);
	Иначе
		ПрибавкаПрогресса = 0;
	КонецЕсли;
	ПрогрессВыполнения = ПрогрессВыполнения + ПрибавкаПрогресса;

	Возврат РезультатВыполненияУправляющегоФЗ;

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

////////////////////////////////////////////////////////////////////////////////
// Общие процедуры для всех этапов.

&НаКлиенте

Процедура НачатьЗакрытие() Экспорт

	ПодключитьОбработчикОжидания("ПродолжитьЗакрытие", 0.1, Истина);

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

&НаКлиенте

Процедура ПродолжитьЗакрытие() Экспорт

	ВыполняетсяОбновлениеВерсииИБ = Ложь;

	ЗакрытьФорму(Ложь, Ложь);

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

&НаКлиенте

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

	ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьИнформационнуюБазуДействияПриОшибке", ЭтотОбъект);

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

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

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

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

	КонецЕсли;

	ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы,,,,,ОписаниеОповещения);

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

&НаКлиенте

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

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

	Если ЗавершитьРаботу <> Ложь Тогда
		ЗакрытьФорму(Истина, Ложь);
	Иначе
		ЗакрытьФорму(Истина, Истина);
	КонецЕсли;

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

&НаКлиенте

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

	НовыйПараметрЗапуска = ПараметрЗапуска + ";РегламентныеЗаданияОтключены";
	НовыйПараметрЗапуска = "/AllowExecuteScheduledJobs -Off " + "/C """ + НовыйПараметрЗапуска + """";
	ПрекратитьРаботуСистемы(Истина, НовыйПараметрЗапуска);

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

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

Процедура УточнитьРезультатВыполнения(АдресРезультата, КраткоеПредставлениеОшибки,
			ПодробноеПредставлениеОшибки, ПризнакВыполненияОбработчиков, ПрогрессВыполнения)

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

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

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

Функция ОбработанныйРезультатДлительнойОперации(Результат, Операция)

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

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

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

Tasks-develope/src/cf/DataProcessors/РезультатыОбновленияПрограммы/Forms/ОбновлениеВерсииПрограммы/Ext/Form/Module.bsl


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

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

Процедура ВыполнитьЗаписьОбъекта(ОбрабатываемыйОбъект, Субъекты, ОчищатьДвоичныеДанныеФайлов, ВключеноВерсионирование)
ЗаписатьДанные(ОбрабатываемыйОбъект, ЗначениеЗаполнено(Субъекты));
	Если ОчищатьДвоичныеДанныеФайлов Тогда
		УдалитьДвоичныеДанныеФайловОбъекта(ОбрабатываемыйОбъект);
	КонецЕсли;

	Если ЗначениеЗаполнено(Субъекты) И ВключеноВерсионирование Тогда
		ИмяРегистраВерсииОбъектов = "ВерсииОбъектов";
    // TODO: допиши оставшуюся часть

[Assistant]
Процедура ВыполнитьЗаписьОбъекта(ОбрабатываемыйОбъект, Субъекты, ОчищатьДвоичныеДанныеФайлов, ВключеноВерсионирование)

	ЗаписатьДанные(ОбрабатываемыйОбъект, ЗначениеЗаполнено(Субъекты));
	Если ОчищатьДвоичныеДанныеФайлов Тогда
		УдалитьДвоичныеДанныеФайловОбъекта(ОбрабатываемыйОбъект);
	КонецЕсли;

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

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

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

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

	Для Каждого ИмяРеквизита Из ИменаРеквизитовСодержащихСубъект Цикл

		ЧастиИмени = СтрРазделить(ИмяРеквизита, ".", Ложь);
		Если ЧастиИмени.Количество() > 1 Тогда

			ИмяТЧасти = ЧастиИмени[0];
			ИмяРеквизитаТЧ = ЧастиИмени[1];
			ИменаРеквизитовТЧасти = ИменаРеквизитовТабличныхЧастей.Получить(ИмяТЧасти);

			Если ИменаРеквизитовТЧасти = Неопределено Тогда
				ИменаРеквизитовТЧасти = Новый Массив;
			КонецЕсли;

			ИменаРеквизитовТЧасти.Добавить(ИмяРеквизитаТЧ);
			ИменаРеквизитовТабличныхЧастей.Вставить(ИмяТЧасти, ИменаРеквизитовТЧасти);

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

	КонецЦикла;

	ЕстьСубъектыВТЧастях = ИменаРеквизитовТабличныхЧастей.Количество() > 0;

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

Процедура ОбработатьТабличнуюЧасть(ОбрабатываемыйОбъект, Обработано, ВыполнитьЗаписьОбъекта, Параметры)

	Субъекты = Параметры.Субъекты;
	ОбрабатываемыеСвойства = ОбрабатываемыйОбъект[Параметры.ГруппаСвойствОбъекта.Имя];

	ОбрабатыватьТЧПриНаличииСубъекта = Ложь;
	ИменаРеквизитовТЧСТипомСубъекта = Параметры.ИменаРеквизитовТабличныхЧастей.Получить(Параметры.ГруппаСвойствОбъекта.Имя);

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

	Для Каждого СтрокаТабличнойЧасти Из ОбрабатываемыеСвойства Цикл

		Если ЗначениеЗаполнено(Субъекты) Тогда

			Если ОбрабатыватьТЧПриНаличииСубъекта Тогда

				СубъектВСтроке = Ложь;
				Для Каждого ИмяРеквизита Из ИменаРеквизитовТЧСТипомСубъекта Цикл

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

				КонецЦикла;

				Если Не СубъектВСтроке Тогда
					Продолжить;
				КонецЕсли;

			ИначеЕсли Параметры.ЕстьСубъектыВТЧастях Или Не Параметры.ЕстьСубъектВРеквизитах Тогда
				Продолжить;
			КонецЕсли;

		КонецЕсли;

		Значение = СтрокаТабличнойЧасти[Параметры.ОбрабатываемоеСвойство.Имя];

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

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

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

		ВыполнитьЗаписьОбъекта = ВыполнитьЗаписьОбъекта Или Обработано;

	КонецЦикла;

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

// Параметры:
//  Субъекты - Массив из ОпределяемыйТип.СубъектПерсональныхДанных
//  СтрокаДерева - СтрокаДереваЗначений:
//   * ПолноеИмя - Строка
//
// Возвращаемое значение:
//  Массив из СправочникСсылка, ДокументСсылка
//

Функция НайтиОбъектыПоСсылкам(Субъекты, СтрокаДерева)

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

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

	Результат = НайденныеОбъекты.ВыгрузитьКолонку("Данные");

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

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

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

// Добавляет информацию об уничтоженных данных в табличную часть УничтоженныеДанные.
//
// Параметры:
//  ИмяОбъекта - Строка
//  Поле - Строка
//  Категория - Строка
//  ИдентификаторОбъекта - УникальныйИдентификатор
//

Процедура ДобавитьУничтоженныеДанные(ИмяОбъекта, Поле, Категория, ИдентификаторОбъекта)

	НоваяСтрока = УничтоженныеДанные.Добавить();
	НоваяСтрока.ИмяОбъекта = ИмяОбъекта;
	НоваяСтрока.Поле = Поле;
	НоваяСтрока.Категория = Категория;
	НоваяСтрока.ИдентификаторОбъекта = ИдентификаторОбъекта;

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

// Параметры:
//  ИмяОбъекта - Строка
//  ТекущаяСсылка - СправочникСсылка, ДокументСсылка, Строка
//
// Возвращаемое значение:
//  Массив из СправочникСсылка, ДокументСсылка
//

Функция ДанныеОбъектаМетаданных(ИмяОбъекта, ТекущаяСсылка = "")

	ТекстЗапроса =
		"ВЫБРАТЬ ПЕРВЫЕ 1000
		|	ОбъектМетаданных.Ссылка
		|ИЗ
		|	&ИмяТаблицы КАК ОбъектМетаданных
		|ГДЕ
		|	ОбъектМетаданных.Ссылка > &Ссылка
		|УПОРЯДОЧИТЬ ПО
		|	ОбъектМетаданных.Ссылка";

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ИмяОбъекта);

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

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

Процедура УдалитьФайлыОбъектаМетаданных(ВладелецФайла, ОбъектМетаданных, ПараметрыОтбора)

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

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

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

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

	ПолноеИмяСправочника = "Справочник." + ИмяСправочникаХранилищаФайлов;

	ДеревоОбрабатываемыхОбъектов = ОбъектМетаданных.Владелец();

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

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

	СтрокаСправочникаФайлов = МассивСтрок[0];
	Если СтрокаСправочникаФайлов.Пометка = 1 Тогда
		Возврат;
	КонецЕсли;

	УстановитьПометкуДляСтрокДерева(СтрокаСправочникаФайлов.Строки, 1);

	ОбработатьОбъектМетаданных(СтрокаСправочникаФайлов, ПараметрыОтбора);

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

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

	Для Каждого Строка Из КоллекцияСтрок Цикл
		Строка.Пометка = Пометка;
		УстановитьПометкуДляСтрокДерева(Строка.Строки, Пометка)
	КонецЦикла;

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


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

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

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

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

	МассивПолейПоиска = СтрРазделить(ПоляПоискаТаблицыПриемника, ",", Ложь);

	// Если поля поиска не указаны, то выбираем поля поиска сами.
	Если МассивПолейПоиска.Количество() = 0 Тогда

		// для справочников
		ДобавитьПолеПоиска(МассивПолейПоиска, "Наименование");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Код");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Владелец");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Родитель");

		// для документов и БП
		ДобавитьПолеПоиска(МассивПолейПоиска, "Дата");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Номер");

		// популярные поля поиска
		ДобавитьПолеПоиска(МассивПолейПоиска, "Организация");
		ДобавитьПолеПоиска(МассивПолейПоиска, "ИНН");
		ДобавитьПолеПоиска(МассивПолейПоиска, "КПП");

		Если МассивПолейПоиска.Количество() = 0 Тогда

			Если СписокПолейТаблицы.Количество() > 0 Тогда

				МассивПолейПоиска.Добавить(СписокПолейТаблицы[0].Значение);

			КонецЕсли;

		КонецЕсли;

	КонецЕсли;

	// Удаляем из массива полей поиска поля свыше указанного лимита; удаляем элементы массива с конца.
	ПроверитьКоличествоПолейСопоставленияВМассиве(МассивПолейПоиска);

	// Отмечаем в списке СписокПолейТаблицы поля поиска.
	Для Каждого Элемент Из СписокПолейТаблицы Цикл

		Если МассивПолейПоиска.Найти(Элемент.Значение) <> Неопределено Тогда

			Элемент.Пометка = Истина;

		КонецЕсли;

	КонецЦикла;

	ЗаполнитьСписокДополнительнымиПараметрами(СписокПолейТаблицы);

	// Формируем СписокИспользуемыхПолей из отмеченных элементов списка СписокПолейТаблицы.
	ЗаполнитьСписокОтмеченнымиЭлементами(СписокПолейТаблицы, СписокИспользуемыхПолей);

	// Формируем Таблицу сортировки.
	ЗаполнитьТаблицуСортировки(СписокИспользуемыхПолей);

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

////////////////////////////////////////////////////////////////////////////////
// Функции-свойства

// Таблица сопоставления объектов.
//
// Возвращаемое значение:
//      ТаблицаЗначений - таблица сопоставления объектов.
//

Функция ТаблицаСопоставления() Экспорт

	Если ТипЗнч(ПолеТаблицаСопоставления) <> Тип("ТаблицаЗначений") Тогда

		ПолеТаблицаСопоставления = Новый ТаблицаЗначений;

	КонецЕсли;

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

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

////////////////////////////////////////////////////////////////////////////////
// Функции-свойства - дайджест сопоставления.

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

Функция КоличествоОбъектовВИсточнике() Экспорт

	Возврат ДайджестСопоставления().КоличествоОбъектовВИсточнике;

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

// Количество объектов текущего типа данных в этой информационной базе.
//
// Возвращаемое значение:
//     Число - количество объектов текущего типа данных в этой информационной базе.
//

Функция КоличествоОбъектовВПриемнике() Экспорт

	Возврат ДайджестСопоставления().КоличествоОбъектовВПриемнике;

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

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

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

	Возврат ДайджестСопоставления().КоличествоОбъектовСопоставленных;

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

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

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

	Возврат ДайджестСопоставления().КоличествоОбъектовНесопоставленных;

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

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

Функция ПроцентСопоставленияОбъектов() Экспорт

	Возврат ДайджестСопоставления().ПроцентСопоставленияОбъектов;

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

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

Функция ДайджестСопоставления()

	Если ТипЗнч(ПолеДайджестСопоставления) <> Тип("Структура") Тогда

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

	КонецЕсли;

	Возврат ПолеДайджестСопоставления;

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

Функция ИнформацияСтатистикиСопоставленияОбъектов()

	Если ТипЗнч(ПолеИнформацияСтатистикиСопоставленияОбъектов) <> Тип("Структура") Тогда

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

	КонецЕсли;

	Возврат ПолеИнформацияСтатистикиСопоставленияОбъектов;

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

Функция ТипСтрокаНеограниченнойДлины()

	Если ТипЗнч(ПолеТипСтрокаНеограниченнойДлины) <> Тип("ОписаниеТипов") Тогда

		ПолеТипСтрокаНеограниченнойДлины = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0));

	КонецЕсли;

	Возврат ПолеТипСтрокаНеограниченнойДлины;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Получение таблицы сопоставления.

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

	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);

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

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

	// Поле ЭтоГруппа присутствует всегда для иерархических справочников.
	Если ПользовательскиеПоля.Найти("ЭтоГруппа") = Неопределено Тогда
		ДобавитьПолеПоиска(ПользовательскиеПоля, "ЭтоГруппа");
	КонецЕсли;

	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

	// Получаем информацию дайджеста сопоставления объектов.
	ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц);

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

	МенеджерВременныхТаблиц.Закрыть();

	// сортируем таблицу
	ВыполнитьСортировкуТаблицыНаСервере();

	// Добавляем поле НомерПоПорядку и заполняем его.
	ДобавитьПолеНомераВТаблицуСопоставления();

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

[Assistant] Процедура Конструктор()


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

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

Процедура ИмяФункции(Отказ, СписокПолейСопоставления)

	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);

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

	// Пользовательские поля формируем по следующему алгоритму:
	// сначала добавляем поля, выбранные пользователем для отображения
	// затем все остальные поля таблицы.
	// Порядок полей важен, т.к. влияет на отображение пользователю в таблице результата автоматического сопоставления.
	ПользовательскиеПоля = Новый Массив;

	Для Каждого Элемент Из СписокИспользуемыхПолей Цикл

		ПользовательскиеПоля.Добавить(Элемент.Значение);

	КонецЦикла;

	Для Каждого Элемент Из СписокПолейТаблицы Цикл

		Если ПользовательскиеПоля.Найти(Элемент.Значение) = Неопределено Тогда

			ПользовательскиеПоля.Добавить(Элемент.Значение);

		КонецЕсли;

	КонецЦикла;

	// Список полей сопоставления формируем согласно порядку элементов в массиве ПользовательскиеПоля.
	СписокПолейСопоставленияНовый = Новый СписокЗначений;

	Для Каждого Элемент Из ПользовательскиеПоля Цикл

		ЭлементСписка = СписокПолейСопоставления.НайтиПоЗначению(Элемент);

		СписокПолейСопоставленияНовый.Добавить(Элемент, ЭлементСписка.Представление, ЭлементСписка.Пометка);

	КонецЦикла;

	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

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

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

	МенеджерВременныхТаблиц.Закрыть();

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

Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБазПоУмолчанию(Отказ, СписокПолейСопоставления)

	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);

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

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

	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

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

	// Загружаем обновленную таблицу неутвержденных связей в реквизит объекта.
	ТаблицаНеутвержденныхСвязей.Загрузить(ОбъединитьТаблицыНеутвержденныхСвязейИАвтоматическогоСопоставления(МенеджерВременныхТаблиц));

	МенеджерВременныхТаблиц.Закрыть();

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

[Assistant] Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБаз(Отказ, СписокПолейСопоставления)