"Установить основным" поле емейл

1. user876792 06.03.19 14:14 Сейчас в теме
В справочнике ИТ_КонтактныеЛица при открытии элемента списка открывается окно на котором есть вкладка "Контактная информация" и там в списке поле емейл. Нужно это поле сделать основным у всех элементов.

Так понимаю что нужно запросом выбрать все элементы этого справочник и потом по ссылке элемента каждому полю со значение емейл присвоить это значение (установить основным). В конструкторе запроса выбираю в Таблицы этот справочник, но у него нет такого поля и вообще нет этой табличной части и других тоже. Где это поле найти?
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dim_1c 06.03.19 14:24 Сейчас в теме
(1) Эта информация (привязка) скорее всего хранится в регистре сведений. Посмотрите что делает "Установить основным".
Дмитрий74Чел; +1 Ответить
3. user876792 06.03.19 15:11 Сейчас в теме
(2)
&НаКлиенте
Процедура УстановитьОсновным(Команда)	
	ИТ_УправлениеКонтактнойИнформациейКлиентУпр.УстановитьОсновным(ЭтотОбъект,НаборКонтактнойИнформации);	
КонецПроцедуры


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

КонецПроцедуры // 
Показать
4. dim_1c 06.03.19 15:25 Сейчас в теме
(3) Посмотрите элемент НаборКонтактнойИнформации. При открытии формы туда попадает информация о контактах, а при записи - обратная процедура.
5. user876792 06.03.19 19:20 Сейчас в теме
(4) А потом то куда все это записывается? Не в форму же в НаборКонтактнойИнформации
6. dim_1c 06.03.19 19:33 Сейчас в теме
(5) В конфигураторе откройте форму элемента справочника и посмотрите что из себя представляет НаборКонтактнойИнформации.
7. user876792 06.03.19 19:46 Сейчас в теме
(6) ТаблицаЗначении которая подозрительно похожа на регистр сведений КонтактнаяИнформация, но там нет такого поля "Установить основным"
Прикрепленные файлы:
8. spacecraft 06.03.19 19:50 Сейчас в теме
(7)
но там нет такого поля "Установить основным"

"ЗначениеПоУмолчанию" устанавливается.
"НаборКонтактнойИнформации.НайтиПоИдентификатору(Элементы.НаборКонтактнойИнформации.ТекущаяСтрока).ЗначениеПоУмолчанию = Истина;"
user876792; +1 Ответить
10. user876792 06.03.19 20:00 Сейчас в теме
(8)
Элементы.НаборКонтактнойИнформации.ТекущаяСтрока
Это из справочника? Нужно получать каждый элемент как объект и в него записывать это свойство?
11. spacecraft 06.03.19 20:10 Сейчас в теме
(10) Да. Можно через СоздатьНаборЗаписей с отбором по измерениям.
Только учтите, что помимо установки нужного значения в Истина, необходимо для другого сбросить в Ложь
user876792; +1 Ответить
12. dim_1c 06.03.19 20:21 Сейчас в теме
(11)
Только учтите, что помимо установки нужного значения в Истина, необходимо для другого сбросить в Ложь
В рамках одного типа, я так понимаю?
15. spacecraft 06.03.19 21:23 Сейчас в теме
(12) и для одного объекта. Нужно сбросить старое установленное значение по умолчанию.
13. user876792 06.03.19 20:37 Сейчас в теме
(11)
необходимо для другого сбросить в Ложь
Для какого другого?

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

Ошибка: Поле объекта не обнаружено (ЗначениеПоУмолчанию)

Почему не обнаружено? Есть же оно в регистре.
14. spacecraft 06.03.19 21:21 Сейчас в теме
(13) для начала, сколько и какие измерения в регистре? Явно не хватает отбора измерения по объекту.
17. user876792 06.03.19 21:46 Сейчас в теме
(14) три измерения:
объект -СправочникСсылка.Организации, СправочникСсылка.ФизическиеЛица, СправочникСсылка.Пользователи, СправочникСсылка.Контрагенты, СправочникСсылка.Клиенты, СправочникСсылка.ИТ_КонтактныеЛица,

тип - ПеречислениеСсылка.ТипыКонтактнойИнформации

вид - СправочникСсылка.ВидыКонтактнойИнформации, Строка
Прикрепленные файлы:
18. spacecraft 06.03.19 21:51 Сейчас в теме
(17) и где в (13) отбор по измерению Объект?
Далее, набор нужно еще прочитать, перед установкой ЗначениеПоУмолчанию.
21. user876792 06.03.19 21:55 Сейчас в теме
(18) Нужно для всех объектов в регистре установить почту по умолчанию рабочую или личную. Как тут делать отбор? Не известно какое там будет значение.

объект -СправочникСсылка.Организации, СправочникСсылка.ФизическиеЛица, СправочникСсылка.Пользователи, СправочникСсылка.Контрагенты, СправочникСсылка.Клиенты, СправочникСсылка.ИТ_КонтактныеЛица,
22. spacecraft 06.03.19 21:58 Сейчас в теме
(21) можно в запросе получить актуальные значения.
Делать обход по выборке и при необходимости создавать набор при каждой итерации.
Нельзя одним набором записать все значения.
24. user876792 06.03.19 22:03 Сейчас в теме
(22)
Делать обход по выборке и при необходимости создавать набор при каждой итерации.

Тогда что с отборами делать? Значение объекта заранее не известно будет
26. spacecraft 06.03.19 22:25 Сейчас в теме
(24) вот так:
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	КонтактныеЛицаКонтрагентов.Ссылка
	|ИЗ
	|	Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов";

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();
ВидКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Адрес электронной почты контактного лица контрагента");
Пока Выборка.Следующий() Цикл
	НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Объект.Установить(Выборка.Ссылка);
	НаборЗаписей.Прочитать();
	Если НаборЗаписей.Количество() <> 0 Тогда
		Для Каждого стрНабора из НаборЗаписей Цикл
			Если стрНабора.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
				Если стрНабора.ЗначениеПоУмолчанию = Истина Тогда
					стрНабора.ЗначениеПоУмолчанию = Ложь;
				КонецЕсли;
				Если стрНабора.Вид = ВидКонтактнойИнформации Тогда
					стрНабора.ЗначениеПоУмолчанию = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
    КонецЕсли;
	НаборЗаписей.Записать();
КонецЦикла;
Показать
16. spacecraft 06.03.19 21:38 Сейчас в теме
(13)
Для какого другого?

Пример: Для Иванова установлены телефоны:
- Рабочий - 11111 - ЗначениеПоУмолчанию = Истина
- Мобильный - 22222 - ЗначениеПоУмолчанию = Ложь

Устанавливаем Мобильный по-умолчанию. Получаем:
- Рабочий - 11111 - ЗначениеПоУмолчанию = Истина
- Мобильный - 22222 - ЗначениеПоУмолчанию = Истина

Получилась неоднозначное значение по-умолчанию.
Нужно и предыдущего значения по-умолчанию установленное в Истина сбросить в Ложь.
19. user876792 06.03.19 21:53 Сейчас в теме
(16)
Получилась неоднозначное значение по-умолчанию.
Нужно и предыдущего значения по-умолчанию установленное в Истина сбросить в Ложь.


У меня две почты: рабочая и личная, могут быть заполнены оба значения. Приоритет у рабочей, если значение в рабочей не заполнено, то по умолчанию нужно выставить личную.

Только не совсем понятно как быть с отбором в таком случае. Нужно в отбор добавить еще и личную?

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


Как в таком случае поставить условие Если заполнена рабочая то ей выставить значение по умолчанию, Если Личная тогда ей.
20. spacecraft 06.03.19 21:55 Сейчас в теме
(19) нет. ТАк не работает.
Нужно отдельно получать набор для каждого набора измерений.
23. user876792 06.03.19 22:00 Сейчас в теме
(20)
Нужно отдельно получать набор для каждого набора измерений.

Значит не получится сразу в регистр записывать? Тогда как это сделать? Из справочника запросом все записи получать и в каждой проверять какая почта заполнена и потом править через объект?
25. dim_1c 06.03.19 22:21 Сейчас в теме
(23) Нет, справочник не нужен. Вся информация есть в регистре сведений. Только надо подумать как ваше условие (две почты, рабочая и личная) лучше обработать. Мне кажется, это будет запрос + набор или менеджер записи.
27. spacecraft 06.03.19 23:13 Сейчас в теме +0.2 $m
(23) для условия использования разной почты переделал код:
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	КонтактныеЛицаКонтрагентов.Ссылка
	|ИЗ
	|	Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов";

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();
РабочаяПочта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Рабочая почта");
ЛичнаяПочта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Личная почта");
Пока Выборка.Следующий() Цикл
	НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Объект.Установить(Выборка.Ссылка);
	НаборЗаписей.Прочитать();
	Если НаборЗаписей.Количество() <> 0 Тогда
		ЕстьРабочаяПочта = Ложь;
		ЕстьИзменения = Ложь;
		СтрЛичнаяПочта = Неопределено;
		Для Каждого стрНабора из НаборЗаписей Цикл
			Если стрНабора.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
				Если стрНабора.ЗначениеПоУмолчанию = Истина Тогда
					стрНабора.ЗначениеПоУмолчанию = Ложь;
					ЕстьИзменения = Истина;
				КонецЕсли;
				Если стрНабора.Вид = РабочаяПочта Тогда
					ЕстьРабочаяПочта = Истина;
					стрНабора.ЗначениеПоУмолчанию = Истина;
					ЕстьИзменения = Истина;
				ИначеЕсли стрНабора.Вид = ЛичнаяПочта Тогда
					ЕстьЛичнаяПочта = Истина;
					СтрЛичнаяПочта = стрНабора;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		Если Не ЕстьРабочаяПочта И СтрЛичнаяПочта <> Неопределено Тогда
			СтрЛичнаяПочта.ЗначениеПоУмолчанию = Истина;
			ЕстьИзменения = Истина;
		КонецЕсли;
		Если ЕстьИзменения Тогда
			НаборЗаписей.Записать();
		КонецЕсли;
    КонецЕсли;
КонецЦикла;
Показать
29. user876792 07.03.19 13:59 Сейчас в теме
(27)
Если НаборЗаписей.Количество() <> 0 Тогда
Сюда даже не заходит.
Прикрепленные файлы:
30. ZloyProger 8 07.03.19 14:16 Сейчас в теме
ТС ты задачу по-человечески опиши, что нужно-то в конечном итоге? Тебе вариантов уже много предложили) По (29) скорее всего у тебя не по контактным лицам контрагентов заполнены почты (например по физлицам или пользователям), соответственно и выборку другую делать надо. Мой вариант как раз и делает как ты пишешь в (21) для всех объктов в регистре.
31. user876792 07.03.19 14:27 Сейчас в теме
(30) Так все описано. Только поля емейл два. На первом скрине это видно. Какое заполнено, то и сделать основным, приоритет рабочему мейлу.
43. ZloyProger 8 11.03.19 10:58 Сейчас в теме
Опять забыл как ссылку делать :-( (подскажите если несложно кто знает :-) ) ТС исходя из (31) в (28) я тебе уже готовое решение написал, просто заполнить параметры запроса правильно и все.. Типа (если не предопределенные элементы - лучше по коду искать, если предопределенные - по имени предопределенного):
Запрос.УстановитьПараметр("Рабочая", Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("КодРабочегоМыла");
Запрос.УстановитьПараметр("Личная", Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("КодЛичногоМыла");
32. spacecraft 07.03.19 14:43 Сейчас в теме
(29) значит в регистре сведений Контактная Информация нет вообще записей по конкретному элементу справочника ИТ_КонтактныеЛица, или по всем элементам справочника.
В запросе заменили справочник на ИТ_КонтактныеЛица?
33. user876792 07.03.19 15:04 Сейчас в теме
(32)
Прикрепленные файлы:
35. spacecraft 07.03.19 15:56 Сейчас в теме
(33) наименование вида не соответствует. Должно быть полное "E-Mail:рабочий E-Mail" и другая почта "E-Mail:Адрес электронной почты". Можно по коду искать, если так проще.

РабочаяПочта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("E-Mail:рабочий E-Mail");
Личная Почта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("E-Mail:Адрес электронной почты");
36. user876792 07.03.19 16:19 Сейчас в теме
(35)
наименование вида не соответствует. Должно быть полное "E-Mail:рабочий E-Mail" и другая почта "E-Mail:Адрес электронной почты"

в моем варианте значение у переменных заполнялось, в этом нет.
Прикрепленные файлы:
37. dim_1c 07.03.19 18:01 Сейчас в теме
(36) Попробуйте на копии. Этот вариант для случая когда возможны только 2 почты (рабочая и личная).
Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	КонтактнаяИнформация.Объект КАК Объект
		|ИЗ
		|	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
		|ГДЕ
		|	КонтактнаяИнформация.Объект ССЫЛКА Справочник.ИТ_КонтактныеЛица
		|			И КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)";
	
	РезультатЗапроса = Запрос.Выполнить();	
	Выборка = РезультатЗапроса.Выбрать();
	
	Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
	РабочаяПочта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("рабочий E-Mail");
	ЛичнаяПочта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Адрес электронной почты");
	
	Пока Выборка.Следующий() Цикл
		РабочаяПочтаПоУмолчанию = Ложь;
		
		Запись.Объект = Выборка.Объект;
		Запись.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
		Запись.Вид = РабочаяПочта;
		Запись.Прочитать();
		Если Запись.Выбран() Тогда
			Запись.ЗначениеПоУмолчанию = Истина;
			РабочаяПочтаПоУмолчанию = Истина;
			Запись.Записать();
			
		КонецЕсли;
		
		Запись.Вид = ЛичнаяПочта;
		Запись.Прочитать();
		Если Запись.Выбран() Тогда
			Запись.ЗначениеПоУмолчанию = НЕ РабочаяПочтаПоУмолчанию;
			Запись.Записать();
			
		КонецЕсли;
		
	КонецЦикла;
Показать
38. user876792 07.03.19 18:36 Сейчас в теме
Пустая выборка, посмотрел эта Елена еще и в других справочниках есть не только в ИТ_КонтактныеЛица. Наверно не нужно ничего выражать через ССЫЛКА просто взять все записи регистра и там где Тип: емайл и Вид: или рабочий или домашний установить значение по умолчанию.
40. dim_1c 07.03.19 18:57 Сейчас в теме
(38) В таком случае, конечно, надо убирать из условия ССЫЛКА. У Вас все данные, Вам и карты в руки :)
41. spacecraft 07.03.19 19:07 Сейчас в теме
(38) как вариант в запрос добавить записи из всех интересующих справочников:
Запрос.Текст = 
	"ВЫБРАТЬ
	|	КонтактныеЛицаКонтрагентов.Ссылка
	|ИЗ
	|	Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	КонтактныеЛица.Ссылка
	|ИЗ
	|	Справочник.КонтактныеЛица КАК КонтактныеЛица";
Показать
39. spacecraft 07.03.19 18:41 Сейчас в теме
(33) Эта Елена не факт что элемент справочника ИТ_КонтактныеЛица. Это может быть и элемент справочника КонтактныеЛица. Определитесь, в каком справочнике нужно менять.
9. dim_1c 06.03.19 19:51 Сейчас в теме
(7) А ресурс ЗначениеПоУмолчанию регистра сведений?
user876792; +1 Ответить
42. Dmitrij-2 45 08.03.19 10:35 Сейчас в теме
(1) Посмотрите в отладчике, что делает кнопка "Установить основным"
28. ZloyProger 8 07.03.19 13:42 Сейчас в теме +0.2 $m
А не проще сразу запросом? Если правильно понял задача - если заполнена только 1 почта установить её по умолчанию, если обе - то одну выбранную сделать по умолчанию:
ВЫБРАТЬ РАЗЛИЧНЫЕ
	КонтактнаяИнформация.Объект,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтактнаяИнформация.Вид) КАК Вид
ПОМЕСТИТЬ ВТВсеОбъекты
ИЗ
	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ГДЕ
	КонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
	И КонтактнаяИнформация.Вид В (&Рабочая, &Личная)
	И ПОДСТРОКА(КонтактнаяИнформация.Представление, 1, 1) <> """"

СГРУППИРОВАТЬ ПО
	КонтактнаяИнформация.Объект
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТВсеОбъекты.Объект,
	КонтактнаяИнформация.Тип,
	КонтактнаяИнформация.Вид,
	КонтактнаяИнформация.Представление,
	ВЫБОР
		КОГДА ВТВсеОбъекты.Вид = 1
			ТОГДА ИСТИНА
		ИНАЧЕ ВЫБОР
				КОГДА КонтактнаяИнформация.Вид = &Рабочая
					ТОГДА ИСТИНА
				ИНАЧЕ ЛОЖЬ
			КОНЕЦ
	КОНЕЦ КАК ПоУмолчанию
ИЗ
	ВТВсеОбъекты КАК ВТВсеОбъекты,
	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
Затем просто выборкой обойти и заполнить запись и записать, не связываясь с набором вообще)
А-ля:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Запись = РегистрыСведений.КонтактнаяИнформация.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(Запись, Выборка);
    Запись.Записать(Истина);
КонецЦикла;
Показать
34. user876792 07.03.19 15:08 Сейчас в теме
(28)
если обе - то одну выбранную сделать по умолчанию:
если обе то рабочую
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот