Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как получить"Договор" из документа в измерении регистра типа "Документ" (число прочтений - 1761 )
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Как получить"Договор" из документа в измерении регистра типа "Документ"
21. Октября 2009 :: 12:02
Печать  
Конфа: ТиС для Украины 7.70.007, переписанная, но "ПартииТоваров" не трогал
Регистр "ПартииТоваров", измерение "ПрихДокумент", тип "неопределенный документ".

Задача: получить "Договор" из документа записанного в измерении "ПрихДокумент", накладывать фильтр на "Договора"

есть работающий запрос
Код
Выбрать все
|SELECT
|	CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime) as Дата,
|	$Рег.Товар as [Товары $Справочник.Номенклатура],
|	Подзапрос.Склад as [Склады $Справочник.МестаХранения],
|	Подзапрос.Сотрудник as [Сотрудники $Справочник.Сотрудники],
|	Подзапрос.Контрагент as [Контрагенты $Справочник.Контрагенты],
|	Жур.$ОбщийРеквизит.Автор as [Авторы $Справочник.Пользователи],
|	$Рег.ОстатокТовара as Кво,
|	$Рег.Оборот as Оборот,
|	$Рег.Прибыль as Наценка,
|	($Рег.Оборот - $Рег.Прибыль) as Себестоимость
|
|	FROM (
|		SELECT ДокРасходнаяРозничнаяТТ.IDDoc,
|			$ДокРасходнаяРозничнаяТТ.Склад as Склад,
|			$ДокРасходнаяРозничнаяТТ.Продавец as Сотрудник,
|			$ДокРасходнаяРозничнаяТТ.Контрагент as Контрагент
|		FROM $Документ.РасходнаяРозничная_ТТ AS ДокРасходнаяРозничнаяТТ
|		UNION ALL
|		SELECT ДокЧекКАТТ.IDDoc,
|			$ДокЧекКАТТ.Склад as Склад,
|			$ДокЧекКАТТ.Продавец as Сотрудник,
|			$ДокЧекКАТТ.Контрагент as Контрагент
|		FROM $Документ.ЧекКА_ТТ AS ДокЧекКАТТ
|		UNION ALL
		//тоже для других видов документов
|	) as Подзапрос
|
|	INNER JOIN $Регистр.ПартииТоваров AS Рег ON Подзапрос.IDDOC = Рег.IDDOC
|
|	INNER JOIN _1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
|
|	INNER JOIN $Справочник.Номенклатура as СпрНоменклатураДляФильтров ON
|		СпрНоменклатураДляФильтров.ID = $Рег.Товар
 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа "Документ"
Ответ #1 - 21. Октября 2009 :: 12:42
Печать  
     INNER JOIN _1SCRDOC AS Отбор With (NOLOCK) ON Right($Рег.ПрихДокумент, 9) = Отбор.CHILDID
WHERE (Отбор.PARENTVAL = :ВыбДоговор *)
     AND (Отбор.MDID = 0)
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа
Ответ #2 - 21. Октября 2009 :: 13:25
Печать  
может я чего-то не понимаю, но в "ПрихДокумент" может быть любой документ, а не Договор. и мне нужно из документа получить Договор

сейчас написал вот так
Код
Выбрать все
|	INNER JOIN (
|		SELECT ДокПриходнаяНакладная.IDDoc,
|			$ДокПриходнаяНакладная.Договор as Договор
|		FROM $Документ.ПриходнаяНакладная AS ДокПриходнаяНакладная
|		UNION ALL
|		SELECT ДокПриходнаяРеализатора.IDDoc,
|			$ДокПриходнаяРеализатора.Договор as Договор
|		FROM $Документ.ПриходнаяРеализатора AS ДокПриходнаяРеализатора
|		UNION ALL
|		SELECT ДокОприходованиеИзлишков.IDDoc,
|			$ПустойИД13 as Договор
|		FROM $Документ.ОприходованиеИзлишков AS ДокОприходованиеИзлишков
|	) AS ПодзапросДоговора ON ПодзапросДоговора.IDDOC = RIGHT($Рег.ПрихДокумент, 9)
 



вроде работает, осталось решить последнюю проблему $ДокПриходнаяНакладная.Договор опять неопределенный документ. я так понимаю, что нужен еще один INNER JOIN в
Код
Выбрать все
|		SELECT ДокПриходнаяНакладная.IDDoc,
|			$ДокПриходнаяНакладная.Договор as Договор
|		FROM $Документ.ПриходнаяНакладная AS ДокПриходнаяНакладная
 

  
Наверх
 
IP записан
 
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа
Ответ #3 - 21. Октября 2009 :: 14:30
Печать  
Вот что у меня получилось
Код
Выбрать все
|SELECT
|	CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime) as Дата,
|	$Рег.Товар as [Товары $Справочник.Номенклатура],
|	Подзапрос.Склад as [Склады $Справочник.МестаХранения],
|	Подзапрос.Сотрудник as [Сотрудники $Справочник.Сотрудники],
|	Подзапрос.Контрагент as [Контрагенты $Справочник.Контрагенты],
|	Жур.$ОбщийРеквизит.Автор as [Авторы $Справочник.Пользователи],
|	ПодзапросДоговора.Договор as [Договора $Документ.Договор],
|	$Рег.ОстатокТовара as Кво,
|	$Рег.Оборот as Оборот,
|	$Рег.Прибыль as Наценка,
|	($Рег.Оборот - $Рег.Прибыль) as Себестоимость
|
|	FROM (
|		SELECT ДокРасходнаяРозничнаяТТ.IDDoc,
|			$ДокРасходнаяРозничнаяТТ.Склад as Склад,
|			$ДокРасходнаяРозничнаяТТ.Продавец as Сотрудник,
|			$ДокРасходнаяРозничнаяТТ.Контрагент as Контрагент
|		FROM $Документ.РасходнаяРозничная_ТТ AS ДокРасходнаяРозничнаяТТ
|		UNION ALL
|		SELECT ДокЧекКАТТ.IDDoc,
|			$ДокЧекКАТТ.Склад as Склад,
|			$ДокЧекКАТТ.Продавец as Сотрудник,
|			$ДокЧекКАТТ.Контрагент as Контрагент
|		FROM $Документ.ЧекКА_ТТ AS ДокЧекКАТТ
|		UNION ALL
		//тоже для других видов документов
|	) as Подзапрос
|
|	INNER JOIN $Регистр.ПартииТоваров AS Рег ON Подзапрос.IDDOC = Рег.IDDOC
|
|	INNER JOIN (
|		SELECT ДокПриходнаяНакладная.IDDoc,
|			ДокДоговор.IDDOC as Договор
|		FROM $Документ.ПриходнаяНакладная AS ДокПриходнаяНакладная
|		LEFT JOIN $Документ.Договор AS ДокДоговор ON ДокДоговор.IDDOC = RIGHT($ДокПриходнаяНакладная.Договор, 9)
|		UNION ALL
|		SELECT ДокПриходнаяРеализатора.IDDoc,
|			$ДокПриходнаяРеализатора.Договор as Договор
|		FROM $Документ.ПриходнаяРеализатора AS ДокПриходнаяРеализатора
|		UNION ALL
|		SELECT ДокОприходованиеИзлишков.IDDoc,
|			$ПустойИД13 as Договор
|		FROM $Документ.ОприходованиеИзлишков AS ДокОприходованиеИзлишков
|	) AS ПодзапросДоговора ON ПодзапросДоговора.IDDOC = RIGHT($Рег.ПрихДокумент, 9)

|	INNER JOIN _1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
|
|	INNER JOIN $Справочник.Номенклатура as СпрНоменклатураДляФильтров ON
|		СпрНоменклатураДляФильтров.ID = $Рег.Товар

 



может конечно не оптимально (на сколько хватает образования), но результат правильный
критика приветствуется
« Последняя редакция: 19. Ноября 2009 :: 14:11 - mc »  
Наверх
 
IP записан
 
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа
Ответ #4 - 21. Октября 2009 :: 15:19
Печать  
Остался последний вопрос
есть СписокЗначений с договорами. Как вписать фильтр по Договорам?

вот что отработало
Код
Выбрать все
RS = СоздатьОбъект("ODBCRecordSet");
RS.УстБД1С();
RS.РежимRPC(1);
Если мсзДоговора.РазмерСписка() <> 0 Тогда
	RS.УложитьСписокОбъектов(мсзДоговора, "#сзДоговора");
	Если млОтобратьДоговора = 1 Тогда
		мсТекстЗапроса = мсТекстЗапроса + " AND (ПодзапросДоговора.Договор IN (SELECT val FROM #сзДоговора))";
	ИначеЕсли млОтобратьДоговора = 2 Тогда
		мсТекстЗапроса = мсТекстЗапроса + " AND Not(ПодзапросДоговора.Договор IN (SELECT val FROM #сзДоговора))";
	КонецЕсли;
КонецЕсли;
 



все заработало!
всем спасибо за внимание!
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа "Документ"
Ответ #5 - 21. Октября 2009 :: 16:17
Печать  
Отдельно распиши случай когда
Если мсзДоговора.РазмерСписка() = 1
тогда вместо IN  будет    =
  
Наверх
 
IP записан
 
mc
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 59
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа "Документ"
Ответ #6 - 26. Октября 2009 :: 16:47
Печать  
to Z1
Цитата:
Отдельно распиши случай когда
Если мсзДоговора.РазмерСписка() = 1
тогда вместо IN  будет    =


а это даст прирост производительности? какой?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как получить"Договор" из документа в измерении регистра типа
Ответ #7 - 27. Октября 2009 :: 05:24
Печать  
mc писал(а) 26. Октября 2009 :: 16:47:
to Z1
Цитата:
Отдельно распиши случай когда
Если мсзДоговора.РазмерСписка() = 1
тогда вместо IN  будет    =


а это даст прирост производительности? какой?

Это поможет оптимизатору запросов составить более оптимальный
план выполнения запроса а значит Ваш запрос выполнится быстрее.
Может конечно sql сервер и сам заменит вхождение (in) на равенство для одного элемента множества вместо  in,  но в любом случае у sql сервера на это уйдет какое-то время так что лучше помогать серверу.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать