Проблема связать документ с основанием

1. user1500067 01.04.21 09:28 Сейчас в теме
Доброго времени суток! Столкнулся с проблемой: не могу передать данные из документа в документ, который создаётся на его основании. Суть вот такая: есть документ (назовём его Первый) на его основании создаётся другой документ (Второй), а потом на основании Второго создаётся документ Третий. Так вот в Третий документ мне нужно передать значение реквизита Источник из Первого документа. Не могу понять как это сделать. Я сначала передавал значение из Первого во Второй, а потом в Третий и работало, но так делать не стоит, поэтому теперь пытаюсь передать напрямую из Первого в Третий.
Не подскажите, как можно реализовать?

P.S.
Вот код, который работал, когда я передавал последовательно
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
	
	Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") Тогда
		ЗаполнитьПоЗапросу(
			ДанныеЗаполнения,
			ДанныеЗаполнения);
			
	КонецЕсли;
	
	//Конец доработки
	
КонецПроцедуры


//Новый код
Процедура ЗаполнитьПоЗапросу(Знач Основание, ДанныеЗаполнения)

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


Документом основанием для ТелефонныйЗвонок является Справочник.Запросы и вот оттуда мне и надо передать реквизит Источник в Справочник.СделкиСКлиентами
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
54. BuryMeInVegas 01.04.21 12:06 Сейчас в теме +0.19 $m
(53) ДанныеЗаполнения - тип данных "ДокументСсылка.ТелефонныйЗвонок"? Если да, тогда мы можем получить отсюда поле "ВзаимодействиеОснование". Далее определяем его тип, и если "ВзаимодействиеОснование" является ссылкой на справочник "Запросы", тогда можем заполнить поле "Источник" напрямую из ссылки на элемент справочника "Запросы".

UPD. В режиме отладки остановитесь перед нашим условием и вычислите выражение из "ДанныеЗаполнения". Посмотрите, какие поля доступны.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DenisCh 01.04.21 09:31 Сейчас в теме
А если брать в третьем основание из второго, и потом уже из основания брать первый?
3. BuryMeInVegas 01.04.21 09:32 Сейчас в теме
(2) А если там цепочка из 10 документов? Или из 50? Нужна рекурсия.

UPD. Т.е. искать родителя до тех пор, пока мы не найдём первый документ в цепочке.
4. DenisCh 01.04.21 09:34 Сейчас в теме
(3) А если 10 000? То рекурсия завалит 1с...

А если там 100500 миллиардов? Так тут и Cray не поможет...
6. BuryMeInVegas 01.04.21 09:35 Сейчас в теме
(4) А что делать? Хотелки заказчика бывают разные...) Я сам столкнулся с подобной задачей, где может быть неопределенное количество посредников, только это происходит ещё и на СКД. Я плакал, пока писал, но выхода другого просто нет.

UPD. Кстати говоря, условие задачи то неполное. Нам всегда нужно поле "Источник" именно из первого документа в цепочке?
9. user1500067 01.04.21 09:41 Сейчас в теме
(6)Поле Источник из Первого документа должно передаться в последний. Во втором документе этого поля может и не быть
10. user1500067 01.04.21 09:41 Сейчас в теме
Напишите ваше сообщение
(9)Но я его создал во втором документе, когда писал первый вариант кода
7. user1500067 01.04.21 09:38 Сейчас в теме
(3)А как это можно сделать? Раньше с рекурсией не сталкивался
11. BuryMeInVegas 01.04.21 09:44 Сейчас в теме
(7) Я бы это делал так (ВНИМАНИЕ! Рекурсия! Предупреждаю, что при большом количестве записей быстродействие не гарантировано!)

//Новый код
Функция ЗаполнитьПоЗапросуРекурсивно(Знач Основание)

    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ТелефонныйЗвонок.ДокументОснование КАК Родитель
                          |ИЗ
                          |    Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
                          |ГДЕ
                          |    ТелефонныйЗвонок.Ссылка = &Ссылка");

    // Передаём в запрос найденный нами родительский документ и выполняем запрос
    Запрос.УстановитьПараметр("Ссылка", Основание);
    Результат = Запрос.Выполнить();
    
    // Проверяем результат запроса на наличие данных, если их нет, возвращаем "Неопределено"
    Если Результат.Пустой() Тогда
            Возврат Неопределено;
    КонецЕсли;

    // Формируем выборку и обходим её.
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
         
         НайденныйРодитель = ЗаполнитьПоЗапросуРекурсивно(Выборка.Родитель) ;
         
    КонецЦикла;
   
    // Возвращаем значение поля "Источник" у найденного первого (корневого) родительского документа 
    Возврат НайденныйРодитель.Источник;

КонецФункции
Показать


Работоспособность кода не проверял, будут ошибки, присылайте, исправлю.
13. user1500067 01.04.21 09:56 Сейчас в теме
(11) Вот такая ошибка вылезает
Ошибка при выполнении обработчика - 'ОбработкаЗаполнения'
по причине:
{(2, 22)}: Поле не найдено "ТелефонныйЗвонок.ДокументОснование"
ТелефонныйЗвонок.<<?>>ДокументОснование КАК Родитель
{Справочник.СделкиСКлиентами.МодульОбъекта(212)}: Результат = Запрос.Выполнить();
{Справочник.СделкиСКлиентами.МодульОбъекта(176)}: ЗаполнитьПоЗапросуРекурсивно("Основание");

по причине:
{(2, 22)}: Поле не найдено "ТелефонныйЗвонок.ДокументОснование"
ТелефонныйЗвонок.<<?>>ДокументОснование КАК Родитель
14. BuryMeInVegas 01.04.21 09:58 Сейчас в теме
(13) Ну так я же не знаю, в каком поле у Вас лежит родительски документ.) Отредактируйте запрос так, чтобы получать родителя и всё.

UPD. Кстати, а в каком модуле выполняется код? Если в модуле объекта, то родителя можно передавать в запрос напрямую для первой итерации.
15. user1500067 01.04.21 10:04 Сейчас в теме
16. user1500067 01.04.21 10:05 Сейчас в теме
(14) А вот как передать родителя в запрос не понимаю
17. BuryMeInVegas 01.04.21 10:13 Сейчас в теме
(16)
// Выше какой-то код

ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
    
    Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") Тогда

        // Вот тут мы вызываем нашу рекурсивную функцию. В неё передаём ссылку на документ-основание
        ИсточникИзРодителя = ЗаполнитьПоЗапросу(ДокументОснование);
            
    КонецЕсли;
    
    //Конец доработки
    
КонецПроцедуры

//Вот наша рекурсивная функция, сюда передали документ основание из последнего дочернего документа,
//а на следующих итерациях будем передавать найденного родителя 
Функция ЗаполнитьПоЗапросуРекурсивно(Основание)

    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ТелефонныйЗвонок.ДокументОснование КАК Родитель
                          |ИЗ
                          |    Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
                          |ГДЕ
                          |    ТелефонныйЗвонок.Ссылка = &Ссылка");

    // Передаём в запрос найденный нами родительский документ и выполняем запрос
    Запрос.УстановитьПараметр("Ссылка", Основание);
    Результат = Запрос.Выполнить();
    
    // Проверяем результат запроса на наличие данных, если их нет, возвращаем "Неопределено"
    Если Результат.Пустой() Тогда
            Возврат Неопределено;
    КонецЕсли;

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

КонецФункции
Показать


Функция "ЗаполнитьПоЗапросуРекурсивно" вызывает сама себя, а в неё мы передаём найденного родителя во время обхода выборки.
18. user1500067 01.04.21 10:24 Сейчас в теме
(17) ТелефонныйЗвонок.ДокументОснование поле в котором лежит родительскиий документ называется ВзаимодействиеОснование и является составным типом, как тогда его в запрос добавить?
19. BuryMeInVegas 01.04.21 10:28 Сейчас в теме
(18) Поле "Источник" лежит в каком документе? "ДокументСсылка.ТелефонныйЗвонок"? Мы именно его уже и передаём в запрос. Если хотите перебдеть, и 1000% передать именно его, тогда

Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") Тогда
       
     Если ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ТелефонныйЗвонок")
        // Вот тут мы вызываем нашу рекурсивную функцию. В неё передаём ссылку на документ-основание
        ИсточникИзРодителя = ЗаполнитьПоЗапросу(ВзаимодействиеОснование);
     КонецЕсли;
       
КонецЕсли;
Показать

Так мы железобетонно передаём в запрос ссылку на нужный нам документ.
23. user1500067 01.04.21 10:35 Сейчас в теме
(19) Поле источник лежит в Справочник.Запросы. Получается так: В справочник.Запросы есть "Источник", на основании этого справочника создаётся Документ.ТелефонныйЗвонок (в этом документе нет "Источника") и на основании Документ.ТелефонныйЗвонок создаётся Справочник.СделкиСКлиентами в котором уже есть "источник" и значение должно быть таким же, как и в первом справочнике
25. BuryMeInVegas 01.04.21 10:36 Сейчас в теме
26. user1500067 01.04.21 10:38 Сейчас в теме
(25) 1С:Предприятие 8.3
Управление торговлей, редакция 11.2 (11.2.3.199)
27. BuryMeInVegas 01.04.21 10:42 Сейчас в теме
(26) Так. У Вас, получается, данные лежат и не в документе вовсе, а в справочнике! Это же совершенно другая степь, условие задачи поставлено некорректно. Тут не нужна рекурсия в таком случае. Сделайте, пожалуйста, скрины справочника "Запросы" (реквизитный состав), документа "ТелефонныеЗвонки" и справочника "СделкиСКлиентами".
28. user1500067 01.04.21 10:48 Сейчас в теме
(27)
Прикрепленные файлы:
29. user1500067 01.04.21 10:50 Сейчас в теме
(27)В Документ.ТелефонныйЗвонок есть "Источник", но я его удалю, так как его изначально та мне было, так что можно считать, что его нет
30. BuryMeInVegas 01.04.21 10:52 Сейчас в теме
(29) Сколько может быть документов "ТелефонныйЗвонок" между "Заявка" и "СделкаСКлиентом"? И может ли быть создан документ "ТелефонныйЗвонок" на основании другого документа "ТелефонныйЗвонок"?
31. user1500067 01.04.21 10:57 Сейчас в теме
(30) Между Справочник.Запросы и Справочник.СделкаСКлиентом только один ТелефонныйЗвонок. ТелефонныйЗвонок может быть создан на основании ТелефонныйЗвонок
32. BuryMeInVegas 01.04.21 11:01 Сейчас в теме
(31)
ТелефонныйЗвонок может быть создан на основании ТелефонныйЗвонок.


Так получается, что может быть несколько?)

Короче, в любом случае в документе "ТелефонныйЗвонок" будет ссылка на элемент справочника "Запросы"?

UPD. Ситуация, как на рисунке допустима?
Прикрепленные файлы:
33. user1500067 01.04.21 11:03 Сейчас в теме
(32) "Короче, в любом случае в документе "ТелефонныйЗвонок" будет ссылка на элемент справочника "Запросы"? " Да, именно так.
35. BuryMeInVegas 01.04.21 11:07 Сейчас в теме
(33) Тогда никаких проблем. При создании элемента справочника "СделкиСКлиентами" при заполнении его полей, можно по ссылке напрямую обратиться к элементу справочника "Заявки" и передать значение любого поля этого элемента в "Сделки".
37. user1500067 01.04.21 11:10 Сейчас в теме
(35)Вот я и не понимаю, как это сделать. И "Источник" в конечном Справочник.СделкиСКлиентами должен быть такой же как и в Справочник.Запросы (на основании которого был создан ТелефонныйЗвонок и из которого потом получился Справочник.СделкиСКлиентами)
34. user1500067 01.04.21 11:05 Сейчас в теме
Напишите ваше сообщение
(32)
Короче, в любом случае в документе "ТелефонныйЗвонок" будет ссылка на элемент справочника "Запросы"?


Я имею ввиду, что когда я нахожусь в Справочник.Запросы я могу создать на его основании Документ.ТелефонныйЗвонок, далее в Документ.ТелефонныйЗвонок я могу создать на его основании только Справочник.СделкиСКлиентами (на этом этапе я не могу снова создать телефонный звонок)
38. BuryMeInVegas 01.04.21 11:14 Сейчас в теме
(34) Ну так а в чём проблема то тогда? На основании "ТелефонныйЗвонок" создаёте сделку, ставите следующее условие

Если ТипЗнч(ВзаимодействиеОснование) = Тип("СправочникСсылка.Заявка") Тогда
Источник = ВзаимодействиеОснование.Источник;
Иначе
// Вот сюда исключительный случай, если в основании лежит не элемент справочника "Заявка"
КонецЕсли;


Всё. Всё это делается в процедуре, обрабатывающей заполнение элемента справочника на основании данных из документа.
39. user1500067 01.04.21 11:22 Сейчас в теме
(38) Что-то я уже окончательно запутался в коде. Не могли бы Вы дать пример полного кода как оно должно быть всё в месте?
40. BuryMeInVegas 01.04.21 11:23 Сейчас в теме
(39) Скиньте сюда всю процедуру заполнения элемента справочника "СделкиСКлиентами" на основании документа "ТелефонныйЗвонок".
41. user1500067 01.04.21 11:29 Сейчас в теме
(40)
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ДанныеЗаполнения <> Неопределено И ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
		Если ДанныеЗаполнения.Свойство("Закрыта") Тогда
			ДанныеЗаполнения.Закрыта = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Ответственный = Пользователи.ТекущийПользователь();
	Статус        = Перечисления.СтатусыСделок.ВРаботе;
	ДатаНачала    = ТекущаяДата();
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Партнеры") Тогда
		//сделка на основании партнера
		Партнер = ДанныеЗаполнения;
		ПродажиСервер.ПроверитьВозможностьВводаНаОснованииПартнераКлиента(Партнер);
		
	Иначе
		
		Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда
			
			Запрос = Новый Запрос;
			Запрос.Текст = "
			|ВЫБРАТЬ
			|	Партнеры.Клиент,
			|	Партнеры.Ссылка
			|ИЗ
			|	Справочник.Партнеры КАК Партнеры
			|ГДЕ
			|	Партнеры.Ссылка В
			|			(ВЫБРАТЬ
			|				КонтактныеЛицаПартнеров.Владелец
			|			ИЗ
			|				Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
			|			ГДЕ
			|				КонтактныеЛицаПартнеров.Ссылка = &КонтактноеЛицо)";
			
			Запрос.УстановитьПараметр("КонтактноеЛицо", ДанныеЗаполнения);
			
			Выборка = Запрос.Выполнить().Выбрать();
			
			Если Выборка.Следующий() Тогда
				
				Если НЕ Выборка.Клиент Тогда
					
					ТекстОшибки = НСтр("ru='%КонтактноеЛицо% не является контактным лицом партнера - клиента. Вввод сделки на основании доступен только для клиента.'");
					ТекстОшибки = СтрЗаменить(ТекстОшибки, "%КонтактноеЛицо%", ДанныеЗаполнения);
					
					ВызватьИсключение ТекстОшибки;
					
				Иначе
					
					Партнер = Выборка.Ссылка;
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
		Взаимодействия.ЗаполнитьРеквизитыПоУмолчанию(ЭтотОбъект, ДанныеЗаполнения);
		
	КонецЕсли;
	
	Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами") Тогда
		
		ЗаполнитьУсловияПродаж();
		
	КонецЕсли;
	
	ВалютаПервичногоСпроса = ДоходыИРасходыСервер.ПолучитьВалютуУправленческогоУчета(ВалютаПервичногоСпроса);
	        //выше код ОбработкаЗаполнения
			ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
         

	Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") Тогда

	    
	  ЗаполнитьПоЗапросуРекурсивно("Основание");
	        
	КонецЕсли;
    
	
	
	
	
	
	//Конец доработки
    
КонецПроцедуры
Показать
42. BuryMeInVegas 01.04.21 11:34 Сейчас в теме
(41)
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Если ДанныеЗаполнения <> Неопределено И ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        Если ДанныеЗаполнения.Свойство("Закрыта") Тогда
            ДанныеЗаполнения.Закрыта = Ложь;
        КонецЕсли;
    КонецЕсли;
    
    Ответственный = Пользователи.ТекущийПользователь();
    Статус        = Перечисления.СтатусыСделок.ВРаботе;
    ДатаНачала    = ТекущаяДата();
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Партнеры") Тогда
        //сделка на основании партнера
        Партнер = ДанныеЗаполнения;
        ПродажиСервер.ПроверитьВозможностьВводаНаОснованииПартнераКлиента(Партнер);
        
    Иначе
        
        Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда
            
            Запрос = Новый Запрос;
            Запрос.Текст = "
            |ВЫБРАТЬ
            |    Партнеры.Клиент,
            |    Партнеры.Ссылка
            |ИЗ
            |    Справочник.Партнеры КАК Партнеры
            |ГДЕ
            |    Партнеры.Ссылка В
            |            (ВЫБРАТЬ
            |                КонтактныеЛицаПартнеров.Владелец
            |            ИЗ
            |                Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
            |            ГДЕ
            |                КонтактныеЛицаПартнеров.Ссылка = &КонтактноеЛицо)";
            
            Запрос.УстановитьПараметр("КонтактноеЛицо", ДанныеЗаполнения);
            
            Выборка = Запрос.Выполнить().Выбрать();
            
            Если Выборка.Следующий() Тогда
                
                Если НЕ Выборка.Клиент Тогда
                    
                    ТекстОшибки = НСтр("ru='%КонтактноеЛицо% не является контактным лицом партнера - клиента. Вввод сделки на основании доступен только для клиента.'");
                    ТекстОшибки = СтрЗаменить(ТекстОшибки, "%КонтактноеЛицо%", ДанныеЗаполнения);
                    
                    ВызватьИсключение ТекстОшибки;
                    
                Иначе
                    
                    Партнер = Выборка.Ссылка;
                    
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
        Взаимодействия.ЗаполнитьРеквизитыПоУмолчанию(ЭтотОбъект, ДанныеЗаполнения);
        
    КонецЕсли;
    
    Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами") Тогда
        
        ЗаполнитьУсловияПродаж();
        
    КонецЕсли;
    
    ВалютаПервичногоСпроса = ДоходыИРасходыСервер.ПолучитьВалютуУправленческогоУчета(ВалютаПервичногоСпроса);
            //выше код ОбработкаЗаполнения
            ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
         
    // Если создаём "Сделку" на основании документа "ТелефонныйЗвонок" 
    //и в основании телефонного звонка ссылка на справочник "Заявки" тогда вытаскиваем "Источник" из справочника напрямую
    Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") и
           ТипЗнч(ТипДанныхЗаполнения.ВзаимодействиеОснование) = Тип("СправочникСсылка.Заявки") Тогда
         Источник = ТипДанныхЗаполнения.ВзаимодействиеОснование.Источник;
    Иначе
         // Реализуем заполнение в исключительных случаях по другой необходимой логике         
    КонецЕсли;
    

    //Конец доработки
    
КонецПроцедуры
Показать
43. user1500067 01.04.21 11:42 Сейчас в теме
(42) Вот такая ошибка
Ошибка при выполнении обработчика - 'ОбработкаЗаполнения'
по причине:
Значение не является значением объектного типа (ВзаимодействиеОснование)
{Справочник.СделкиСКлиентами.МодульОбъекта(172)}: Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") и ТипЗнч(ТипДанныхЗаполнения.ВзаимодействиеОснование) = Тип("СправочникСсылка.Заявки") Тогда
44. BuryMeInVegas 01.04.21 11:42 Сейчас в теме
(43) ТипДанныхЗаполнения - какой тип данных?
45. user1500067 01.04.21 11:50 Сейчас в теме
(44)ДокументСсылка.ТелефонныйЗвонок
46. BuryMeInVegas 01.04.21 11:51 Сейчас в теме
(45) Я нашёл свою ошибку.) Невнимательность-с.))

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Если ДанныеЗаполнения <> Неопределено И ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        Если ДанныеЗаполнения.Свойство("Закрыта") Тогда
            ДанныеЗаполнения.Закрыта = Ложь;
        КонецЕсли;
    КонецЕсли;
    
    Ответственный = Пользователи.ТекущийПользователь();
    Статус        = Перечисления.СтатусыСделок.ВРаботе;
    ДатаНачала    = ТекущаяДата();
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Партнеры") Тогда
        //сделка на основании партнера
        Партнер = ДанныеЗаполнения;
        ПродажиСервер.ПроверитьВозможностьВводаНаОснованииПартнераКлиента(Партнер);
        
    Иначе
        
        Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда
            
            Запрос = Новый Запрос;
            Запрос.Текст = "
            |ВЫБРАТЬ
            |    Партнеры.Клиент,
            |    Партнеры.Ссылка
            |ИЗ
            |    Справочник.Партнеры КАК Партнеры
            |ГДЕ
            |    Партнеры.Ссылка В
            |            (ВЫБРАТЬ
            |                КонтактныеЛицаПартнеров.Владелец
            |            ИЗ
            |                Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
            |            ГДЕ
            |                КонтактныеЛицаПартнеров.Ссылка = &КонтактноеЛицо)";
            
            Запрос.УстановитьПараметр("КонтактноеЛицо", ДанныеЗаполнения);
            
            Выборка = Запрос.Выполнить().Выбрать();
            
            Если Выборка.Следующий() Тогда
                
                Если НЕ Выборка.Клиент Тогда
                    
                    ТекстОшибки = НСтр("ru='%КонтактноеЛицо% не является контактным лицом партнера - клиента. Вввод сделки на основании доступен только для клиента.'");
                    ТекстОшибки = СтрЗаменить(ТекстОшибки, "%КонтактноеЛицо%", ДанныеЗаполнения);
                    
                    ВызватьИсключение ТекстОшибки;
                    
                Иначе
                    
                    Партнер = Выборка.Ссылка;
                    
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
        Взаимодействия.ЗаполнитьРеквизитыПоУмолчанию(ЭтотОбъект, ДанныеЗаполнения);
        
    КонецЕсли;
    
    Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами") Тогда
        
        ЗаполнитьУсловияПродаж();
        
    КонецЕсли;
    
    ВалютаПервичногоСпроса = ДоходыИРасходыСервер.ПолучитьВалютуУправленческогоУчета(ВалютаПервичногоСпроса);
            //выше код ОбработкаЗаполнения
            ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
         
    // Если создаём "Сделку" на основании документа "ТелефонныйЗвонок" 
    //и в основании телефонного звонка ссылка на справочник "Заявки" тогда вытаскиваем "Источник" из справочника напрямую
    Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") и
           ТипЗнч(ДанныеЗаполнения.ВзаимодействиеОснование) = Тип("СправочникСсылка.Запросы") Тогда
         Источник = ДанныеЗаполнения.ВзаимодействиеОснование.Источник;
    Иначе
         // Реализуем заполнение в исключительных случаях по другой необходимой логике         
    КонецЕсли;
    

    //Конец доработки
    
КонецПроцедуры
Показать
47. user1500067 01.04.21 11:54 Сейчас в теме
(46) Я уже исправил это, но ошибка та же самая
48. user1500067 01.04.21 11:55 Сейчас в теме
(46) Если быть точнее то
Ошибка при выполнении обработчика - 'ОбработкаЗаполнения'
по причине:
Значение не является значением объектного типа (ВзаимодействиеОснование)
{Справочник.СделкиСКлиентами.МодульОбъекта(172)}: Если ТипДанныхЗаполнения = Тип("ДокументСсылка.ТелефонныйЗвонок") и ТипЗнч(ТипДанныхЗаполнения.ВзаимодействиеОснование) = Тип("СправочникСсылка.Запросы") Тогда
49. BuryMeInVegas 01.04.21 11:56 Сейчас в теме
(47) У Вас есть Anydesk? Проще будет сделать таким образом.)
50. user1500067 01.04.21 11:59 Сейчас в теме
51. user1500067 01.04.21 12:00 Сейчас в теме
(49) Да и не смогу я его по объективным причинам поставить на рабочий компьютер
52. BuryMeInVegas 01.04.21 12:01 Сейчас в теме
(51) Я Вас понял. В режиме отладки посмотрите, каким образом можно через "ДанныеЗаполнения" обратиться к "ВзаимодействиеОснование". Всё, что выше - это всё предположения, пока мы не увидим реальной картины в режиме отладки, ничего не получиться сделать.
53. user1500067 01.04.21 12:03 Сейчас в теме
(44) Я не туда посмотрел! ТипДанныхЗаполнения написано "Тип", значение "Телефонный звонок"
54. BuryMeInVegas 01.04.21 12:06 Сейчас в теме +0.19 $m
(53) ДанныеЗаполнения - тип данных "ДокументСсылка.ТелефонныйЗвонок"? Если да, тогда мы можем получить отсюда поле "ВзаимодействиеОснование". Далее определяем его тип, и если "ВзаимодействиеОснование" является ссылкой на справочник "Запросы", тогда можем заполнить поле "Источник" напрямую из ссылки на элемент справочника "Запросы".

UPD. В режиме отладки остановитесь перед нашим условием и вычислите выражение из "ДанныеЗаполнения". Посмотрите, какие поля доступны.
55. user1500067 01.04.21 12:11 Сейчас в теме
(54) ДанныеЗаполнения - тип данных "ДокументСсылка.ТелефонныйЗвонок"? Да именно так
56. user1500067 01.04.21 12:12 Сейчас в теме
(54) ВзаимодействиеОснование является СправочникСсылка.Запросы
57. BuryMeInVegas 01.04.21 12:14 Сейчас в теме
(56)
ВзаимодействиеОснование является СправочникСсылка.Запросы


Это не имеет особого значения. Вы можете сделать вот так: ДанныеЗаполнения.ВзаимодействиеОснование? Поле доступно? Проверьте в режиме отладки.
58. user1500067 01.04.21 12:23 Сейчас в теме
(57)Всё заработало.
Вот так
 ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
         
         Источник = ДанныеЗаполнения.ВзаимодействиеОснование.Источник;

Спасибо Вам большое!
59. BuryMeInVegas 01.04.21 12:24 Сейчас в теме
36. user1500067 01.04.21 11:07 Сейчас в теме
(32)Как я уже описал ниже, так не получится
12. BuryMeInVegas 01.04.21 09:48 Сейчас в теме
(7) Вообще, рекурсивная функция, это функция, которая вызывает сама себя до момента, пока не будет прерван цикл (то бишь рекурсия). Логика такова, что мы запросом ищем родителя, и передаём найденного родителя в эту же функцию, где для уже найденного родителя будет искаться родитель. Поиск будет осуществляться до тех пор, пока мы не дойдём до первого документа в цепочке (в поле "ДокументОснование" у такого документа будет NULL, Неопределено или ПустаяСсылка()).
5. user1500067 01.04.21 09:35 Сейчас в теме
(2)А как это реализовать?
8. DenisCh 01.04.21 09:39 Сейчас в теме
(5)
выбрать док2.ДокументОснование.Источник
ИЗ Документ.Документ2 КАК док2
ГДЕ док2.Ссылка = &текДокОснование

(это если док2.ДокументОснование - реквизит несоставной. если составной, то лучше явно левосоединять)
20. glek 120 01.04.21 10:28 Сейчас в теме
А про регистр сведений никто не думал?
21. BuryMeInVegas 01.04.21 10:29 Сейчас в теме
(20) А в нём есть связь "Первый" - "Последний" по цепочке документов? Или только "Первый" - "Второй", "Второй" - "Третий" и так далее?
22. glek 120 01.04.21 10:33 Сейчас в теме
(21) Как построите. Я бы делал РС вида ДокументN - Документ1.
Тогда по одной цепочке будет
Документ1 - Документ1
При записи документN, у нас по основанию документ(n-1), который мы ищем в измерении регистра, находим, и делаем запись, как указал выше.
24. BuryMeInVegas 01.04.21 10:35 Сейчас в теме
(22) Ну строю не я.) Я не в курсе, какова структура хранения связей документов у ТС. Предлагаю то решение, которое будет работать 100%, вне зависимости от наличия регистра. Решение не супер оптимальное, в плане производительности, но точно эффективное.)
Оставьте свое сообщение

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