Имя: Пароль:
1C
1C 7.7
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) глупость