1C 7.7 c 1C++ запрос по полю с неконкретным типом

1. nindustries 17.08.17 15:20 Сейчас в теме
Здравствуйте, пользователи infostart!

Являюсь 1С-программистом, в любой удобной ситуации пользующимся такой великолепной библиотекой, как 1С++, особенно в области прямых SQL-запросов. Всё работает шустро, НО! До сих пор не могу придумать/найти ответ для следующей ситуации:

Есть некоторый документ, назовем его "Выпуск продукции". В табличной части этого документа есть реквизит с типом значения "Документ". В этом реквизите могут быть документы "Полуфабрикат1" или "Полуфабрикат2". В каждом из них есть реквизит "НомерИзвещения".

Задача следующая:
Получить некоторую таблицу вида

|ДокументВыпускПродукции|ДокументПолуфабрикат|НомерИзвещения|
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dvk09 2 18.08.17 03:05 Сейчас в теме
А что не получается?
+
3. dvk09 2 18.08.17 03:18 Сейчас в теме
Реквизит с типом "Документ"
Длинна поля 13, если не ошибаюсь.
первые 4 символа - вид документа
последние 9 - ID документа


Скорее всего при выводе реквизита будет так
$ДокументПолуфабрикат.ДокументВыпускПродукции [ДокументВыпускПродукции $Документ]


Если не сработает, то используй левые джойны по $ВидДокумента36.Полуфабрикат1 (или Полуфабрикат2) + Полуфабрикат1 (или Полуфабрикат2).ID = $ДокументПолуфабрикат.ДокументВыпускПродукции
Далее ISNULL или CASE...
+
4. dvk09 2 18.08.17 03:24 Сейчас в теме
Если нужен НомерИзвещения тогда точно второй вариант.

Или если таблица преполагается "печатная форма" то можно обратиться к реквизиту НомерИзвещения документа Полуфабрикат.
Если ТЗ, то лучше точно через джойны. (Быстрее)

P.S.: Я тапм вверху мог немного запутать, но проще было бы видеть конфу перед глазами.
Если что-то не понятно, можешь в личку написать.
+
9. dvk09 2 21.08.17 03:50 Сейчас в теме
Цитата с параллельного форума:

Идентификатор вида справочника
${ВидСправочника36|ReferenceKind36}.<Справочник>
char(4): = 'ZZZZ'
Идентификатор вида документа
${ВидДокумента|DocumentKind}.<Документ>
Зависит от формата ИБ:
SQL - литерал типа int: = XXXX
DBF: литерал типа char(4): = 'ZZZZ'

${ВидДокумента36|DocumentKind36}.<Документ>
char(4): = 'ZZZZ'
Идентификатор вида перечисления
${ВидПеречисления36|EnumKind36}.<ВидПеречисления>
char(4): = 'ZZZZ'
+
5. nindustries 18.08.17 20:04 Сейчас в теме
Конфу, к сожалению, скинуть не представляется возможным
Делал так

SEL ECT
ДокВыпСтр.IDDOC AS [Док $Документ.ВыпускПродукции]
// *****
$ДокВыпСтр.Полуфабрикат AS [ПФ $Документ] // Если так написать, эт понятно, что в результирующей таблице будут документы любого вида, эт всё ок.
*****//
FR OM
$Документ.ВыпускПродукцииСтроки AS ДокВыпСтр
LEFT JOIN
_1SJOURN AS Жур ON Жур.IDDOC = ДокВыпСтр.IDDOC
// *****
т.е., тут добавить LEFT JOIN по 9 символам? но, ведь джоинить надо или с $Документ.Полуфабрикат1 или с $Документ.Полуфабрикат2. На условие CASE, написанное после LEFT JOIN, SQL ругается
***** //
WHERE
Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
AND Жур.CLOSED & 1 = 1
+
6. nindustries 18.08.17 20:16 Сейчас в теме
$ВидДокумента36 - это описка или что-то, о чём я еще нигде не видел упоминаний? (1с++ версии 2.5)
+
7. nindustries 18.08.17 20:50 Сейчас в теме
В целом, спасибо, конечно, если сделать LEFT JOIN по 9 правым символам поля с типом "Документ", то прокатывает. Но это, на мой взгляд, колхоз! Думал, есть более изящное решение
+
8. dvk09 2 21.08.17 03:46 Сейчас в теме
Нет, нельзя только по последним 9ти символам, в 7.7 ID документов (как и справочников) разных видов могут совпадать.
При Джойне может получиться так, что есть два документа с одним ID, тогда потом, при использовании ISNULL (ну или CASE ...), будет выводиться некорректная информация...
Я однажды наступил на эти грабли)) Зато в 8ке ID любого объекта уникален в пределах базы. (Большой плюс))...)
Ну и юзать надо 3ю версию.
У меня 3.2.2.0

есть ещё 3.2.4.1, не тестил, хотя наверно надо.
В 3ей formex отдельно идёт.

Хотя 2й пользоваться мне не довелось.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот