Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Условие по виду документа (число прочтений - 5846 )
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Условие по виду документа
17. Октября 2011 :: 09:05
Печать  
Старшие товарищи помогите решить проблему!
Есть ли способ в прямом запросе сделать условие по виду документа.
Нужно формировать отчет по видам документа, причем документы выбирает пользователь (из предопределенного списка), заранее не известно что будет выбрано. При чем в запросе необходим фильтр по Свойствам контрагентов (подчиненный справочник контрагентов), свойства заранее тоже неизвестны.

Код
Выбрать все
SELECT IDDoc Док, IDdocdef Док_вид From _1Sjournl WHERE Док_вид = ????? (что здесь)
 

  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Условие по виду документа
Ответ #1 - 17. Октября 2011 :: 09:26
Печать  
1) не _1Sjournl а _1Sjourn
2) $ВидДокумента.<ИдентификаторВида>
  
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Условие по виду документа
Ответ #2 - 17. Октября 2011 :: 09:38
Печать  
leshik писал(а) 17. Октября 2011 :: 09:26:
1) не _1Sjournl а _1Sjourn
2) $ВидДокумента.<ИдентификаторВида>

А если у меня список видов например 3 или 5 тогда как??

Код
Выбрать все
select Жур.iddoc [Док $Документ],Журiddocdef Док_вид, Свойство.ID from _1Sjourn жур left join <тут по документу> left join <тут по свойству>
where Док_вид = <что тут ??>
 


как по нескольким видам отобрать загадка для меня
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Условие по виду документа
Ответ #3 - 17. Октября 2011 :: 09:56
Печать  
Код
Выбрать все
Where _1sjourn.iDDOCDEF in ($ВидДокумента.Идентификатор1, $ВидДокумента.Идентификатор2) 


Но у тебя вся строчка запроса криво написана.
Ты напиши задачу и названия справочников как заданы в конфигураторе и документов а я помогу запрос написать.
  
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Условие по виду документа
Ответ #4 - 17. Октября 2011 :: 10:10
Печать  
leshik писал(а) 17. Октября 2011 :: 09:56:
Код
Выбрать все
Where _1sjourn.iDDOCDEF in ($ВидДокумента.Идентификатор1, $ВидДокумента.Идентификатор2) 


Но у тебя вся строчка запроса криво написана.
Ты напиши задачу и названия справочников как заданы в конфигураторе и документов а я помогу запрос написать.


Есть три предопределенных вида документа
1. Реализация
2. РеализацияРозница
3. ПеремещениеТМЦ
Справочник СвойстваКонтрагентов. Подчинен справочнику Контрагенты. В нем два реквизита:
1. ВидСвойства (Справочник.ВидыСвойств)
2. ЗначениеСвойства (Справочник.ЗначенияСвойств (Подчинен справочнику ВидыСвойств))
ЗАДАЧА:
Пользователь в интерфейсе выбирает виды документов (один или несколько), период дат документов и выбирает значения свойства (одно или несколько). Нажимает кнопку "Сформировать" и на выходе получает таблицу с группированную по ЗначениямСвойств,Контрагенту,документу.
интерфейс готов. Вот только загвоздка в запросе.
Да и еще нужна возможность фильтра по конкретным документам из каждого вида и по конкретным контрагентам
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Условие по виду документа
Ответ #5 - 17. Октября 2011 :: 12:20
Печать  
mozer писал(а) 17. Октября 2011 :: 10:10:
leshik писал(а) 17. Октября 2011 :: 09:56:
Код
Выбрать все
Where _1sjourn.iDDOCDEF in ($ВидДокумента.Идентификатор1, $ВидДокумента.Идентификатор2) 


Но у тебя вся строчка запроса криво написана.
Ты напиши задачу и названия справочников как заданы в конфигураторе и документов а я помогу запрос написать.


Есть три предопределенных вида документа
1. Реализация
2. РеализацияРозница
3. ПеремещениеТМЦ
Справочник СвойстваКонтрагентов. Подчинен справочнику Контрагенты. В нем два реквизита:
1. ВидСвойства (Справочник.ВидыСвойств)
2. ЗначениеСвойства (Справочник.ЗначенияСвойств (Подчинен справочнику ВидыСвойств))
ЗАДАЧА:
Пользователь в интерфейсе выбирает виды документов (один или несколько), период дат документов и выбирает значения свойства (одно или несколько). Нажимает кнопку "Сформировать" и на выходе получает таблицу с группированную по ЗначениямСвойств,Контрагенту,документу.
интерфейс готов. Вот только загвоздка в запросе.
Да и еще нужна возможность фильтра по конкретным документам из каждого вида и по конкретным контрагентам

непонятно если в исходной форме указано несколько свойств клиента то клиент документа должен содержать все эти свойства или хотя бы одно из этих свойств
или надо на каждое свойство список документов упорядоченных по дате
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Условие по виду документа
Ответ #6 - 17. Октября 2011 :: 14:09
Печать  
Если предположить что для 1 контрагента есть только один подчиненный элемент то в запросе будут учавствовать 2 таблицы (и журнал документов)
1) СвойстваКонтрагентов
2) _1scrdoc  - связка по СвойстваКонтрагентов.ParentExt > _1scrdoc.ParentVal
Документы будут лежать в _1scrdoc.Child_Date_Time_Iddoc.
Ну а если конкретно сам запрос нужен - завтра можно попробовать нарисовать.
  
Наверх
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Условие по виду документа
Ответ #7 - 18. Октября 2011 :: 04:18
Печать  
leshik писал(а) 17. Октября 2011 :: 14:09:
Если предположить что для 1 контрагента есть только один подчиненный элемент то в запросе будут учавствовать 2 таблицы (и журнал документов)
1) СвойстваКонтрагентов
2) _1scrdoc  - связка по СвойстваКонтрагентов.ParentExt > _1scrdoc.ParentVal
Документы будут лежать в _1scrdoc.Child_Date_Time_Iddoc.
Ну а если конкретно сам запрос нужен - завтра можно попробовать нарисовать.


Ты видимо не совсем понял ...
Вот какая у меня идея родилась
Код
Выбрать все
select
	Журнал.iddoc [Докум $Документ],
	Журнал.iddocdef Докум_вид,
	Журнал.date_time_iddoc,
	$Журнал.Фирма Фирма,
	$Документ.Контрагент Контрагент,
	$Документ.Автор Автор,
	$Свойство.ЗначениеСвойства
from
	_1sjourn Журнал
left join
	$Документ.<ВидДокумента> Документ on Документ.iddoc = Журнал.iddoc
left join
	$Справочник.СвойстваКонтрагентов Свойство on $Документ.Контрагент = Свойство.Perentext AND $Свойство.ВидСвойства = :ВыбВид
where
	Журнал.date_time_iddoc between :НачДата and :КонДата and
	$Журнал.Фирма = :ВыбФирма and
	$Свойство.ЗначениеСвойства in (select val from #ТаблицаЗначенийСвойств) and
	  Документ.iddoc in (select val from #ТаблицаДокументов) and
	  $Документ.Контрагент in (select val from #ТаблицаКонтрагентов)
 


Это лишь шаблон запроса. дальше в зависимости от количества документов объединение сделать т.е UNION ALL.
Вот если бы как то обойтись без этого. И еще, я так понимаю не возможно реализовать универсального текста запроса? Если условия по списку контрагентов не тогда и текст запроса придется форматировать ?
  
Наверх
 
IP записан
 
mozer
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 324
Местоположение: Пермь
Зарегистрирован: 14. Января 2011
Пол: Мужской
Re: Условие по виду документа
Ответ #8 - 18. Октября 2011 :: 04:21
Печать  
Z1 писал(а) 17. Октября 2011 :: 12:20:
mozer писал(а) 17. Октября 2011 :: 10:10:
leshik писал(а) 17. Октября 2011 :: 09:56:
Код
Выбрать все
Where _1sjourn.iDDOCDEF in ($ВидДокумента.Идентификатор1, $ВидДокумента.Идентификатор2) 


Но у тебя вся строчка запроса криво написана.
Ты напиши задачу и названия справочников как заданы в конфигураторе и документов а я помогу запрос написать.


Есть три предопределенных вида документа
1. Реализация
2. РеализацияРозница
3. ПеремещениеТМЦ
Справочник СвойстваКонтрагентов. Подчинен справочнику Контрагенты. В нем два реквизита:
1. ВидСвойства (Справочник.ВидыСвойств)
2. ЗначениеСвойства (Справочник.ЗначенияСвойств (Подчинен справочнику ВидыСвойств))
ЗАДАЧА:
Пользователь в интерфейсе выбирает виды документов (один или несколько), период дат документов и выбирает значения свойства (одно или несколько). Нажимает кнопку "Сформировать" и на выходе получает таблицу с группированную по ЗначениямСвойств,Контрагенту,документу.
интерфейс готов. Вот только загвоздка в запросе.
Да и еще нужна возможность фильтра по конкретным документам из каждого вида и по конкретным контрагентам

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

К каждому из контрагентов будет прикреплено свойство "Маршрут доставки" с значениями этих маршрутов. У контрагента может быть ТОЛЬКО 1 МАРШРУТ доставки.  Нужно вывести иерархический список сгруппированный так:
1. Маршрут доставки
2. Контрагент
3. документ

пользователь выбирает маршруты доставки и выводит их на печать.
Ну и ответственно есть всем известный множественный фильтр
В разрезе документов, фирм, контрагентов, Значения свойств (маршрутов). где может быть либо выборка по вошедшим в список либо по всем не вошедшим в список. Список фильтра может и не содержать элементов
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Условие по виду документа
Ответ #9 - 19. Октября 2011 :: 05:39
Печать  
(7) как то так
Код
Выбрать все
ТекстЗапроса = "
select main_tabl.iddoc  [Докум $Документ],
|	 main_tabl.iddocdef Докум_вид,
|	 main_tabl.date_time_iddoc,
|	 main_tabl.Контрагент [Клиент $Справочник.КонтрАгенты]
|	 main_tabl.Автор
|
from (
|select
|	Журнал.iddoc ,
|	Журнал.iddocdef,
|	Журнал.date_time_iddoc,
|	$Документ.Контрагент,
|	$Документ.Автор
|from
|	_1sjourn Журнал
|inner join
|	$Документ.Реализация Документ on Документ.iddoc = Журнал.iddoc
|where
|	Журнал.date_time_iddoc between :НачДата and :КонДата and
|	 Журнал.iddocdef = $ВидДокумента.Реализация and
|	$Журнал.Фирма = :ВыбФирма and
|	Журнал.CLOSED = 1
|union all
|select
|	Журнал.iddoc,
|	Журнал.iddocdef,
|	Журнал.date_time_iddoc,
|	$Документ.Контрагент,
|	$Документ.Автор
|from
|	_1sjourn Журнал
|inner join
|	$Документ.РеализацияРозница Документ on Документ.iddoc = Журнал.iddoc
|where
|	Журнал.date_time_iddoc between :НачДата and :КонДата and
|	 Журнал.iddocdef = $ВидДокумента.РеализацияРозница and
|	$Журнал.Фирма = :ВыбФирма and
|	Журнал.CLOSED = 1
|union all
|select
|	Журнал.iddoc,
|	Журнал.iddocdef,
|	Журнал.date_time_iddoc,
|	$Документ.Контрагент,
|	$Документ.Автор
|from
|	_1sjourn Журнал
|inner join
|	$Документ. ПеремещениеТМЦ Документ on Документ.iddoc = Журнал.iddoc
|where
|	Журнал.date_time_iddoc between :НачДата and :КонДата and
|	 Журнал.iddocdef = $ВидДокумента.ПеремещениеТМЦ and
|	$Журнал.Фирма = :ВыбФирма and
|	Журнал.CLOSED = 1
|) as main_tabl
|inner join $Справочник.Контрагенты as Клиент on Клиент.id = main_tabl.Контрагент
|inner join $Справочник.СвойстваКонтрагентов as Свойство on Свойство.ParentExt  = Клиент.id
|where $Свойство.ВидСвойства = :ВыбВид
|";
Если Есть_ограничения_на_клиента Тогда
ТекстЗапроса  = ТекстЗапроса  + "
|main_tabl.Контрагент in (select val from #ТаблицаКонтрагентов)
|";
КонецЕсли;
Если Есть_ограничения_на_документы Тогда
ТекстЗапроса  = ТекстЗапроса  + "
|main_tabl.iddoc in (select val from #ТаблицаДокументов)
|";
КонецЕсли;

// Здесь ставишь свою сортировку по результату

 



ps Ограничение по документу временную таблицу можно разбить на три ( может от 0 до 3 ) и вставить во внутренний select
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Условие по виду документа
Ответ #10 - 19. Октября 2011 :: 06:11
Печать  
в каждую ветку where этого запроса нужно вставить условие на вид документа для попадания в индекс:

Код
Выбрать все
|where
|	Журнал.date_time_iddoc between :НачДата and :КонДата~ and
|	 Журнал.iddocdef = $ВидДокумента36.РеализацияНужная 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Условие по виду документа
Ответ #11 - 19. Октября 2011 :: 06:19
Печать  
Eprst писал(а) 19. Октября 2011 :: 06:11:
в каждую ветку where этого запроса нужно вставить условие на вид документа для попадания в индекс:

Код
Выбрать все
|where
|	Журнал.date_time_iddoc between :НачДата and :КонДата~ and
|	 Журнал.iddocdef = $ВидДокумента36.РеализацияНужная 


+1
я это подразумевал но не написал. ( ну и я обычно именно в этом случае ставлю конкретные числовые значения iddocdef привыяка с древних релизов 1с++)

ps текст в (9) поправил
только не $ВидДокумента36. а $ВидДокумента
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Условие по виду документа
Ответ #12 - 19. Октября 2011 :: 08:24
Печать  
не-не-не.. именно 36
Улыбка

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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Условие по виду документа
Ответ #13 - 19. Октября 2011 :: 09:01
Печать  
Eprst писал(а) 19. Октября 2011 :: 08:24:
не-не-не.. именно 36
Улыбка

Что отмечал?  Подмигивание
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Условие по виду документа
Ответ #14 - 19. Октября 2011 :: 09:19
Печать  
Eprst писал(а) 19. Октября 2011 :: 08:24:
не-не-не.. именно 36
Улыбка


Что то ты путаешь
Только что проверил
такой запрос работает
Код
Выбрать все
	ТекстЗапроса = "
|select top 10
|	Журнал.iddoc  [Док $Документ],
|	Журнал.iddocdef as Док_вид,
|	Журнал.date_time_iddoc,
|   $ВидДокумента.Счет,
|   $ВидДокумента36.Счет
|from
|	_1sjourn Журнал
|inner join
|	$Документ.Счет Док1 on Док1.iddoc = Журнал.iddoc
|where
|	 Журнал.iddocdef = $ВидДокумента.Счет and
|	Журнал.CLOSED = 1
|";
 



а запрос
Код
Выбрать все
	ТекстЗапроса = "
|select top 10
|	Журнал.iddoc  [Док $Документ],
|	Журнал.iddocdef as Док_вид,
|	Журнал.date_time_iddoc,
|   $ВидДокумента.Счет,
|   $ВидДокумента36.Счет
|from
|	_1sjourn Журнал
|inner join
|	$Документ.Счет Док1 on Док1.iddoc = Журнал.iddoc
|where
|	 Журнал.iddocdef = $ВидДокумента36.Счет and
|	Журнал.CLOSED = 1
|";
 


справедливо выдает
State 22018, native 245, message [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '  5G' to a column of data type int.



т.е  $ВидДокумента.Счет это число
а $ВидДокумента36.Счет это тоже число переведенное
36ричное число преобразованое к char(4)

для для моей конфигурации
$ВидДокумента.Счет это 196 ( int)
а
$ВидДокумента36.Счет это  '  5G'  ( char(4) )
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать