|
Как обойти ограничение фреш в запросе динамического списка? | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
16.02.23
✎
11:31
|
Есть динамический список, в нем я меняю запрос (в конце):
Фреш отклонил, прислал замечание: Расширение не должно приводить к чрезмерной нагрузке на компоненты сервиса или клиентское приложение. В расширении используется соединение с подзапросом. Не рекомендуется использовать соединения с подзапросами. Поместите результат подзапроса во временную таблицу и проиндексируйте поля по которым будут соединения. Подробнее с причинами неоптимальной работы запросов и их оптимизацией можно ознакомиться здесь https://its.1c.ru/db/v8std#browse:13:-1:26:28 Можно конечно сделать доп. поле и в него прописывать этот заказ при записи расходной. Но может есть другие решения? |
|||
1
Kassern
16.02.23
✎
11:34
|
(0) Вам даже по русски написали, что нужно сделать, вы ж гений - действуйте.
|
|||
2
Kassern
16.02.23
✎
11:34
|
ВЫБРАТЬ
Т.Ссылка КАК Ссылка, МАКСИМУМ(НАЧАЛОПЕРИОДА(Т.Заказ.Дата, ДЕНЬ)) КАК ДатаЗаказа ИЗ Документ.РасходнаяНакладная.Запасы КАК Т Вот это что по вашему? |
|||
3
Гений 1С
гуру
16.02.23
✎
12:06
|
(2) максимальная дата заказа. Какие временные таблицы в запросе динамического списка, окститесь. мне проще реквизит в расходную добавить и при записи его проставлять.
|
|||
4
TormozIT
гуру
16.02.23
✎
12:10
|
А В 1С:Аналитика просят наоборот - не делать временных таблиц и делать соединения с подзапросами =)
http://devtool1c.ucoz.ru/forum/3-2247-1 |
|||
5
Donkey_hot
16.02.23
✎
12:13
|
||||
6
H A D G E H O G s
16.02.23
✎
12:18
|
Ну хоть Фреш будет попинывать лупоглазых.
(0) Радуйся, Г1С, просвещайся. |
|||
7
H A D G E H O G s
16.02.23
✎
12:20
|
(1) Так то Г1С прав, нельзя в ВТ ОсновнуюТаблицу помещать, а это ОСНОВНАЯ причина, по которой хотелось ВТ в ДинСписке.
|
|||
8
H A D G E H O G s
16.02.23
✎
12:20
|
(7) Но 1С захерили идею.
|
|||
9
H A D G E H O G s
16.02.23
✎
12:22
|
И теперь у Г1С 2 пути, гыгыгы.
1) Реализовать коррелированный подзапрос и доказать 1С, что он - совсем не то, что обычный подзапрос и не просаживает производительность. 2) Просить реализацию ВТ для основных таблиц динсписка. |
|||
10
Гений 1С
гуру
16.02.23
✎
12:46
|
(9) отнюдь. я просто добавил реквизит Заказ и проставляю его в реализации перед записью:
Бороться с идиотизмом не входит в мои планы. |
|||
11
Гений 1С
гуру
16.02.23
✎
12:47
|
но уаще то я впечатлен, это где-то 6-е обновление доработки и разглядели таки этом момент, ай молодцы. ;-)
|
|||
12
H A D G E H O G s
16.02.23
✎
13:21
|
(10) Я не сомневался.
|
|||
13
H A D G E H O G s
16.02.23
✎
13:22
|
(10) Че там насчет ОбменДанными.Загрузка ?
Я бы на месте модераторов 1С настроил бы робота на ключевое слово "Осипов" |
|||
14
mistеr
16.02.23
✎
13:26
|
(7) Но тогда список перестает быть динамическим, не так ли? :)
|
|||
15
H A D G E H O G s
16.02.23
✎
13:28
|
(14) С чего бы?
|
|||
16
mistеr
16.02.23
✎
13:41
|
(15) Потому что исчезает понятие основной таблицы и пейджинга.
|
|||
17
H A D G E H O G s
16.02.23
✎
14:39
|
(16) Никуда не исчезает.
Просто выбираем по 45 строк не в результатзапроса, а во временную таблицу. И дальше уже с этими 45 строками ВТ можно делать что угодно - засовывать в параметры ВТ Остатки, СрезПоследних, и.т.д. |
|||
18
Kassern
16.02.23
✎
14:53
|
(7) "нельзя в ВТ ОсновнуюТаблицу помещать" - а где ТС это делает?
ему сказали, что нефиг делать подзапрос в дин списке. Мол оберните во временную таблицу, а потом уже ее цепляйте к основной. |
|||
20
H A D G E H O G s
16.02.23
✎
15:06
|
||||
21
mistеr
16.02.23
✎
15:14
|
(17) Так не прокатит. В ВТ можно напихать чего угодно, да еще с учетом составных типов. Нет гарантии, что по ней можно будет нормально пейджиться. Нет гарантии наличия нужных индексов.
То, что ты хочешь, в принципе имеет право на жизнь. Но если делать по уму, то нужно дать хук при открытии ДС. Туда передается менеджер ВТ, ты заполняешь ВТ нужными данными, дальше используешь в основном запросе. |
|||
22
Kassern
16.02.23
✎
15:18
|
(21) "дать хук при открытии ДС" - так вроде есть такой "хук". Мы же можем передать параметры в дин список при создании на сервере и все корректно отработает.
|
|||
23
mistеr
16.02.23
✎
15:25
|
(22) Параметры можно, ВТ нельзя. ВТ, которая будет заполняться один раз, а не при каждом листании.
|
|||
24
Kassern
16.02.23
✎
15:28
|
(23) Я в курсе, что ВТ нельзя). Прост "при создании на сервере" 1 раз и отработает. По идее, ничего не мешало, дать возможность впихнуть ВТ. Хотя, может ДС создается еще раньше, хз.
|
|||
25
H A D G E H O G s
16.02.23
✎
15:37
|
Вот это жесть. Удачи вам, че.
|
|||
26
H A D G E H O G s
16.02.23
✎
15:40
|
Иногда, когда я встречаю воот такое (21), я думаю - а правильно про 1С ников говорят
|
|||
27
mistеr
16.02.23
✎
15:43
|
(25) "Удачи" в каком смысле? Типа, разрешаешь закоммитить в 8.3.24? :)
|
|||
28
H A D G E H O G s
16.02.23
✎
15:45
|
(27) Типа, ты не пытаешься вкурить в смысл.
Чем отличается вывод 45 строк из многомиллионной таблицы на экран от того же вывода во временную таблицу? |
|||
29
H A D G E H O G s
16.02.23
✎
15:45
|
(27) Че ты там пейджить собрался то?
|
|||
30
mistеr
16.02.23
✎
15:47
|
(28) Ну видимо да, не вкурил. Можешь попытаться еще раз, другими словами.
|
|||
31
H A D G E H O G s
16.02.23
✎
15:54
|
Но я понимаю, почему 1С это не делают - лениво. Потому что муторно.
Ибо, когда мы работаем с выводом на экран - мы всегда получим на выходе именно эти 45 строк. И из последней строки мы получим ключевые поля, чтобы получить следующую порцию данных, по условию - больше этих полей. Классический порционный запрос (на самом деле, там есть хитрости, которые смотрят, в начале вы таблицы мотаете или в середине или в конце). Но как только мы помещаем результат в ВТ - все становится сложнее. Мы можем урезать результат ВНУТРЕННИМ соединением и на выходе получить не 45 строк, а 2. И 1С должна это учитывать и допилить цикличное продолжение выполнения запроса, пока на выходе не будет 45 строк или не кончится таблица. + 1С должна получать последнюю запись ключевых поля Основной таблицы. Тут она должна сказать Пользователю- программисту 1С - давай пробрасывать через ПакетыЗапросов ключевые поля, либо сама неявно их должна пробрасывать, добавляя в пакетыЗапросов поля основной таблицы, либо Перед помещением ОсновнойТаблицы в ВТ впилить промежуточный запрос, выбирающий эти Ключевые поля. |
|||
32
Конструктор1С
16.02.23
✎
16:00
|
(10) ты сам родитель идиотизма и говнокода
|
|||
33
H A D G E H O G s
16.02.23
✎
16:01
|
Что я предлагаю:
ВЫБРАТЬ ПЕРВЫЕ 45 ОхеренноБольшаяТаблицаТоваров.Ссылка Из Справочник.ОхеренноБольшаяТаблицаТоваров как ОхеренноБольшаяТаблицаТоваров Поместить ВТСовсемНебольшаяТаблица ГДЕ ОхеренноБольшаяТаблица.Ссылка>&ПредыдущаяСсылка; ВЫБРАТЬ Остатки.Товар, Остатки.Количество Из РегистрНакопления.Остатки(&ВчерашнийДень, Остатки.Товар В (Выбрать ВТСовсемНебольшаяТаблица.Ссылка Из ВТСовсемНебольшаяТаблица)) Поместить ВТОстатки; ВЫБРАТЬ ВТСовсемНебольшаяТаблица.Ссылка, isnull(ВТОстатки.Количество,0) и ЛевоеСоединение |
|||
34
Kassern
16.02.23
✎
16:05
|
(33) Так ведь динамический список сам на уровне платформы обходить определенный кусок таблицы и отображает его нам динамически.
Вы хотите сами рулить логикой отображения дин списка, или я вас не так понял? |
|||
35
H A D G E H O G s
16.02.23
✎
16:07
|
(34) Я логику описал, что должно происходить
|
|||
36
mistеr
16.02.23
✎
16:10
|
(33) Теперь я кажется понял
|
|||
37
H A D G E H O G s
16.02.23
✎
16:17
|
(36) Это хорошо. Странно, что это сходу никто вкурить не может.
|
|||
38
Гений 1С
гуру
16.02.23
✎
16:41
|
(37) Мы тупые 1сники, размышлять о системных вещах не желаем. Нас аудит послал в сад, мы нашли дырку в заборе и обошли. ггг
|
|||
39
Гений 1С
гуру
16.02.23
✎
19:06
|
(13) чорд. Ты был прав. они отклонили из-за этого. Поэтому за Фреш надо брать в 3 раза дороже.
|
|||
40
ДедМорроз
16.02.23
✎
19:17
|
Просто,в нормальных sql это запрос с открытым курсором,когда вылетает порция данных в буфер,а потом мы из этого буфера подтягиваем,и запрос продолжает выполняться.
С временной таблицей проблема в том,что мы должны,сначала,выполнить запрос для временной таблицы,причем весь,потом его проиндексировать (а для этого мы и создавали временную таблицу,чтобы добавить индекс),а уже после этого пойти выполнять второй запрос. Да и за временной таблицей можно и не ходить,можно просто упорядочивание сделать по неиндексированному полю,и для выбора порции также нужно будет выполнить весь запрос,а только потом получить первую порцию. На самом деле,у 1с разбиение на страницы немного по-другому - выполняется весь запрос и его результат пихается в кеш,а уже из последнего выводятся порции. Выполнять запрос еще раз нельзя,так как или мы должны открыть транзакцию и сделать версию состояния таблицы на момент запуска или мы получим не совсем консистентные данные. |
|||
41
H A D G E H O G s
16.02.23
✎
20:46
|
(40) Бред сивой кобылы. От начала и до конца. Ну, как обычно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |