|
v7: Нужен совет по прямым запросам 7.7 | ☑ | ||
---|---|---|---|---|
0
Бертыш
04.05.24
✎
17:28
|
Коллеги, я перевожу у заказчика обычный запрос на прямой с 1С++. По прямым запросам я помнил уйдя с 7.7 только что они есть и что коллеги разработали консоль запросов, но на 1С 8 я то уже натаскался с запросами и в гугле не забанен и документация кой какая в сети находится. Я собирал запрос в консоли проверяя корректность того что собрал, но в итоге на очередном этапе встрял в тупик. Документация и поиск мне не помогли. В чём проблема. Я делаю выборку по нескольким разным видам документов объединением. Типа
SELECT $ВидДокумента36.я_ПочтовоеОтправление + я_ПочтовоеОтправление.IDDOC [я_ПочтовоеОтправлениеСсылка $Документ] UNION ALL SELECT $ВидДокумента36.я_КоммерческоеПредложение + я_КоммерческоеПредложение.IDDOC [я_КоммерческоеПредложениеСсылка $Документ] Но дальше у заказчика в коде его запроса который я перевожу на прямой стоит условие на вхождение Документа в некий список. Я добавил в условия AND $ВидДокумента36.я_КоммерческоеПредложение + я_КоммерческоеПредложение.IDDOC in (Select val from #СЗКонтакты) В документации указано что передачу списка надо запаковывать через УложитьСписокОбъектов(,,) Но там третьим параметром пишут что надо указывать тип на примере справочника. А как быть мне? У меня же не справочник а документы и и при чём документы разных видов. Может кто подскажет из более опытных в прямых запросах коллег? |
|||
1
vladmenleo
04.05.24
✎
17:41
|
Скорее всего тебе надо что-то подобное
SELECT Журнал.IDDOC [Докум $Документ], Журнал.IDDOCDEF Докум_вид FROM _1sjourn Журнал WITH (NOLOCK) WHERE Журнал.IDDOCDEF = $ВидДокумента.я_ПочтовоеОтправление or Журнал.IDDOCDEF = $ВидДокумента36.я_КоммерческоеПредложение |
|||
2
vladmenleo
04.05.24
✎
17:41
|
(1) Это для SQL
|
|||
3
vladmenleo
04.05.24
✎
17:42
|
(1) Пардон
or Журнал.IDDOCDEF = $ВидДокумента.я_КоммерческоеПредложение |
|||
4
Бертыш
04.05.24
✎
17:58
|
Так мне же не вид. Там ( В непрямом запросе а в 1С стоит проверка на вхождение документа в список). Я уловил Вашу идею о том чтобы отказаться от UNION, но там у меня сейчас в объединении пять разных видов документов с запросами вида
SELECT $ВидДокумента36.я_Контакт + я_КонтактСтроки.IDDOC [Элемент $Документ] , $я_КонтактСтроки.Контрагент [Контрагент $Справочник.я_Контрагенты] , NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Дата , Журнал.DOCNO Номер , Журнал.DOCNO Способ , $я_Контакт.Способ [СпрСпособ $Справочник.я_СпособыКонтактов] , $я_Контакт.Входящий [Входящий $Перечисление.я_ВхИсх] , $я_Контакт.ТипКонтакта [ТипКонтакта $Справочник.я_ТипыКонтактов] , $я_Контакт.Тип Тип , $я_Контакт.Тема Тема , $я_Контакт.Приоритет [Приоритет $Перечисление.я_Приоритет] , $я_Контакт.СостояниеДокумента [СостояниеДокумента $Перечисление.я_Состояние] FROM $ДокументСтроки.я_Контакт AS я_КонтактСтроки With (NOLOCK) LEFT OUTER JOIN _1SJOURN AS Журнал With (NOLOCK) ON я_КонтактСтроки.IDDOC = Журнал.IDDOC LEFT OUTER JOIN $Документ.я_Контакт AS я_Контакт With (NOLOCK) ON я_КонтактСтроки.IDDOC = я_Контакт.IDDOC WHERE (Журнал.ISMARK = 0) AND ($я_КонтактСтроки.Контрагент = :я_Контрагент) AND $ВидДокумента36.я_Контакт + я_КонтактСтроки.IDDOC in (Select val from #СЗКонтакты) И мне надо не все документы каждого вида а те из них которые предварительно оказались в некоем списке |
|||
5
НоваяВолна
04.05.24
✎
18:00
|
(0) Может ничего толкового не скажу, сам давно отошел от 7.7, но там же есть Общий журнал документов, содержащий всех видов. Что если взять его и выбрать оттуда только документы нужных вам видов
|
|||
6
Бертыш
04.05.24
✎
18:00
|
Отказаться то от UNION переписав запрос на через журнал я смогу думаю, но это не решает стоящую передо мной проблему как мне корректно передать этот дурацкий список разношёрстных документов в мой прямой запрос. За идею об отказе от UNION и пути через журнал большое человеческое спасибо
|
|||
7
Бертыш
04.05.24
✎
18:01
|
Мне не видов же надо. Мне в рамках каждого вида нужны те из документов которые предварительно выше по коду спагетевидным кодом собраны в список
|
|||
8
vladmenleo
04.05.24
✎
18:06
|
(4) Ну и добавь условия на вхождения документа, какие проблемы-то. типа and Журнал.IDDOC in (select val from #нашы документы)
и парамент Запрос.УложитьСписокОбъектов("нашыдокументы", списокдок) |
|||
9
Бертыш
04.05.24
✎
18:20
|
То есть третий параметр не нужен
|
|||
10
vladmenleo
04.05.24
✎
18:22
|
(9) я тебе дал удочку, дальше сам
|
|||
11
Sserj
04.05.24
✎
18:41
|
(7) В общем журнале все документы. У каждого уникальный iddoc.
Поэтому можно сборку начать именно с журнала а строки присоединять к уже отобранным: select ... from _1SJOURN AS Жур With (NOLOCK) left join $Документ.я_Контакт AS я_Контакт on (iddocdef = $ВидДокумента.я_Контакт and я_Контакт.iddoc = Жур.iddoc) ... where Жур.iddoc in (...) |
|||
12
vladmenleo
04.05.24
✎
18:45
|
(11) Правильно, наджойнить туда еще нужные виды документов и будет счастье
|
|||
13
Franchiser
гуру
04.05.24
✎
20:31
|
(0) под openconf есть конструктор запросов
|
|||
14
Franchiser
гуру
04.05.24
✎
20:36
|
Я бы лучше использовал выполнитьsqlизтз(), уложитьсписокобъектов это более ограниченный вариант того же самого
|
|||
15
Холст
05.05.24
✎
17:22
|
(0) я еще пока помню 1С 7.7 с её прямыми запросами.
Если у тебя SQL база и используешь компоненту 1CPP , то можно отказаться от УложитьСписок, вместо этого в запросе сравнивая Ж.iddoc с идентификаторами отбираемых документов, Идшники можно получить через MetaDataWork: Мета = СоздатьОбъект("MetaDataWork"); Цикл твоих объектов ТекстЗапроса = ТекстЗапроса + " Ж.iddoc = "+Мета.ЗначениеВСтрокуБД(текущийДок) и одновременно условие " Ж.iddocdef = "+Мета.ИДДокумента("тут вид твоего документа без пробелов") нужно понимать, что без условия по виду документа Ж.iddocdef в выборку могут попасть документы с тем же ИД другого вида |
|||
16
Ёпрст
05.05.24
✎
21:28
|
(0) ну если хочешь гарантированно получить список без возможного пересечения iddoc, то делай where для каждого селекта в юнионе свой, и туда пихай свой док определенного вида.
Если хочешь слепить общий where и общий список, то тупо инсерти во времянку док с видом, и условие потом на iddocdef+iddoc |
|||
17
Ёпрст
05.05.24
✎
21:30
|
ЗЫ: в уложитьСписок, 3 параметр нужен для справочников, чтоб в списке поиметь всю иерархию. Для доков он не нужен, будет просто уложен в char(9), т.е тупо iddoc, без вида
|
|||
18
Ёпрст
05.05.24
✎
21:35
|
Баааалин. Склероз.
Всё проще УложитьСписокОбъектов13 пользуй и условие снаружи юниона |
|||
19
Sserj
06.05.24
✎
04:02
|
(15)(16) В 7.7 iddoc сквозной уникальный у всех документов.
Не бывает пересечений у разных видов. |
|||
20
Ёпрст
06.05.24
✎
07:52
|
(20) точна, в журнале же дата тайм иддок. Тогда все в топку, и так должно работать с улодить список
|
|||
21
АгентБезопасной Нацио
06.05.24
✎
10:11
|
(0) 1. id'ы документов уникальны, вне зависимости от вида. поэтому укладывай просто иды документов
2. третий параметр - для того, чтобы для справочника уложить во временную таблицу иерархически подчиненные элементы. Для документов это не нужно и не работает. 3. Если вдруг хочешь укладывать справочники разных видов - используй УложитьСписокОбъектов13. Для документов это пригодится, если будешь, например, искать по реквизиту "документ неопределенного вида" (13) конструктор есть и для работы в пользовательском режиме (режиме предприятия) (14) глупость |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |