Динамический список

1. paulwist 26.07.24 15:38 Сейчас в теме
Братья и сестры.

Динамический список генерит запрос такого вида:

SEL ECT TOP 25
T1._IDRRef,
T1._Marked,
T1._Date_Time,
T1._Posted,
T1._Fld276RRef,
T1._Fld277RRef,
T1._Fld279RRef,
T1._Fld280,
T1._Fld283RRef,
T1._Fld316RRef,
T1._Fld347,
ISNULL(T2._Date_Time,{ts '2001-01-01 00:00:00'}),
T1._IDRRef
FR OM dbo._Document272 T1
LEFT OUTER JOIN dbo._Document272 T2
ON T1._IDRRef = T2._IDRRef

WHERE (ISNULL(T2._Date_Time,@P1) < @P2) OR (ISNULL(T2._Date_Time,@P3) = @P4) AND (T1._IDRRef < @P5)
ORDER BY (ISNULL(T2._Date_Time,{ts '2001-01-01 00:00:00'})) DESC, (T1._IDRRef) DESC
Показать



Вопрос: где и как надо подкрутить, что бы исправить эту дичь :(

PS обращаю внимание, что DDL таблички имеет такой вид, те все isnull должны идти "лесом", поскольку null-a там не может быть по определению :)

CRE ATE   TABLE [dbo].[_Document272](
...
       [_Date_Time] [datetime2](0) NOT NULL,
 ...
По теме из базы знаний
Найденные решения
23. WasiliyMay 8 31.07.24 13:46 Сейчас в теме
(13) В режиме пользователя. В настройке динамического списка точно нет отбора или сортировки по дате через поле ссылка?
user2041697; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kuzev 48 26.07.24 17:10 Сейчас в теме
(1) динамический список формируется произвольным запросом?
7. paulwist 29.07.24 08:35 Сейчас в теме
(2)
динамический список формируется произвольным запросом?


Нет. (Произвольный запрос - галка не стоит)
3. Armando 1401 27.07.24 00:24 Сейчас в теме
(1) Странный запрос. Зачем документ соединять сам с собой по ссылке?
4. RustamZz 27.07.24 08:13 Сейчас в теме
(3) Вангую Ссылка.Дата у пациента.
user1880116; Sashares; spacecraft; +3 Ответить
9. paulwist 29.07.24 08:37 Сейчас в теме
(4)
Вангую Ссылка.Дата у пациента.


Переведи. ... (с) Москва слезам не верит
8. paulwist 29.07.24 08:36 Сейчас в теме
(3)
Зачем документ соединять сам с собой по ссылке?


Это был бы второй вопрос :)
5. SlavaKron 27.07.24 08:35 Сейчас в теме
(1)
где и как надо подкрутить, что бы исправить эту дичь
В тексте запроса динамического списка можно добавить {ВЫБРАТЬ Ссылка} в секцию ВЫБРАТЬ и {ГДЕ Ссылка} в секцию ГДЕ, чтобы исключить использование дочерних реквизитов поля Ссылка в отборах, быстром поиске и в пользовательских колонках, добавленных через "Изменить форму".
Это также можно сделать через вкладку "Компоновка данных" конструктора запроса.
10. paulwist 29.07.24 09:02 Сейчас в теме
(5)
В тексте запроса динамического списка можно добавить {ВЫБРАТЬ Ссылка}


Ммм, запрос "руками" не прописан, платформа его генерит сама.
6. user1880116 27.07.24 10:42 Сейчас в теме
(1)
все isnull должны идти "лесом"
Компоновщик видит левое соединение и перестраховывается, брат или сестра.

Но, похоже это опять тема типа "программист сотворил дичь, но виновата платформа, доколе 1С будет..."
11. paulwist 29.07.24 09:04 Сейчас в теме
(6)
Компоновщик видит левое соединение и перестраховывается


С этим понятно.


(6)
Но, похоже это опять тема типа "программист сотворил дичь, но виновата платформа, доколе 1С будет..."


Верно, надо только выяснить это программист вендора или прикладник сотворил "дичь" :) :)
12. user1880116 30.07.24 08:05 Сейчас в теме
(11)
только выяснить это программист вендора или прикладник сотворил
Это повлияет на результат - будете вы это исправлять или нет?
Или нам просто предлагается угадать историю разработки неизвестного объекта неизвестной базы?
13. paulwist 30.07.24 10:21 Сейчас в теме
(12)
Это повлияет на результат - будете вы это исправлять или нет?


Конечно, если накосячил прикладник, то буду его пинать, если это фича вендора, то надо искать пути обхода косяка.


(12)
Или нам просто предлагается угадать историю разработки неизвестного объекта неизвестной базы?


Я задал вопрос по поведению 1С, возможно кто-тот уже сталкивался с таким поведением.

Но не суть.

Продолжим.

Итак, упростил запрос в Динамическом списке до такого вида

ВЫБРАТЬ
	1 + 1 КАК Поле1
ИЗ
	Документ.Документ1 КАК Документ1
ГДЕ
	Документ1.Ссылка ЕСТЬ НЕ NULL 


В итоге, для ПЕРВОГО открытия формы профайлер ловит следующий код

SEL ECT TOP 45
@P1,
T1._Marked,
T1._Posted,
T1._Date_Time,
T1._IDRRef,
ISNULL(T2._Date_Time,{ts ''2001-01-01 00:00:00''}),
T1._IDRRef
FR OM dbo._Document272 T1
LEFT OUTER JOIN dbo._Document272 T2
ON T1._IDRRef = T2._IDRRef
WHERE (T1._IDRRef IS NOT NULL)
ORDER BY (ISNULL(T2._Date_Time,{ts ''2001-01-01 00:00:00''})) DESC, (T1._IDRRef) DESC
Показать


Вижу, прям красота, избавились where для алиаса T2 и имеем почти САРГ предикат :)

WHERE (T1._IDRRef IS NOT NULL)


Начинаю скролить список, получаю такую же дичь, как в первоначальном посте

SELECT TOP 25
@P1,
T1._Marked,
T1._Posted,
T1._Date_Time,
T1._IDRRef,
ISNULL(T2._Date_Time,{ts ''2001-01-01 00:00:00''}),
T1._IDRRef
FR OM dbo._Document272 T1
LEFT OUTER JOIN dbo._Document272 T2
ON T1._IDRRef = T2._IDRRef
WH ERE ((ISNULL(T2._Date_Time,@P2) < @P3) OR (ISNULL(T2._Date_Time,@P4) = @P5) AND (T1._IDRRef < @P6))
ORDER BY (ISNULL(T2._Date_Time,{ts ''2001-01-01 00:00:00''})) DESC, (T1._IDRRef) DESC
Показать


Вопрос: как заставить при скроле Списка использовать запрос определенный в ДинамическийСписок ->НастройкаЗапроса (тот который T1._IDRRef IS NOT NULL))
23. WasiliyMay 8 31.07.24 13:46 Сейчас в теме
(13) В режиме пользователя. В настройке динамического списка точно нет отбора или сортировки по дате через поле ссылка?
user2041697; +1 Ответить
25. paulwist 02.08.24 13:18 Сейчас в теме
(23)
В режиме пользователя. В настройке динамического списка точно нет отбора или сортировки по дате через поле ссылка?


В режиме пользователя, вот такое чудо (см картинку), в сортировке стоит Ссылка, именно эта Ссылка заставляет делать left join таблицы саму на себя со всеми вытекающими ISNULL().

Если убрать Ссылку из сортировки, то движок 1С приходит в адекватное состояние :)

Спасибо друзья за помощь!!!!

PS нет цензурных слов :) одни междометия :)
Прикрепленные файлы:
user2041697; +1 Ответить
14. user1880116 30.07.24 11:23 Сейчас в теме
(13)
Вопрос
Ответ: никак.
Компоновщик выбрасывает твой запрос и строит новый исходя из текущих настроек динамического списка и состояния скролла.

Добавь на форму кнопку и посмотри на результат:
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.СписокПолучитьИсполняемыеНастройкиКомпоновкиДанных();

Макет = Компоновщик.Выполнить(Схема, Настройки);
ТекстЗапроса = Макет.НаборыДанных[0].Запрос;
Там же заодно можно и значения параметров компоновки посмотреть.
16. paulwist 30.07.24 14:20 Сейчас в теме
Спасибо за направление :)

(14)
Добавь на форму кнопку и посмотри на результат:


Ммм, ТекстЗапроса не меняется, те как был определён в Динамическом списке, такой остаётся, независимо от того форма открывается первый раз (когда ТекстЗапроса и сам запрос в СУБД совпадают ) или скролить уже полученные данные (когда текст запроса и запрос в СУБД не совпадают).

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	1 + 1 КАК Поле1,
	Документ1.Ссылка КАК Ссылка,
        .......
	ПРЕДСТАВЛЕНИЕССЫЛКИ(Документ1.Организация) КАК ОрганизацияПредставление,
       ......
ИЗ
	Документ.Документ1 КАК Документ1
ГДЕ
	Документ1.Ссылка ЕСТЬ НЕ NULL 
Показать


(14)
Там же заодно можно и значения параметров компоновки посмотреть.


На это как поглазеть??

Куда бы ещё посмотреть??


(15)
И весьма похоже, что это у тебя не просто динамический список, а журнал документов,


Нет журнала, вообще в конфигурации нет журналов.
15. user1880116 30.07.24 11:36 Сейчас в теме
И весьма похоже, что это у тебя не просто динамический список, а журнал документов, который туда еще и общий период накладывает, от которого ты не избавишся.
17. SlavaKron 30.07.24 14:25 Сейчас в теме
Вроде бы в (4) верно определили проблему – выведена пользовательская колонка из ссылки "Дата" и по ней сделана сортировка. Чего переливаете из пустого в порожнее не понятно. Решается настройкой ограничения полей.

И зачем Документ1.Ссылка ЕСТЬ НЕ NULL , если основная таблица Документ.Документ1?
18. paulwist 30.07.24 15:04 Сейчас в теме
(17)
Вроде бы в (4) верно определили проблему – выведена пользовательская колонка из ссылки "Дата" и по ней сделана сортировка.


В (13) запрос был упрощён до безобразия, повторю:

ВЫБРАТЬ
    1 + 1 КАК Поле1
ИЗ
    Документ.Документ1 КАК Документ1
ГДЕ
    Документ1.Ссылка ЕСТЬ НЕ NULL 


то есть " пользовательская колонка из ссылки "Дата" вообще в запросе нет.

(17)
Решается настройкой ограничения полей.


"Разжуйте" что надо сделать, как ограничить поля??


(17)
И зачем Документ1.Ссылка ЕСТЬ НЕ NULL , если основная таблица Документ.Документ1?


При скроле списка на сервер отправляется предикат а-ля

WHERE (ISNULL(T2._Date_Time,@P1) < @P2) OR (ISNULL(T2._Date_Time,@P3) = @P4) AND (T1._IDRRef < @P5)


Документ1.Ссылка ЕСТЬ НЕ NULL - это была попытка сказать платформе 1C, что бы не использовала ISNULL в секции where, но тщетно :)
19. SlavaKron 30.07.24 15:59 Сейчас в теме
(18)
как ограничить поля?
Как я указал в (5):
ВЫБРАТЬ
	Документ1.Ссылка,
	1 + 1 КАК Поле1
{ВЫБРАТЬ Ссылка}
ИЗ
	Документ.Документ1 КАК Документ1
{ГДЕ Ссылка}
20. paulwist 30.07.24 16:34 Сейчас в теме
(19)
Как я указал в (5):


Те же яйца, только в профиль.

Вот что нарисовал конструктор запросов

ВЫБРАТЬ
	Документ1.Ссылка КАК Ссылка,
	1 + 1 КАК Поле1
{ВЫБРАТЬ
	Ссылка}
ИЗ
	Документ.1 КАК Документ1
{ГДЕ
	Документ1.Ссылка}
Показать


Вот что рисует профайлер
Прикрепленные файлы:
21. SlavaKron 30.07.24 17:39 Сейчас в теме
(20) Если всё так, как говорите, то у меня нет версий. Маловероятно, но возможно это происки RLS.
22. paulwist 31.07.24 10:14 Сейчас в теме
(21)
Если всё так, как говорите, то у меня нет версий. Маловероятно, но возможно это происки R


Спасибо.

Что сделал:

1. Создал новый Документ, заполнил руками drag-drop туда объекты из кривого документа.

Результат отличный, запросы сформированы как нужно

SEL ECT TOP 30
T1._IDRRef,
T1._Marked,
T1._Number,
T1._Date_Time,
T1._Posted,
T1._Fld761RRef,
T1._Fld858
FR OM dbo._Document760 T1
WHERE T1._Date_Time = @P1 AND T1._IDRRef < @P2
ORDER BY (T1._Date_Time) DESC, (T1._IDRRef) DESC
Показать


Нет левого соединения и нет isnull

2. Создаю новый документ копированием из кривого, те правая педаль на документе -> Скопировать

ДинамическийСписок направляю (источник данных) на документ в котором косяки с where isnull... ииии косяки "пропадают", вот блин "приплыли" :).
24. user1880116 31.07.24 14:06 Сейчас в теме
(22)
Создаю новый документ
Скорей всего у тебя в хранилище настроек сидят настройки элемента формы - динамического списка, которые хранятся в разрезе полного имени формы. Они автоматически и подхватываются. Загляни туда.
Оставьте свое сообщение

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