Программное изменение контактной информации

1. Владислав Теут (darkmessiahan) 30 07.06.16 15:42 Сейчас в теме
Добрый день
Интересует знания, как программно изменить контактную информацию в справочнике Контрагенты в Бухгалтерии предприятия 3.0?
Известно:
В отличии от 2.0 в 3.0 контактная информация храниться в табличной часть справочника(2.0 в регистрах сведений).
Проблема:
Программно очищаю табл часть справочника, после добавляю строки, однако при открытии карточки Контрагента виден только юридический адрес. Телефон факт адрес и эл почта не отображаются.

Для тренировки использовал обработку, см. вложение.

&НаСервере
Процедура ЗаполнитьКонтактнуюИнфомрацияНаСервере()
	Контрагент1 = Контрагент.ПолучитьОбъект();
	Контрагент1.КонтактнаяИнформация.Очистить();

	// Попытка	Стр = Контрагент1.КонтактнаяИнформация.Получить(0);
	
		  Стр1 = Контрагент1.КонтактнаяИнформация.Добавить();
			 

	Стр1.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
	Стр1.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
	//Стр1.НомерТелефона = "Адрес 2";
	//Стр1.НомерТелефонаБезКодов = "Адрес 2 без кодов";
	Стр1.Представление =  "Адрес 2 Представление";
	Стр1.Страна = Справочники.СтраныМира.Россия;
	Стр1.Регион = "Москва г";
	 //Стр1.ЗначенияПолей = '<КонтактнаяИнформация xmlns="http://www.v8.1c.ru/ssl/contactinfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Представление="Москва г, Донская ул, дом № 67, корпус 1"><Комментарий/><Состав xsi:type="Адрес" Страна="РОССИЯ"><Состав xsi:type="АдресРФ"><СубъектРФ>Москва г</СубъектРФ><СвРайМО><Район/></СвРайМО><Город/><НаселПункт/­><Улица>Донская ул</Улица><ДопАдрЭл><Номер Тип="1050" Значение="1"/></ДопАдрЭл><ДопАдрЭл><Номер Тип="1010" Значение="67"/></ДопАдрЭл><ДопАдрЭл ТипАдрЭл="10100000" Значение=""/></Состав></Состав></КонтактнаяИнформация>';
	//Стр1.АдресЭП = " Адрес 2 АдресЭП";
	//Стр1.ДоменноеИмяСервера = " Адрес 2 ДоменноеИмяСервера";
	Стр1.ВидДляСписка = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;

	  Стр = Контрагент1.КонтактнаяИнформация.Добавить();
	//КонецПопытки;		 
	
	Стр.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
	Стр.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
	Стр.Представление = "Юр Адрес";
	Стр.Страна = Справочники.СтраныМира.Россия;
	Стр.ВидДляСписка = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
	Стр.Регион = "Москва г";
	
	Стр2 = Контрагент1.КонтактнаяИнформация.Добавить();
	Стр2.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
	Стр2.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	Стр2.Представление = "8 8 8 8  ";
	Стр2.ВидДляСписка = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	
	Стр3 = Контрагент1.КонтактнаяИнформация.Добавить();
	Стр3.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
	Стр3.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	Стр3.Представление = "8 8 8 8  ";
	Стр3.ВидДляСписка = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	//Стр2.Регион = "Москва г";
	////КонецЦикла;
	// Попытка	Стр1 = Контрагент1.КонтактнаяИнформация.Получить(1);
	//КонецЦикла;
	//Стр2 = Контрагент1.КонтактнаяИнформация.Вставить(3);
	//Стр2.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
	//Стр2.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
	//Стр2.Представление = "телнеф";
	//Стр2.Страна = Справочники.СтраныМира.Россия;
	//Стр2.ВидДляСписка = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	
	
	Контрагент1.Записать();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьКонтактнуюИнфомрация(Команда)
	ЗаполнитьКонтактнуюИнфомрацияНаСервере();
КонецПроцедуры
...Показать Скрыть
Ответы
2. Наталья Николаева (nni93) 07.06.16 15:52 Сейчас в теме
заполнять нужно ЗначенияПолей в виде xml-схемы

http://forum.aeroion.ru/topic779.html
darkmessiahan; +1 Ответить 2
3. Владислав Теут (darkmessiahan) 30 07.06.16 17:19 Сейчас в теме
(2) nni93, слишком сложно, пойду лучше уборщиком работать.
starik-2005; PLAstic; +2 Ответить 1
4. Xer shi (Xershi) 278 07.06.16 17:22 Сейчас в теме
(3) darkmessiahan, отличное решение=))
darkmessiahan; +1 Ответить
5. Владислав Теут (darkmessiahan) 30 07.06.16 18:07 Сейчас в теме
(2) nni93, не помогло чет, только юр адрес запонляется

Представление = ",446254,САМАРСКАЯ ОБЛ,БЕЗЕНЧУКСКИЙ Р-Н,,БЕЗЕНЧУК ПГТ,ТИМИРЯЗЕВА УЛ,26,,37";

ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента; //для другого справочника подставить соответствующее значение
Пока Лев(Представление, 1) = "," Цикл Представление = Сред(Представление, 2); КонецЦикла;
МногострочныйТекст = СтрЗаменить(Представление, ",", Символы.ПС);
Представление = "";
Для А = 1 По СтрЧислоСтрок(МногострочныйТекст) Цикл 
    Подстрока = СокрЛП(СтрПолучитьСтроку(МногострочныйТекст, А));
    Если ЗначениеЗаполнено(Подстрока) Тогда Представление = Представление + Подстрока + ", "; КонецЕсли;
КонецЦикла; //Для А = 1 По
Представление = Лев(Представление, СтрДлина(Представление) - 2);
ОбъектXDTOКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML("", Представление, Перечисления.ТипыКонтактнойИнформации.Адрес);
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Контрагент1, ОбъектXDTOКИ, 
                ВидКИ, Перечисления.ТипыКонтактнойИнформации.Адрес);
				
				ВидКИ = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента; //для другого справочника подставить соответствующее значение
Пока Лев(Представление, 1) = "," Цикл Представление = Сред(Представление, 2); КонецЦикла;
МногострочныйТекст = СтрЗаменить(Представление, ",", Символы.ПС);
Представление = "";
Для А = 1 По СтрЧислоСтрок(МногострочныйТекст) Цикл 
    Подстрока = СокрЛП(СтрПолучитьСтроку(МногострочныйТекст, А));
    Если ЗначениеЗаполнено(Подстрока) Тогда Представление = Представление + Подстрока + ", "; КонецЕсли;
КонецЦикла; //Для А = 1 По
Представление = Лев(Представление, СтрДлина(Представление) - 2);
ОбъектXDTOКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML("", Представление, Перечисления.ТипыКонтактнойИнформации.Адрес);
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Контрагент1, ОбъектXDTOКИ, 
                ВидКИ, Перечисления.ТипыКонтактнойИнформации.Адрес);
				
				Представление = "8 800 455 55 55";
								ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента; //для другого справочника подставить соответствующее значение
Пока Лев(Представление, 1) = "," Цикл Представление = Сред(Представление, 2); КонецЦикла;
МногострочныйТекст = СтрЗаменить(Представление, ",", Символы.ПС);
Представление = "";
Для А = 1 По СтрЧислоСтрок(МногострочныйТекст) Цикл 
    Подстрока = СокрЛП(СтрПолучитьСтроку(МногострочныйТекст, А));
    Если ЗначениеЗаполнено(Подстрока) Тогда Представление = Представление + Подстрока + ", "; КонецЕсли;
КонецЦикла; //Для А = 1 По
Представление = Лев(Представление, СтрДлина(Представление) - 2);
ОбъектXDTOКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML("", Представление, Перечисления.ТипыКонтактнойИнформации.Телефон);
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Контрагент1, ОбъектXDTOКИ, 
                ВидКИ, Перечисления.ТипыКонтактнойИнформации.Телефон);
	
	Контрагент1.Записать();
...Показать Скрыть
6. Xer shi (Xershi) 278 07.06.16 21:31 Сейчас в теме
(5) darkmessiahan, да возьми отладчик да пройдись когда руками заполняешь. Все станет понятно.
7. Владимир Курепин (Voffffka) 21 10.08.16 23:54 Сейчас в теме
(1) darkmessiahan, Есть такая процедура ПереносКИПриОбновленииС20(), в ней описано как заполнять табличные части.
http://infostart.ru/public/540817/
Если не разберетесь могу более подробно место указать)
scanner1980; +1 Ответить
8. Roman Programmer (roman77) 23 11.08.16 12:47 Сейчас в теме
Не надо изобретать велосипед. В самой конфигурации уже есть все необходимое.

смотри УправлениеКонтактнойИнформацией.ЗаполнитьКонтактнуюИнформациюОбъекта
9. Наталья Резникова (natarezn) 14.10.16 15:14 Сейчас в теме
(1) darkmessiahan, скачала ! буду смотреть
10. Наталья Резникова (natarezn) 14.10.16 15:15 Сейчас в теме
(5) darkmessiahan, что-то много кода
11. Наталья Резникова (natarezn) 14.10.16 15:16 Сейчас в теме
КонтактнаяИнформация = Новый ТаблицаЗначений;
	КонтактнаяИнформация.Колонки.Добавить("Приемник");
	КонтактнаяИнформация.Колонки.Добавить("ВидКИ");
	КонтактнаяИнформация.Колонки.Добавить("СтруктураКИ");
	КонтактнаяИнформация.Колонки.Добавить("КлючСтроки");
Если ЭтоЮрЛицо Тогда
		
		Если РеквизитыКонтрагента.ЮридическийАдрес <> Неопределено Тогда
			СтрокаКИ = КонтактнаяИнформация.Добавить();
			СтрокаКИ.Приемник = КонтрагентОбъект;
			СтрокаКИ.ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
			СтрокаКИ.СтруктураКИ = РеквизитыКонтрагента.ЮридическийАдрес.КонтактнаяИнформация;
			
			СтрокаКИ = КонтактнаяИнформация.Добавить();
			СтрокаКИ.Приемник = КонтрагентОбъект;
			СтрокаКИ.ВидКИ = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
			СтрокаКИ.СтруктураКИ = РеквизитыКонтрагента.ЮридическийАдрес.КонтактнаяИнформация;
			
			СтрокаКИ = КонтактнаяИнформация.Добавить();
			СтрокаКИ.Приемник = КонтрагентОбъект;
			СтрокаКИ.ВидКИ = Справочники.ВидыКонтактнойИнформации.ПочтовыйАдресКонтрагента;
			СтрокаКИ.СтруктураКИ = РеквизитыКонтрагента.ЮридическийАдрес.КонтактнаяИнформация;
		КонецЕсли;
		
		Если РеквизитыКонтрагента.Телефон <> Неопределено Тогда
			СтрокаКИ = КонтактнаяИнформация.Добавить();
			СтрокаКИ.Приемник = КонтрагентОбъект;
			СтрокаКИ.ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
			СтрокаКИ.СтруктураКИ = РеквизитыКонтрагента.Телефон.КонтактнаяИнформация;
		КонецЕсли;
		
		Если КонтактнаяИнформация.Количество() > 0 Тогда
			УправлениеКонтактнойИнформацией.ЗаполнитьКонтактнуюИнформациюОбъектов(КонтактнаяИнформация);
		КонецЕсли;
конецесли;
...Показать Скрыть
12. Наталья Резникова (natarezn) 14.10.16 15:18 Сейчас в теме
13. Наталья Резникова (natarezn) 14.10.16 16:23 Сейчас в теме
такое работает, поправьте если что
Если сокрлп(ЮрАдрес) <> "" Тогда 
СтрокаКИ = об.КонтактнаяИнформация.Добавить(); 
//СтрокаКИ.Приемник = КонтрагентОбъект; 
СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента; 
СтрокаКИ.ТИП = Перечисления.ТипыКонтактнойИнформации.Адрес;//РеквизитыКонтрагента.ЮридическийАдрес.КонтактнаяИнформация; 
СтрокаКИ.Представление =сокрлп(ЮрАдрес) ; 
об.Записать();
КонецЕсли; 
Если сокрлп(ФактАдрес) <> "" Тогда
СтрокаКИ = об.КонтактнаяИнформация.Добавить(); 
//СтрокаКИ.Приемник = КонтрагентОбъект; 
СтрокаКИ.ТИП = Перечисления.ТипыКонтактнойИнформации.Адрес; 
СтрокаКИ.Вид=Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;//РеквизитыКонтрагента.ЮридическийАдрес.КонтактнаяИнформация; 
СтрокаКИ.Представление =сокрлп(ФактАдрес) ; 
об.Записать();

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

КонецЕсли; 

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

Если рез.КонтактнаяИнформация.Количество() > 0 Тогда 
//УправлениеКонтактнойИнформацией.ЗаполнитьКонтактнуюИнформациюОбъектов(СтрокаКИ,текущаядата());
КонецЕсли; 
об.Записать();
...Показать Скрыть
14. Наталья Резникова (natarezn) 14.10.16 16:41 Сейчас в теме
все таки должно отработать СтрокаКИ.Представление =сокрлп(Телефоны) ; в последнем абзаце
15. Наталья Резникова (natarezn) 14.10.16 16:53 Сейчас в теме
(1) darkmessiahan, страна проставилась сама
16. Alex (a512) 22.01.17 13:57 Сейчас в теме
(14) Да, работает. Спасибо, Наталья!

Если сокрлп(Телефон)<> "" Тогда
     	  СтрокаКИ = Спр.КонтактнаяИнформация.Добавить();
	  СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
	  СтрокаКИ.Тип=Перечисления.ТипыКонтактнойИнформации.Телефон;
	  СтрокаКИ.Представление = сокрлп(Телефон);
	  Спр.Записать();
	КонецЕсли;
...Показать Скрыть
17. Dark.iNiTro Zzz (Dark.iNiTro) 5 18.05.17 23:16 Сейчас в теме
(16)

никогда не используйте выше указанный самописный код!

надо функции БСП для работы с КИ.
Пример:

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


на вопрос "почему?" попытаюсь кратко описать свою проблему, что бы другие не наступали на мои грабли :)

сделал я для одного моего клиента загрузку контрагента и его КИ из XML файла в одну конфигурацию, написанную на БСП.
Всю КИ я заполнял сам - просто добавлял строку в ТЧ "КонтактнаяИнформация", заполнял представление.
Вроде было все норм. Открываешь контрагента - все отображается, все отлично.

Дальше начинаются какие то чудеса с очисткой КИ.
Т.е. контрагента загрузили и через некоторое время выясняется что у него КИ вся очищена (кроме почему то юр.адреса).
Включаю механизм логирования изменений в контрагенте (функционал БСП).
Вычисляем пользователя после которого КИ очищается. Пресуем его - не сознается. Говорит, что ничего не делал, ну поменял одну галку, но КИ не чистил. Мы в стопоре. Была КИ, пользователь записывает, КИ исчезает (кроме юр.адреса).
В результате многочисленных часов отладки, попыток выяснил: что если открыть такого контрагента и не переключаясь на вкладку с КИ - его записать, то все чиститься! Тут конечно фишка в том, что я до этого обычно на вкладку КИ переключался, а тогда при записи все сохраняется.

В целом проблема заключается, в том, что в ТЧ надо еще заполнить поле "ЗначениеПолей".

Так что делаю вывод: используйте ТИПОВОЙ функционал, если не хотите потом такие глюки ловить и убеждать клиента что это у него лыжи не катят )))
victor_goodwill; tyasytova; 98764321; HIVvich; +4 Ответить 2
18. Юлия Крылова (HIVvich) 19.05.17 14:21 Сейчас в теме
(17) Спасибо большое, а то я тоже это мучаю сейчас. У меня причем прикол такой, все отрабатывает, и по отладчику смотрю, что адрес вроде проходит (добавляю почтовый адрес), а в справочнике у контрагента он не появился, что за глюк..
19. Юлия Крылова (HIVvich) 19.05.17 15:08 Сейчас в теме
Все разобралась, все работает.
20. Spektr Тунда (Spektr) 421 21.05.17 17:31 Сейчас в теме
(17) этим кодом телефон загрузил без проблем. А с адресом проблема. Загружает как адрес в свободной форме. как загрузить адрес по представлению?
Оставьте свое сообщение