Имя: Пароль:
1C
 
Пустая ссылка не равна пустой ссылке
0 trympyrym
 
04.01.26
16:13
Переносил я сегодня данные в новую базу. УТ 11.5.25.85, платформа 8.3.27.1936.

И не проводился у меня ввод остатков. Копал я это дело, и накопал вот что. Выполняю запрос

ВЫБРАТЬ
ТаблицаРасчетыСПартнерами.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка),
РегистрАналитикаУчетаПоПартнерам.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка),
ТаблицаРасчетыСПартнерами.ОбъектРасчетов.Договор = РегистрАналитикаУчетаПоПартнерам.Договор КАК ОниРавны
  ИЗ
    Документ.ВводОстатковВзаиморасчетов.РасчетыСПартнерами КАК ТаблицаРасчетыСПартнерами
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК РегистрАналитикаУчетаПоПартнерам
        ПО ТаблицаРасчетыСПартнерами.Партнер = РегистрАналитикаУчетаПоПартнерам.Партнер
        И ТаблицаРасчетыСПартнерами.Контрагент = РегистрАналитикаУчетаПоПартнерам.Контрагент
        И ТаблицаРасчетыСПартнерами.Ссылка.Организация = РегистрАналитикаУчетаПоПартнерам.Организация
ГДЕ Ссылка = &Ссылка

Подставляю параметром документ, который руками создал - получаю Да, Да, Да (в каждой строке)

Подставляю параметром документ, который моя обработка создала - получаю Да, Да, Нет (в каждой строке)

Как так может получиться? Я всегда думал что пустые ссылки одного типа друг другу равны
1 trympyrym
 
04.01.26
16:20
Посмотрел гуид-ы обоих ссылок - получаю везде "00000000-0000-0000-0000-000000000000". И они таки не равны
2 Волшебник
 
04.01.26
16:24
значит типы разные
3 Волшебник
 
04.01.26
16:25
или где-то составной тип и там Неопределено
4 Волшебник
 
04.01.26
16:26
используй функцию ТИПЗНАЧЕНИЯ(поле)
5 H A D G E H O G s
 
04.01.26
16:28
РегистрАналитикаУчетаПоПартнерам.Договор - точно не СправочникСсылка.ДоговорыМеждуОрганизациями?

Что говорит запрос?


ВЫБРАТЬ
ТаблицаРасчетыСПартнерами.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка),
РегистрАналитикаУчетаПоПартнерам.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка),
ТаблицаРасчетыСПартнерами.ОбъектРасчетов.Договор = РегистрАналитикаУчетаПоПартнерам.Договор КАК ОниРавны,
ТипЗначения(ТаблицаРасчетыСПартнерами.ОбъектРасчетов.Договор) КАК ТипДоговораТаблицы,
ТипЗначения(РегистрАналитикаУчетаПоПартнерам.Договор) КАК ТипДоговораРегистра
  ИЗ
    Документ.ВводОстатковВзаиморасчетов.РасчетыСПартнерами КАК ТаблицаРасчетыСПартнерами

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК РегистрАналитикаУчетаПоПартнерам
        ПО ТаблицаРасчетыСПартнерами.Партнер = РегистрАналитикаУчетаПоПартнерам.Партнер
        И ТаблицаРасчетыСПартнерами.Контрагент = РегистрАналитикаУчетаПоПартнерам.Контрагент
        И ТаблицаРасчетыСПартнерами.Ссылка.Организация = РегистрАналитикаУчетаПоПартнерам.Организация
ГДЕ Ссылка = &Ссылка
6 trympyrym
 
04.01.26
16:33
(5) Точно

ТипДоговораТаблицы показывает "Не определено" ))

Хотя ТаблицаРасчетыСПартнерами.Договор = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка) это у нас Истина, да
7 ProxyInspector
 
04.01.26
16:34
А вот такой запрос

ВЫБРАТЬ
    ТаблицаРасчетыСПартнерами.Договор.Ссылка is NULL,
    РегистрАналитикаУчетаПоПартнерам.Договор = is NULL,
    ТаблицаРасчетыСПартнерами.ОбъектРасчетов.Договор.Ссылка = РегистрАналитикаУчетаПоПартнерам.Договор.Ссылка КАК ОниРавны
8 H A D G E H O G s
 
04.01.26
16:34
Преступление раскрыто
9 H A D G E H O G s
 
04.01.26
16:35
(7) За такой - надо выгонять из профессии
10 trympyrym
 
04.01.26
16:36
(7) Нет, Нет, Нет

(8) Да, спасибо. А все-таки как так получается, что тип не определен, но значение равно пустой ссылке типа Справочник.ДоговорыКонтрагентов?
11 H A D G E H O G s
 
04.01.26
16:39
(10) Как смотрел guid ?
12 trympyrym
 
04.01.26
16:41
В консоли запросов нажал галку "показывать ГУИД ссылок"
13 H A D G E H O G s
 
04.01.26
16:46
(12) УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в запросе от неопределенного составного типа показывает 00000000-0000-0000-0000-000000000000
14 ProxyInspector
 
04.01.26
17:02
(9) За такое надо выгонять из профессии ...
Это конечно не кошерно. Но расскажи как в запросе кошерно проверить на НеЗаполнено реквизит составного типа. Я думаю ты не знаешь.
15 Chameleon1980
 
04.01.26
17:05
(14) ну точно не так

РегистрАналитикаУчетаПоПартнерам.Договор = is NULL,
16 ProxyInspector
 
04.01.26
17:09
Это опечатка
17 ProxyInspector
 
04.01.26
21:39
Реквизит составного типа может иметь тип Справочник, Документ, Перечисление тогда для не заполненного значения -
Реквизит.Ссылка is Null = ИСТИНА  
Вполне возможно, что и если Реквизит = НЕОПРЕДЕЛЕНО тогда
Реквизит.Ссылка is NULL = ИСТИНА , но это не точно
18 Chameleon1980
 
04.01.26
17:16
(16) ну так за это, наверное, и говорят - никто-ж не в курсе, что это опечатка (или нет) :)
19 Garykom
 
гуру
04.01.26
17:35
Эту фишку часто даже опытные товарищи не знают, которые давно в 1С формошлепят

Что составной тип может принимать 3 значения для ссылочных типов:
1. Неопределено (когда тип не выбран)
2. ПустаяСсылка (когда тип выбран, не выбрано значение)
3. Значение конкретного типа (выбран и тип и значение)
20 Garykom
 
гуру
04.01.26
17:38
(19)+ Особенно хреново что в запросах для составных приходится и на Неопределено и на ПустаяСсылка проверять
Ну или сначала выражать а затем проверять
21 H A D G E H O G s
 
04.01.26
18:41
(14)

    МассивПустыхСсылокПервичногоДокументаПоступления=Новый Массив;
    МассивПустыхСсылокПервичногоДокументаПоступления.Добавить(Неопределено);
    ТипыРеквизита=МетаданныеРеквизитовСерий.АСФПервичныйДокументПоступления.Тип.Типы();
    Для Каждого ТипРеквизита Из ТипыРеквизита Цикл
        МассивПустыхСсылокПервичногоДокументаПоступления.Добавить(Новый (ТипРеквизита));
    КонецЦикла;
22 H A D G E H O G s
 
04.01.26
18:43
(21) Чтобы можно было не переживать о смене типов реквизита.
23 Garykom
 
гуру
04.01.26
18:58
(22) И не хочется аналог ЗначениеЗаполнено() в языке запросов на уровне платформы?
24 craxx
 
04.01.26
19:43
(0) Создай руками ввод остатков и сравни любым редактором объектов с твоим перенесенным. Станет ясно, где косяк.
25 ProxyInspector
 
04.01.26
19:56
Мне очень сильно кажется, что
если Реквизит = НЕОПРЕДЕЛЕНО, Реквизит = Строка и т.д. то
Реквизит.Ссылка is NULL = ИСТИНА
Это полный аналог НеЗначениеЗаполнено()
26 H A D G E H O G s
 
04.01.26
20:15
(25) Мне очень сильно кажется, что это лишнее ненужное соединение с набором таблиц, часто приводящее к печальным последствиями.
27 ProxyInspector
 
04.01.26
20:21
Для небольших баз под 100 Гб, ничего страшного не должно случиться.
  Для универсальных алгоритмов ничего другого не придумывается
28 H A D G E H O G s
 
04.01.26
20:28
(27) Чувствуется школа Гения 1С.
29 Волшебник
 
04.01.26
21:09
(28) Он прав. Оптимизацией надо заниматься, когда начинает тормозить и мешать бизнесу.
Если бизнесу не мешает и терпимо тормозит, то запрос имеет право быть неоптимальным.
30 Ненавижу 1С
 
гуру
05.01.26
08:47
Грабли архитектуры 1С они такие ))
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.