Имя: Пароль:
1C
1С v8
Запросы: ОБЪЕДИНИТЬ приводит к появлению null
,
0 Evgenius
 
05.04.17
14:46
Доброго времени суток.
При выполнении запроса в экспортируемой процедуре менеджера справочника, вызванной через com-соединение (подключаемся к базе с помощью com-соединения, вызываем процедуру), запрос с ОБЪЕДИНИТЬ ВСЕ приводит к появлению null в некоторых колонках в отдельных строках.
Объединяются 2 запроса к ранее созданным временным таблицам, в которых нет НИ ОДНОГО значения null в этих же колонках: если выбрать данные из каждой по отдельности, там ничего такого не обнаруживается.

Вопрос: в каких случаях UNION ALL (ОБЪЕДИНИТЬ ВСЕ) приводит к замене значений на NULL?
Все значения во временных таблицах строковые (проверил тип данных каждого значения, выбирая данные из каждой таблицы по отдельности).

Спасибо
1 SiAl-chel
 
05.04.17
15:10
(0) Поля в объединяемых запросах идентичны по типу и количеству?
2 Evgenius
 
05.04.17
15:12
По количеству - конечно, на этот счет есть сообщение об ошибке ("Разное количество полей в объединяемых запросах").
По базовому типу - тоже (строка)
3 DrZombi
 
гуру
05.04.17
15:14
(2) Используйте конструкцию вида "ЕстьNULL(<Поле>,"" или Выразить(<Знач> как Число или Строка и т.д.))" :)
4 SiAl-chel
 
05.04.17
15:15
(2) Такая ошибка бывает, когда последовательность полей разных типов нарушена. То есть в 1-м запросе - это дата, во 2-м  - ссылка или число.
(3) +100
5 Naf2017
 
05.04.17
15:15
(0) запрос уже давай
6 Evgenius
 
05.04.17
15:16
(3) нет никаких значений null в исходных данных, я выше писал
7 Naf2017
 
05.04.17
15:18
(4) да ладно:

ВЫБРАТЬ
    АвансовыйОтчет.Ссылка,
    АвансовыйОтчет.СуммаДокумента
ИЗ
    Документ.АвансовыйОтчет КАК АвансовыйОтчет

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВозвратТоваровПоставщику.Ссылка,
    ВозвратТоваровПоставщику.Дата
ИЗ
    Документ.ВозвратТоваровПоставщику КАК ВозвратТоваровПоставщику
8 Evgenius
 
05.04.17
15:21
(5)
Ну, как-то так:

ВЫБРАТЬ
    ВременнаяТаблица.Показатель,
    ВременнаяТаблица.КодПоказателя,
    ВременнаяТаблица.ТипСуммы,
    ВЫБОР КОГДА ВременнаяТаблица.Оператор > 0 ТОГДА ВременнаяТаблица.Сумма ИНАЧЕ -ВременнаяТаблица.Сумма КОНЕЦ КАК Сумма
    , ВременнаяТаблица.РегиональноеПодразделение, ВременнаяТаблица.ОС, ВременнаяТаблица.Покупатели, ВременнаяТаблица.СсылкаНаДокумент, ВременнаяТаблица.ДатаДокумента
ИЗ
    ВременнаяТаблица3 КАК ВременнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ВременнаяТаблица.Показатель,
    ВременнаяТаблица.КодПоказателя,
    ВременнаяТаблица.ТипСуммы,
    ВременнаяТаблица.Сумма КАК Сумма
    , ВременнаяТаблица.РегиональноеПодразделение, ВременнаяТаблица.ОС, ВременнаяТаблица.Покупатели, ВременнаяТаблица.СсылкаНаДокумент, ВременнаяТаблица.ДатаДокумента
ИЗ
    ВременнаяТаблица1 КАК ВременнаяТаблица
УПОРЯДОЧИТЬ ПО РегиональноеПодразделение, ОС, НематериальныеАктивы, Покупатели, СсылкаНаДокумент, ДатаДокумента
9 Evgenius
 
05.04.17
15:25
Гарантируется, что в обеих объединяемых таблицах одинаковое кол-во колонок, и у всех, кроме колонки Сумма базовый тип - строка
10 Naf2017
 
05.04.17
15:29
(8)(9) ты не ври, мы еще не знаем, что там у тебя во временных таблицах
11 Ёпрст
 
05.04.17
15:30
(9)
>>>, и у всех, кроме колонки Сумма базовый тип - строка

>>>КОГДА ВременнаяТаблица.Оператор > 0

Одна из черепашек врёт
12 Evgenius
 
05.04.17
15:30
(11) Сорри, у двух колонок тип = число
:-)
13 Ёпрст
 
05.04.17
15:32
(12) это же не весь запрос ?
14 Evgenius
 
05.04.17
15:33
(10) Таблицы я проверил, читай выше: если выбирать данные из каждой по отдельности, то нет ни значений null, ни каких либо еще типов, кроме числа (Оператор, Сумма) и строки (все остальные)
15 Ёпрст
 
05.04.17
15:33
при таком запросе нулл полей не будет.
Видать еще-где-то-левым-соединением-балуешьси
16 Evgenius
 
05.04.17
15:33
(13) В том-то и дело, что весь
17 Tateossian
 
05.04.17
15:36
Надо смотреть на твои временные таблицы 1...3
18 Evgenius
 
05.04.17
15:39
(17) Согласен! Но см. выше, нет в них нет ничего, кроме строк, если выбирать из них по отдельности, не объединяя
19 h-sp
 
05.04.17
15:43
(18) ну может группы туда фигачишь вместе с элементами во временные таблицы, мы же не видим отсюда.
20 Evgenius
 
05.04.17
15:46
(19) Не, правда, ну сколько можно: там нет ссылок! Там строки. И 2 числовые колонки. я про них забывал сообщить только потому, что с ними всё нормально, значения null появляются в тех колонках, где в обеих таблица строки (иногда пустые строки)
21 DailyLookingOnA Sunse
 
05.04.17
15:51
А откуда известно, что в таблицах Null нет?
В консоли на глаз?
22 h-sp
 
05.04.17
15:52
(20)  Null в отчет выводится как пустая строка, вы где смотрите?
23 Evgenius
 
05.04.17
15:54
(21) (22)
Нет. При проверке типа значения, содержащего null, возвращается Тип("null"). Я не поленился таблицы по одной достать и перебрать с проверкой типа значения
24 h-sp
 
05.04.17
15:54
(20) попробуйте убрать какие-то строки из запроса. например, оставьте одну строчку

ВЫБРАТЬ
    ВременнаяТаблица.Показатель


проверьте, потом если всё нормально добавьте следующие строчки. так найдете конкретную строку запроса.
25 Evgenius
 
05.04.17
15:57
Главный смех в том, что если процедура вызвана в той же базе, но не через COM-соединение, то она отрабатывает совершенно нормально...
26 h-sp
 
05.04.17
16:00
(25) но это пакетный запрос идет. или через менеджер временных таблиц?
27 Evgenius
 
05.04.17
16:03
Через менеджер. Тот запрос, который я привел, выполняется отдельно именно в таком виде
28 Вафель
 
05.04.17
16:03
пронумеруй строки и посмотри где возникает null
29 Вафель
 
05.04.17
16:04
ну или хотя бы номер таблицы выбирай
30 h-sp
 
05.04.17
16:06
(27) ну тогда чудес не бывает. или менеджер не той базы или запрос. А как получил  ВременнаяТаблица.СсылкаНаДокумент в виде строки? в запросе вроде не преобразует ссылку в строку.
31 Evgenius
 
05.04.17
16:09
(30) Все объекты создаются в процедуре, а не вне её.
Поле СсылкаНаДокумент содержит результат функции ПРЕДСТАВЛЕНИЕ()
32 h-sp
 
05.04.17
16:16
(31) ПРЕДСТАВЛЕНИЕ() нельзя использовать, это не строка, вот оно и глючит.
33 Evgenius
 
05.04.17
16:19
Думал про это, но как объяснить, что при помещении в ТЗ это становится строкой?
34 Evgenius
 
05.04.17
16:19
(без специального преобразования)
35 Evgenius
 
05.04.17
16:21
(32) а что же тогда результат функции ПРЕДСТАВЛЕНИЕ() из себя представляет (простите за тавтологию), когда его помещают во временную таблицу?
36 Ёпрст
 
05.04.17
16:23
(35) там всегда ссылка на объект. ПРЕДСТАВЛЕНИЕ это уже на выходе запроса 1с-ина сама отрабатывает потом
37 Evgenius
 
05.04.17
16:24
(36) Это при запросе, не создающем временную таблицу. ВТ содержит не текст запроса, а его результаты
38 Tateossian
 
05.04.17
16:35
(35) Вот запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"
|ВЫБРАТЬ
|    ПРЕДСТАВЛЕНИЕ(Организации.Ссылка) КАК Представление,
|    ПРЕДСТАВЛЕНИЕССЫЛКИ(Организации.Ссылка) КАК ПредставлениеСсылки
|ПОМЕСТИТЬ ВременнаяТаблица
|ИЗ
|    Справочник.Организации КАК Организации
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ВременнаяТаблица.Представление,
|    ВременнаяТаблица.ПредставлениеСсылки
|ИЗ
|    ВременнаяТаблица КАК ВременнаяТаблица";
Запрос.Выполнить();

Вот профайлер:

INSERT INTO #tt52 WITH(TABLOCK) (_Q_000_F_000_00RRef, _Q_000_F_000_01, _Q_000_F_001_00RRef, _Q_000_F_001_01) SELECT
T1._IDRRef,
T2._Description,
T1._IDRRef,
T2._Description
FROM dbo._Reference135 T1 WITH(NOLOCK)
LEFT OUTER JOIN dbo._Reference135 T2 WITH(NOLOCK)
ON T1._IDRRef = T2._IDRRef
39 mehfk
 
05.04.17
16:39
Что-то ты не то профайлером поймал
40 Tateossian
 
05.04.17
16:39
(36) По сути, представление и представление ссылки работает одинаково. Думаю, будут отличия для справочников, где представление кодом или наименованием.
41 Tateossian
 
05.04.17
16:39
(39) Чо эта?
42 mehfk
 
05.04.17
16:41
тьфу, глаз замылился, показалочь что соединяются рахные таблицы
43 Ёпрст
 
05.04.17
16:42
(37) ну, наглядный тест на вшивость - поставь условие на временную табличку , типа

Где ВременнаяТаблица.СсылкаНаДокумент = "Вася"

будешь приятно удивлён в неработоспособности этой конструкции.
Даже профайлер открывать не надо
44 Вафель
 
05.04.17
16:42
а интересно зачем это они соединяются?
45 mehfk
 
05.04.17
16:44
(44) Чтобы было видно, какие мощные программисты пишут платформу.
46 Вафель
 
05.04.17
16:47
я примерно догадываюсь зачем
47 Evgenius
 
05.04.17
16:48
(38) Ну, это говорит о том, что во временной таблице будет уже строка (значение поля, являющегося представлением объекта)
48 Evgenius
 
05.04.17
16:49
(43) Я только что был приятно удивлен её работоспособностью :-)

Неужели ты думал, что во временную таблице будет помещена ссылка? Так вот, нет
49 Вафель
 
05.04.17
16:49
(47) а зачем он тогда саму ссылку выбирает?
Ой не просто там строка будет
50 Ёпрст
 
05.04.17
16:49
(48) врешь же
51 Tateossian
 
05.04.17
16:52
Тут я интерпретировал вопрос по своему. Для документов будет немного другой запрос (но сути не меняет):

INSERT INTO #tt53 WITH(TABLOCK) (_Q_000_F_000_00RRef, _Q_000_F_000_01, _Q_000_F_000_02, _Q_000_F_001_00RRef, _Q_000_F_001_01, _Q_000_F_001_02) SELECT TOP 1
T1._IDRRef,
T2._Number,
T2._Date_Time,
T1._IDRRef,
T2._Number,
T2._Date_Time
FROM dbo._Document494 T1 WITH(NOLOCK)
LEFT OUTER JOIN dbo._Document494 T2 WITH(NOLOCK)
ON T1._IDRRef = T2._IDRRef
52 Evgenius
 
05.04.17
16:53
(50) Ты же видел запрос вверху (из профайлера). И ты сам-то как себе это представлял - что при использовании ПРЕДСТАВЛЕНИЯ() и просто Ссылки в поле ВТ помещается одно и то же, что ли?
И нет, не вру.
53 Ёпрст
 
05.04.17
16:54
(52) конечно врешь, хочешь сказать, что такой код у тебя работает ?

ВЫБРАТЬ
    ПРЕДСТАВЛЕНИЕ(Валюты.Ссылка) КАК Вася
ПОМЕСТИТЬ Табличка
ИЗ
    Справочник.Валюты КАК Валюты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Табличка.Вася
ИЗ
    Табличка КАК Табличка
Где Табличка.Вася ="лох"
54 Evgenius
 
05.04.17
16:54
Такой - не знаю, но выборка из моей временной таблицы, созданной в менеджере - работает. Ты привел пакетный запрос
55 mehfk
 
05.04.17
16:58
(54) А какая разница?
56 mehfk
 
05.04.17
16:59
Хочешь строки - выгружай в ТЗ, а потом ТЗ засовывай обратно.
57 Tateossian
 
05.04.17
17:00
Мне кажется в случае ком соединения если тип строка(50) и тип строка(100) - это разные типы. Надо это проверить.
58 DailyLookingOnA Sunse
 
05.04.17
17:01
Делал в запросах для отчетов на СКД условие соединений таблиц по представлению.
Был неприятно удивлен. Не соединялось.
59 Evgenius
 
05.04.17
18:07
(56) Строки у меня уже есть. Это факт, а не мнение
60 Evgenius
 
05.04.17
18:10
(56) (55) Разница, в том, что при помещении во временную таблицу представление формируется сразу. Видимо, помещение в ВТ движком приравнивается к возврату данных на клиента.
А пакетный запрос, который привел Ёпрст - он даже не скомпилится, наверное
61 Evgenius
 
05.04.17
18:11
(57) Да, но даже так - откуда появляется этот чертов null?
62 mehfk
 
05.04.17
18:12
(59) Давай минимальный кусок кода, который подтвердит твой "факт" на люой базе. Иначе это голословное утверждение.
63 Evgenius
 
05.04.17
18:17
(62) Какой кусок коды подтвердит, по твоему, наличие во временной таблице строк?
Уважаемый, я ничего не собираюсь доказывать, я просто изложил факты и попросил помощи. Сам твой вопрос доказывает, что ты с этой ситуацией не сталкивался и вряд ли подскажешь, куда копать. Есть временные таблицы, в которые помещены результаты запросов. Когда данные из них выбираешь - это строки и числа. Сам подумай: поскольку запрос, которым были сформированы эти таблицы, выполнялся несколько итераций назад, могла платформа догадаться, что ссылку
64 mehfk
 
05.04.17
18:19
(63) Доzzzzzzzвидания!
65 mehfk
 
05.04.17
18:34
66 Evgenius
 
05.04.17
18:34
(63)+
что ссылку в одной из колонок временной таблицы нужно при следующем запросе заменить на представление???
67 mehfk
 
05.04.17
18:36
68 Evgenius
 
05.04.17
18:47
(67) Ответь на мой вопрос
69 Evgenius
 
06.04.17
07:22
Вопрос простой: поскольку запрос, которым были сформированы эти таблицы, выполнялся несколько итераций назад, как платформа может потом догадаться, что ссылку, которую она, по твоему, поместила в колонку ВТ, нужно при последующей выборке из ВТ превратить в представление объекта?


Или просто создай запрос, инициализируй менеджер ВТ, создай там таблицу, в одной из колонок которой будет результат функции ПРЕДСТАВЛЕНИЕ. Потом попробуй отобрать из этой таблицы данные с отбором по строковому значению по колонке, в которой находятся результаты функции ПРЕДСТАВЛЕНИЕ
70 Неверный Параметр И
 
06.04.17
08:58
(69) Если читать документацию не по диагонали, а хотя бы слева направо, то можно понять, что функция представления всегда рассчитывается в самый последний момент,при передаче результатов вызывающему. Сделано это специально, так как при формировании представления учитывается локализация сеанса. До этого 1сная колонка хранится как набор полей, необходимых для вычисления.
В момент запроса данных из твоей одиночной таблицы  платформа возвращает тебе результат, вычисляя строку. Ты видишь эту строку и начинаешь брызгать подливой о типах данных в запросе.
Как только запрос становится сложнее, поле представление начинает содержать в себе разные по типу и количеству наборы служебных колонок для вычисления представления. Объединение таких наборов - неопределенное поведение и платформа подставляет тебе null.

Успехов в изучении матчасти.
71 Naf2017
 
06.04.17
08:59
(70) я думаю проблема банальнее, но автор не делится кодом, а голословно утверждает
72 Evgenius
 
06.04.17
09:47
(70)
Если не тратить время на колкости и отвечать на встречные вопросы, толку от вашего участия в обсуждении будет больше.
Вы утверждаете, что ВО ВРЕМЕННОЙ ТАБЛИЦЕ, КУДА ПОМЕЩЕН РЕЗУЛЬТАТ ФУНКЦИИ ПРЕДСТАВЛЕНИЕ, ХРАНИТСЯ НАБОР КОЛОНОК ВМЕСТО РЕЗУЛЬТАТА?
73 Evgenius
 
06.04.17
09:48
(71) Так давай договоримся, какой именно код тебе поможет понять, что происходит. ВЕСЬ КОД процедуры - это сотни 3 строк. Вообще, по нормальному описанию тоже можно понять, но я допускаю, что чего-то в моих описаниях не хватает
74 mehfk
 
06.04.17
09:49
75 Evgenius
 
06.04.17
11:47
Мне надо было повнимательней посмотреть листинги, выложенные Tateossian :)
Всем спасибо )
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший