Копирование телефона контрагента из контакта при создании контрагента на сайте. УНФ3

Из-за неправильной структуры XML контактная информация клиента попадала не в контрагента, а в контактное лицо:

Пробовал попросить веб-мастера изменить выгрузку, но ему было сложно. А нам в 1С легко!

Решил не мудрствовать особо и после создания контрагента в процедуре ИнтеграцияСИнтернетМагазиномСервер.НайтиСоздатьКонтрагента копирую контрагенту телефон и email из контактного лица (если у контрагента они пустые).

&Вместо("НайтиСоздатьКонтрагента")
Функция сайт_НайтиСоздатьКонтрагента(КонтрагентXDTO, ДокументОбъект, ИнформацияПоКонтрагенту, Параметры, ОписаниеОшибки)
	КонтрагентСсылка = ПродолжитьВызов(КонтрагентXDTO, ДокументОбъект, ИнформацияПоКонтрагенту, Параметры, ОписаниеОшибки);
	
	//Обрабатываем контрагента после его создания
	
	//1. Если есть адрес и телефон у контактных лица, а у контрагента нет, копируем.
	сайт_Сервер.СкопироватьКИИзКонтактногоЛица(КонтрагентСсылка);
	
	Возврат КонтрагентСсылка;
КонецФункции 

//Модуль: сайт_Сервер

&НаСервере
Процедура СкопироватьКИИзКонтактногоЛица(Контрагент) Экспорт    
	//Тест: Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Тест 3"); сайт_Сервер.СкопироватьКИИзКонтактногоЛица(Контрагент);
	
	

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

//Модуль: видс_С
Функция ПолучитьКонтактнуюИнформациюИзКонтактовКонтрагента(Контрагент, Вид) Экспорт
	КонтактныеЛица = КонтактныеЛицаКонтрагента(Контрагент);     
	Для Каждого КонтактноеЛицо ИЗ КонтактныеЛица Цикл
		Значение = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(КонтактноеЛицо, Вид, ТекущаяДата(), Истина);
		Если ЗначениеЗаполнено(Значение) И Значение <> NULL Тогда
			Возврат Значение;
		КонецЕсли;
	КонецЦикла;
КонецФункции            

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

Функция по получению телефона из контактного лица у меня уже была написана в другом расширении, копировать не стал, вызываю из расширения, использую ссылку на общий модуль, чтобы 1С не ругалась на синтаксис.

Проверил в консоли кода — все работает:

Попросил пользователя проверить, как будет работать у новых контрагентов.

Кстати, хваленый ИИ эту задачу решить не смог, вот его код:
&НаСервере
Процедура СкопироватьКИИзКонтактногоЛица(СсылкаНаКонтрагента) Экспорт

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

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

	КонтактноеЛицо = Выборка.КонтактноеЛицо;

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

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

	// Если заполнены оба реквизита, ничего не делаем
	Если ЕстьТелефонКонтрагента И ЕстьEmailКонтрагента Тогда
		Возврат;
	КонецЕсли;

	// 3. Получаем стандартные виды КИ для контрагента
	ВидТелефонКонтрагента = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	ВидEmailКонтрагента   = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;

	// 4. Переносим недостающую КИ от Контактного лица
	СтрокиКонтактногоЛица = ТЗКИ.НайтиСтроки(Новый Структура("Объект", КонтактноеЛицо));

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

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

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

Среда: УНФ 3.0.13.342 Объем: 1 час.