Создание документа событие из справочника КОнтрагент программно и внесение реквизита "контрагент"

1. user970589 10 19.09.18 06:48 Сейчас в теме
1С:Предприятие 8.3 (8.3.12.1529)
Управление нашей фирмой, редакция 1.6 (1.6.15.53)

Из Справочника Контрагент создаю документ "Событие", заполняю его, - не могу вписать реквизит Контрагент.
Дело в том, что в УНФ в Событии Контрагент является двойным типом, то есть может быть
Лидом или Контрагентом. Соответственно в список реквизитов он не внесен, а имеет место быть лишь в реквизитах самой формы Событие. Не понимаю, как 1С его записывает и хранит?

Подробно.
имеем справочник Контрагенты. В нем встроена кнопка для изменения реквизита, добавленного в расширении. Реквизит называется РПС_ЯП и означает "Является производителем". Кнопка встроена также в Лиды и в Событие. т.е. в любом из них я по нажатию кнопки получаю изменение, в т.ч. из документа событие - изменение происходит в контрагенте или Лиде. И все бы ничего, но надо еще сделать регистрацию этой смены, договорились на создании события в ленте событий, в котором отразится кто, когда и на что изменил. Событие соответственно создаю программно после нажатия кнопки.
И тут уже проблема - в самом документе "Событие" такого реквизита как Контрагент нет. Он есть в форме события, причем двойной Контрагент/Лид. То есть я не могу напрямую обратиться к реквизиту и изменить его в событии. тем более, что форма не открыта, все &НаСервере. Я использовал НовДок.Заполнить(Справочники.Контрагенты); - документ исправно заполнился, кроме контрагента.. Собственно я не понимаю две вещи - как хранится этот реквизит, если он существует только в форме и как соответственно его программно записать? выглядит в справочнике вот так на текущий момент:
&НаКлиенте 
Процедура Расш1_РПС_ЯППосле(Команда) // смена ЯП 
Если Объект.РПС_ЯП Тогда 
Объект.РПС_ЯП = Ложь; 
Элементы.Группа_ЯП.ЦветФона = WebЦвета.Серый; 
// добавить создание документа 
СоздатьСобытиеПриИзмененииЯП("не ЯП", Объект.Наименование); 
Иначе 
Элементы.Группа_ЯП.ЦветФона = WebЦвета.Красный; 
Объект.РПС_ЯП = Истина; 
// добавить создание документа 
СоздатьСобытиеПриИзмененииЯП("ЯП", Объект.Наименование); 
//Форма = ПолучитьФорму("Документ.Событие.Форма.ФормаСобытия"); 
//Форма.ЭтаФорма.Контрагент = Элементы.Наименование; 
КонецЕсли; 
КонецПроцедуры 

&НаКлиенте 
Процедура Расш1_ПриОткрытииПеред(Отказ) //проверка ЯП 
Если Объект.РПС_ЯП Тогда 
Элементы.Группа_ЯП.ЦветФона = WebЦвета.Красный; 
Иначе 
Элементы.Группа_ЯП.ЦветФона = WebЦвета.Серый; 
КонецЕсли; 
КонецПроцедуры 

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


последняя процедура была переписана за пару часов раз двадцать и переменная Контрагент на входе в текущий момент не используется..
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Doreng 27 19.09.18 09:22 Сейчас в теме
(1)Похоже Контрагент просто читается из документа основания при открытии формы
+
3. user970589 10 19.09.18 09:24 Сейчас в теме
(2)Основанием для События может быть и зачастую является тоже событие. Нет, есть какой-то другой механизм
+
4. Doreng 27 19.09.18 09:26 Сейчас в теме
(3)Ну реквизит "Контрагент" есть только на форме, в обработке записи я ничего не нашел(смотрел бегло), могу только посоветовать смотреть отладкой при открытии документа и ловить момент заполнения контрагента
user970589; +1
5. user970589 10 19.09.18 09:48 Сейчас в теме
(4)
хотя.. вот что пока накопал в обработке:

Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если СобытиеПривязаноКЗвонку 
		И ИсточникВыбора.ИмяФормы = "Справочник.Контрагенты.Форма.ФормаЭлемента" 
		И НЕ ЗначениеЗаполнено(Контрагент) И ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
		
		Контрагент = ВыбранноеЗначение;
		КонтрагентПриИзмененииСервер();
		Записать();
	КонецЕсли;
	
КонецПроцедуры
Показать
+
7. Doreng 27 19.09.18 09:57 Сейчас в теме
(5)5 раз перечитал процедуру, вообще не понял для чего метод записать вызывается, видимо для записи контактных лиц, но это не важно про УНФ я давно понял - проще переписать чем разбираться....ее писал человек явно более одаренный чем я :-). Там есть "форма документа" и "Форма события", форма документа стартует раньше. У меня просто события в базе не используются и версия сильно старее
+
6. user970589 10 19.09.18 09:52 Сейчас в теме
(4)
Контрагент" есть только на форме, в обработке записи я ничего не нашел(смотрел бегло), могу только посоветовать смотреть отладкой при открытии документа и ловить момент заполнения

да я в общем так и делаю, другого выхода тоже не вижу
+
8. alex-l19041 8 19.09.18 09:57 Сейчас в теме
в модуле формы

Процедура ПрочитатьРеквизиты(Объект)
	
	Контакты.Очистить();
	ПерваяСтрока = Истина;
	
	Для Каждого СтрокаУчастники Из Объект.Участники Цикл
		
		Если ПерваяСтрока Тогда
			Контрагент = СтрокаУчастники.Контакт;
			КонтрагентКакСвязаться = СтрокаУчастники.КакСвязаться;
			ПерваяСтрока = Ложь;
			Продолжить;
		КонецЕсли;
		
		СтрокаКонтакты = Контакты.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаКонтакты, СтрокаУчастники);
		
	КонецЦикла;
	
КонецПроцедуры
Показать
user970589; +1
11. user970589 10 19.09.18 10:05 Сейчас в теме
(8)
Если я правильно читаю, то тут контрагент присваивается из контактов лид. И перед этим наверное какая-то проверка стоит на контрагент не заполнен.
+
9. alex-l19041 8 19.09.18 10:01 Сейчас в теме
Заполняете хотя бы одну строку таблицы Участники ?
+
10. Doreng 27 19.09.18 10:03 Сейчас в теме
(9)Вроде процедура КонтрагентПриИзмененииСервер(); это делает, но фишка не понятна с заполнением контрагента на форме, хотя может автору и этого будет достаточно
+
12. user970589 10 19.09.18 10:09 Сейчас в теме
(10)
КонтрагентПриИзмененииСервер

Насколько я понимаю - нет.
Это работа с контактами.
Тут надо еще понимать, что в УНФ контакт стал самостоятельной единицей, то есть он может быть в составе Лида, Контрагента, а может быть сам по себе, как дядь Федор из Простоквашино.

СтрокиКУдалению = Новый Массив;
КонтактыКонтрагента = Справочники.Контрагенты.СвязанныеКонтакты(Контрагент);
Для Каждого СтрокаКонтакты Из Контакты Цикл
Если ТипЗнч(СтрокаКонтакты.Контакт) = Тип("СправочникСсылка.КонтактныеЛица")
И ЗначениеЗаполнено(СтрокаКонтакты.Контакт)
И КонтактыКонтрагента.Найти(СтрокаКонтакты.Контакт) = Неопределено Тогда
СтрокиКУдалению.Добавить(СтрокаКонтакты);
КонецЕсли;
КонецЦикла;

Для каждого Строка Из СтрокиКУдалению Цикл
Контакты.Удалить(Строка);
КонецЦикла;

ОбновитьКакСвязаться();
+
13. user970589 10 19.09.18 10:19 Сейчас в теме
14. user970589 10 19.09.18 10:28 Сейчас в теме
Нашел, вот тут присваивается, строка
"Контрагент = СтрокаУчастники.Контакт;" :

&НаСервере
Процедура ПрочитатьРеквизиты(Объект)

Контакты.Очистить();
ПерваяСтрока = Истина;

Для Каждого СтрокаУчастники Из Объект.Участники Цикл

Если ПерваяСтрока И ТипЗнч(СтрокаУчастники.Контакт) <> Тип("Строка") Тогда
Контрагент = СтрокаУчастники.Контакт;
КонтрагентКакСвязаться = СтрокаУчастники.КакСвязаться;
ПерваяСтрока = Ложь;
Продолжить;
КонецЕсли;

СтрокаКонтакты = Контакты.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаКонтакты, СтрокаУчастники);

КонецЦикла;

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

Если НЕ ЗначениеЗаполнено(Ответственный) Тогда
Ответственный = Объект.Ответственный;
КонецЕсли;

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

Если ДокументСозданСлужебнымПользователем Тогда
АвторДокумента = НСтр("ru='# создан автоматически'");
Иначе
АвторДокумента = Объект.Автор;
КонецЕсли;

КонецПроцедуры
+
15. user970589 10 20.09.18 13:46 Сейчас в теме
в общем сделал на костылях. Если корифеи подскажут как красиво сделать - буду благодарен.
Я нашел в обработках как это делает сама 1С (через 3 процедуры): &НаСервере
Процедура ЗаполнитьПоКонтрагентуСервер(Контрагент) ... 
&НаСервере 
Процедура ЗаполнитьПоОснованиюСервер(ДокументОснование) 
&НаСервере 
Процедура ПрочитатьРеквизиты(Объект) , 


но не понял, как это применить в моем случае - постоянно ошибки вылетали с передачей данных, переменных..
Добавил в событие реквизит "РПС_Контрагент" для сохранения данных о контрагенте (1С не хранит их, а вытаскивает из контактов 8-0 )
На клиенте меняю реквизиты группы (цвет бара), вызываю сервер, создаю документ событие, заполняю его через заполнить, присваиваю дату, тему, содержание, тип. записываю. (далее проблемы были при открытии события, т.к. контрагент то не подтягивался.)
Поэтому в РПС_Контрагент сохраняю Контрагента из Контрагента..
В клиенте передаем в процедуру контрагента:
СоздатьСобытиеПриИзмененииЯП("ЯП", Объект.Наименование); 

далее
&НаСервере 
Процедура СоздатьСобытиеПриИзмененииЯП (ЯП, Контрагент) 
НовДок = Документы.Событие.СоздатьДокумент(); 
НовДок.Заполнить(Справочники.Контрагенты); 
НовДок.РПС_Контрагент = Контрагент; 
НовДок.Дата = ТекущаяДата(); 
НовДок.Тема = "Смена ЯП"; 
НовДок.Содержание = "Изменено на " + ЯП; 
НовДок.ТипСобытия = Перечисления.ТипыСобытий.Прочее; 
НовДок.Записать(); 
КонецПроцедуры 
Показать

Создается событие, в которм есть все, что мне нужно, оно имеет тип Прочее, но контрагент там пока не вписан. открываем событие и при открытии вписываем в него контрагента:
&НаКлиенте 
Процедура Расш1_ПриОткрытииПосле(Отказ) 
.... 
Если НЕ Объект.РПС_Контрагент = "" Тогда 
ПолучитьКонтрагентаИзРПС(); 
КонецЕсли; 
КонецПроцедуры 

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

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