Копирование телефона контрагента из контакта при создании контрагента на сайте. УНФ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 час.




Свежие комментарии