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й пользоваться мне не довелось.
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день