Вывод реквизита поля составного типа БП3

Клиенту нужно было вывести колонку договора из колонки Партия.

Проблема была в том, что реквизит «Партия» имеет составной тип из десятка документов.

Поэтому попытка прописать путь к данным через «Объект.НоменклатураНаСкладе.Партия.ДоговорКонтрагента» не увенчалась успехом.

Пришлось делать дополнительную колонку в табличной части.

Также я предусмотрел возможность обновления данных для одной строки.

Расчет колонки выполняется запросом, поэтому работа идет быстро.


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

	Привязка = Элементы.ГруппаКолонокДляУСН;
	//Если ЭтаФорма.Элементы.Найти("дор_ЗапасыДоговор") = Неопределено Тогда
	НовыйЭлемент = ЭтаФорма.Элементы.Вставить("дор_ЗапасыДоговор", Тип("ПолеФормы"), Привязка.Родитель, Привязка);
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.Заголовок = "Договор";
	//Элемент.ПутьКДанным = "Объект.НоменклатураНаСкладе.Партия.ДоговорКонтрагента";
	НовыйЭлемент.ПутьКДанным = "Объект.НоменклатураНаСкладе.дор_ЗапасыДоговор";
	//КонецЕсли;
	дор_ЗаполнитьДопДанныеНоменклатуры();
КонецПроцедуры

&НаКлиенте
&После("НоменклатураНаСкладеПартияПриИзменении")
Процедура дбп_НоменклатураНаСкладеПартияПриИзменении(Элемент)   
	дор_ЗаполнитьДопДанныеНоменклатуры(Элементы.НоменклатураНаСкладе.ТекущаяСтрока);
КонецПроцедуры


&НаСервере
Процедура дор_ЗаполнитьДопДанныеНоменклатуры(ИдентификаторСтроки = Неопределено) Экспорт
	МассивСтрок = Неопределено;
	Если ИдентификаторСтроки <> Неопределено Тогда
		МассивСтрок = новый Массив();
		Строка = Объект.НоменклатураНаСкладе.НайтиПоИдентификатору(ИдентификаторСтроки);
		МассивСтрок.Добавить(Строка);
	КонецЕсли;
    ТЗ = Объект.НоменклатураНаСкладе.Выгрузить(МассивСтрок, "НомерСтроки, Партия");
	 
    З = Новый Запрос();
    З.Текст =
    "ВЫБРАТЬ
    |	Т.НомерСтроки КАК НомерСтроки,
    |	Т.Партия КАК Партия
    |ПОМЕСТИТЬ ТН
    |ИЗ
    |	&ТЗ КАК Т
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ТН.НомерСтроки КАК НомерСтроки,
    |	ВЫБОР
    |		КОГДА НЕ Т1.ДоговорКонтрагента ЕСТЬ NULL
    |			ТОГДА Т1.ДоговорКонтрагента
    |		КОГДА НЕ Т2.ДоговорКонтрагента ЕСТЬ NULL
    |			ТОГДА Т2.ДоговорКонтрагента
    |		КОГДА НЕ Т3.ДоговорКонтрагента ЕСТЬ NULL
    |			ТОГДА Т3.ДоговорКонтрагента
    |		КОГДА НЕ Т4.ДоговорКонтрагента ЕСТЬ NULL
    |			ТОГДА Т4.ДоговорКонтрагента
    |		КОГДА НЕ Т5.ДоговорКонтрагента ЕСТЬ NULL
    |			ТОГДА Т5.ДоговорКонтрагента
    |		КОГДА НЕ Т6.ДоговорКонтрагента ЕСТЬ NULL
    |			ТОГДА Т6.ДоговорКонтрагента
    |		ИНАЧЕ НЕОПРЕДЕЛЕНО
    |	КОНЕЦ КАК ДоговорКонтрагента
    |ИЗ
    |	ТН КАК ТН
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК Т1
    |		ПО ТН.Партия = Т1.Ссылка
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.КорректировкаПоступления КАК Т2
    |		ПО ТН.Партия = Т2.Ссылка
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Партия КАК Т3
    |		ПО ТН.Партия = Т3.Ссылка
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДокументРасчетовСКонтрагентом КАК Т4
    |		ПО ТН.Партия = Т4.Ссылка
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВозвратТоваровОтПокупателя КАК Т5
    |		ПО ТН.Партия = Т5.Ссылка
    |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Т6
    |		ПО ТН.Партия = Т6.Ссылка";
	
	//ДокументСсылка.ОтчетПроизводстваЗаСмену
	//ДокументСсылка.СписаниеОС
	//ДокументСсылка.АвансовыйОтчет
	//ДокументСсылка.КорректировкаПоступления, 
	//ДокументСсылка.ОприходованиеТоваров, 
	//ДокументСсылка.ДокументРасчетовСКонтрагентом
	//ДокументСсылка.ПринятиеКУчетуОС, 
	//ДокументСсылка.ПоступлениеТоваровУслуг, 
	//ДокументСсылка.ВозвратТоваровОтПокупателя
	//ДокументСсылка.ПередачаТоваров, 
	//ДокументСсылка.ПересортицаТоваров, 
	//ДокументСсылка.ПоступлениеВАренду, 
	//ДокументСсылка.РасходыПредпринимателя, 
	//ДокументСсылка.ПоступлениеИзПереработки, 
	//ДокументСсылка.КомплектацияНоменклатуры, 
	//ДокументСсылка.РеализацияТоваровУслуг, 
	//ДокументСсылка.ВозвратМатериаловИзЭксплуатации, 
	//ДокументСсылка.Партия

	З.УстановитьПараметр("ТЗ", ТЗ);
	
    Выборка = З.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Объект.НоменклатураНаСкладе[Выборка.НомерСтроки - 1].дор_ЗапасыДоговор = Выборка.ДоговорКонтрагента;
	КонецЦикла;                                  
	
	

КонецПроцедуры

&НаКлиенте
Процедура дбп_НоменклатураНаСкладеПриОкончанииРедактированияПосле(Элемент, НоваяСтрока, ОтменаРедактирования)
	дор_ЗаполнитьДопДанныеНоменклатуры(Элементы.НоменклатураНаСкладе.ТекущаяСтрока);
КонецПроцедуры

Среда: 3.0.198.15 Объем: 1 час.