|   |   | 
| 
 | 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) глупость | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |