|
1С ЗАПРОС, Аналог LIMIT в SQL | ☑ | ||
---|---|---|---|---|
0
d3N4eGG
01.05.13
✎
01:39
|
Добрый вечер.
Задача следующая: имеется вэб и 1с. В 1с создан веб-сервис, который возвращает на вэб таблицу. Таблица очень большая, и если передавать её сразу всю, то время обработки занимает много времени, иногда даже выскакивает ошибка timeout. для того, чтобы решить данную проблему требуется получать данные не все целиком, а частично. К примеру, у нас справочник, в нем 100 записей, мы получаем количество элементов данного справочника и хотим получать данные с градацией 20 штук. 1..20 21..40 41..60 и тд В SQL имеется оператор LIMIT, который выполняет как раз это. Есть ли в 1с что-то подобное или как реализовать данную задачу по-другому? |
|||
1
France
01.05.13
✎
01:41
|
к что такое "вэб"??
|
|||
2
d3N4eGG
01.05.13
✎
01:44
|
сайт, на котором рисуется список элементов справочника
|
|||
3
France
01.05.13
✎
01:48
|
ок.. а то и "веб" встречается, и "вэб".
Выбрать Первые не устроит?? |
|||
4
d3N4eGG
01.05.13
✎
02:00
|
крч идея такая, есть таблица на страничке (справочник номенклатура, к примеру), в неё всего помещается 20 строк, а в справочнике номенклатура в 1с - 100 элементов.
Требуется сделать следующее, мы на первой страничке рисуем первые 20 элементов, и делаем кнопочки с нумерацией страниц 1-2-3-4-5. Нажал на 1 страницу - у тебя отображаются элементы из справочника Номенклатура[1], Номенклатура[2], Номенклатура[3].. Номенклатура[20]. Нажал на 2 страницу - у тебя отображаются элементы из справочника Номенклатура[21], Номенклатура[22], Номенклатура[23].. Номенклатура[30]. что бы не получать всю таблицу на каждой странице, нужно сделать по подобию sql команда LIMIT - выбрать записи С.. По.. в нашем случае, С 1 по 20, с 21 по 40 и тд |
|||
5
mistеr
01.05.13
✎
02:01
|
В "вэб" наверное есть своя база? Туда и засунуть "очень большую таблицу".
+ репликация по крону. Не пытайтесь научить 1С притворяться веб-сервером. |
|||
6
d3N4eGG
01.05.13
✎
02:02
|
(5) что такое + репликация по крону. ?
|
|||
7
kokamoonga
01.05.13
✎
02:02
|
(0) (2) (4) использовать 1с в качестве бэкенда сайта идея очень и очень сомнительная. сначала стоит подумать об этом и только потом как именно реализовать запросы
|
|||
8
Мизантроп
01.05.13
✎
02:02
|
(5) мистер, ты не в теме. У человека вэб сервис, вся выборка на стороне 1с.
|
|||
9
d3N4eGG
01.05.13
✎
02:03
|
и не понял, зачем записывать таблицу из 1с в базу на вебе?
|
|||
10
kokamoonga
01.05.13
✎
02:04
|
(9) потому что даже sqlite будет в разы быстрее выборки на стороне 1с. не говоря уже о MySql или Postgre.
|
|||
11
d3N4eGG
01.05.13
✎
02:06
|
тогда может посоветуете, как лучше реализовать.
вообще задача была следующая. В системе, есть документ заказ покупателя, к примеру. веб делается для клиентов, чтоб те могли заходить и смотреть состояние их заказов. если делать не через веб-сервисы, то как? |
|||
12
kokamoonga
01.05.13
✎
02:07
|
(11) на мой взгляд правильнее просто подписываться на события и коммитить изменения в базу сайта.
|
|||
13
kokamoonga
01.05.13
✎
02:09
|
(12) + а уж каким образом именно коммитить это как удобно. можно напрямую в базу, можно в движке сайта простенькие API написать
|
|||
14
d3N4eGG
01.05.13
✎
02:12
|
как из веба обращаться к 1ске я научился, а вот как обратно Х_Х
можете по-подробней немножко.. Как напрямую в базу? с помощью каких механизмов это реализуется? средствами 1с или внешние "силы" нужно задействовать? или скажите в какую сторону копать хотя бы |
|||
15
d3N4eGG
01.05.13
✎
02:13
|
или все же есть аналог LIMIT в 1с? :D
|
|||
16
kokamoonga
01.05.13
✎
02:17
|
(15) так а чем (3) не устраивает? ВЫБРАТЬ ПЕРВЫЕ 20 * ИЗ блабла
|
|||
17
kokamoonga
01.05.13
✎
02:18
|
(14) напрямую к MySql v8: 1с как выгрузить данныес табличной части во временную таблицу на mysql сервер
если писать API то общение с сайтом через HttpСоединение() очевидно |
|||
18
d3N4eGG
01.05.13
✎
02:25
|
(16) возьмем в пример мисту, главную страницу. Сначала идет таблица с темами, а внизу идет нумерация страниц
1 2 3 4 5 6 7 8 9 10 ...... на одной странице помещаются 20 тем. когда ты нажимаешь на первую страницу, у тебя отображаются темы с 1 по 20. потом нажимаешь на вторую, темы от 21 по 40. идет смещение от начала, так же и мне надо. ВЫБРАТЬ ПЕРВЫЕ 20 * ИЗ блабла берет просто первые 20 записей, а мне надо ВЫБРАТЬ ПЕРВЫЕ 20 * ИЗ блабла ГДЕ ИндексЭлемента>1 И ИндексЭлемента>21 и тд |
|||
19
d3N4eGG
01.05.13
✎
02:26
|
*ИндексЭлемента<21
|
|||
20
shuhard
01.05.13
✎
02:27
|
(18) нет в 1С пэйджинга и не будет
|
|||
21
kokamoonga
01.05.13
✎
02:30
|
(18) (19) ты сейчас заново переизобретаешь пагинатор:) но собственно в чем проблема?
ВЫБРАТЬ ПЕРВЫЕ 20 * ИЗ блабла ГДЕ блабла.код > &код_последнего_выбранного_элемента это например. но это все равно велосипеды с квадратными колесами ибо 1с не веб-сервер и не бэкенд сайта и никогда ни при каких обстоятельсвах таковым не будет. |
|||
22
shuhard
01.05.13
✎
02:32
|
(21)[ибо 1с не веб-сервер]
да ты чё ? |
|||
23
kokamoonga
01.05.13
✎
02:33
|
(22) есть возражения? или так просто от нечего делать?
|
|||
24
d3N4eGG
01.05.13
✎
02:38
|
(21) код не катит. а если удалим объект?! будет у нас 1, 2, 3, 7, 9, 20. он это и выведет. Надо чтоб именно бралось 20 элементов подряд :@ :D
|
|||
25
kokamoonga
01.05.13
✎
02:41
|
(24) 1,2,3,7,9,20,27
допустим все что между удалено. сортируешь по коду и вот они стоят подряд. допустим последним был выбран элемент с кодом 20. следующий запрос выберет 27 и следующие 20. где-то есть изъян в этой логике? или может я не догоняю суть вопроса? |
|||
26
d3N4eGG
01.05.13
✎
02:48
|
в том, что ты написал, все ок. только вот в данной задаче ПЕРВЫЕ 20 * из блабла не подходит.
мне нужно получать данные по частям в 20 элементов. сначала первые 20 элементов, потом следующие 20 элементов, потом опять 20. цикл, которой в каждой итерации перебирает следующие 20 элементов. только вот как это в запросе указать, что мне сначала надо самые первые 20 записей (ЭТО ОК - ПЕРВЫЕ 20 * тут как раз подходят). А вот потом мне надо следующие 20 (С 21 элемента по 40). и так далее, до конца справочника. |
|||
27
kokamoonga
01.05.13
✎
02:51
|
(26) эээ...
|
|||
28
d3N4eGG
01.05.13
✎
02:51
|
(27) понял? :DD
|
|||
29
kokamoonga
01.05.13
✎
02:52
|
(28) ты мне пытаешься рассказать про срезы которые 1с делать не умеет. я тебе пытаюсь рассказать как притвориться, что 1с их делать умеет.
|
|||
30
d3N4eGG
01.05.13
✎
02:54
|
(29) ну вот этого я и ждал "1с делать не умеет.".
Ладно, спасибо за идею с базой на вебе, будем её реализовывать. Еще раз, спасибо! Всем спокойной ночи |
|||
31
kokamoonga
01.05.13
✎
02:55
|
(26) (28) если ты отсортировал справочник по коду и выбрал 20 первых элементов. следующий запрос с условием "блабла.код > &код_последнего_выбранного_элемента" какие по счету элементы выберет?
|
|||
32
d3N4eGG
01.05.13
✎
02:56
|
(31) ааааа... я только сейчас понял о чем ты. Извиняюсь, голова уже не варит :D спасибо огромное!!!
|
|||
33
kokamoonga
01.05.13
✎
02:57
|
(32) не стоит сильно радоваться. это очень плохое решение особенно если справочник большой.
|
|||
34
d3N4eGG
01.05.13
✎
02:58
|
ну, хотя бы идею понял
|
|||
35
kokamoonga
01.05.13
✎
03:00
|
(10) (33) интересненько, я тут рыжее всех чтоли что к моим двум постам реклама приклеилась?
|
|||
36
France
01.05.13
✎
03:13
|
похоже что так))
|
|||
37
kokamoonga
01.05.13
✎
03:15
|
(36) я не то чтобы возражаю, но все же интересно. где-нить написано вообще про логику появления этих штук?
|
|||
38
France
01.05.13
✎
03:16
|
кажись нет.
|
|||
39
kokamoonga
01.05.13
✎
03:17
|
ок, видимо какие-то специальные секретные алгоритмы
|
|||
40
alexmobile
01.05.13
✎
06:08
|
(0) выгрузи в таблицу значений и бери кусками из нее.
|
|||
41
Туц
01.05.13
✎
06:16
|
(40) вот верное зерно.
(0) отдавать кусками <> получать частями |
|||
42
kokamoonga
01.05.13
✎
06:39
|
(40) (41) а ничо если справочник будет на 100к элементов и полсотни клиентов разом навалятся?
смысл пагинации в том чтобы показать только текущую страницу, а на остальные дать ссылки. на кой хрен тащить туда всю таблицу каждый раз? |
|||
43
alexmobile
01.05.13
✎
07:14
|
(42) ну тогда отдельный реквизит добавить в справочник "номер по порядку" и по заданному диапазону этого реквизита выбирать записи. тока надо следить за его заполнением, при удалении очищать, периодически пересчитывать.
|
|||
44
kokamoonga
01.05.13
✎
07:20
|
(43) какбы почти то же самое я и предложил ТС с той только разницей, что я не предлагаю структуру базы менять. но сразу оговорился, что решение это очень плохое. от замены кода любым другим реквизитом оно лучше не становится.
|
|||
45
mistеr
01.05.13
✎
10:40
|
(39) Движок Мисты вставляет рекламу в те посты, где больше всего смысла. :)
|
|||
46
necro
01.05.13
✎
11:12
|
В SQL нет LIMIT, не надо обобщать
|
|||
47
necro
01.05.13
✎
11:17
|
как насчет выбирать как-то так:
select top 20 * from Справочник.Номенклатура as Номенклатура where Номенклатура.Ссылка не в (select top размерстраницы*номерстраницы Ссылка from Справочник.Номенклатура) ? а по коду нельзя, коды обычно как попало идут, да еще и элементы из групп перетаскивают |
|||
48
alexei366
01.05.13
✎
12:06
|
Вообще надо организовывать как в динамическом списке, на сервер передавать такие параметры как значение первичного ключа таблицы + значения полей сортировки последнего элемента списка, и конеш лимит (ну типа html страница будет говорить скоко ей нужно, а то мало ли экран у пользователя огромный).
И на сервере строить запрос с "Первые 20" к примеру а в условии сначала писать больше по полям сортировки, а если равно больше по полям первичного ключа. Офсета у 1С нет, так как его нет у MSSQL, ну по крайней мере до 2012 сервака. |
|||
49
NcSteel
01.05.13
✎
12:09
|
(0) Берем СКД и не паримся
или через Временные таблицы |
|||
50
yukon
01.05.13
✎
12:18
|
(26) Веб-сервис для такой задачи самое то. Но это не единственный элемент во взаимодействии. У тебя как минимум есть статическая информация - номенклатура, и динамическая - заказы.
Как вариант: На веб-сервере есть отдельная таблица номенклатуры вида: <ГУИД - ссылка на номенклатуру><Код><Наименование> Её тем или иным образом синхронизируешь с 1С. Пользователь на сайте составляет заказ, указывает номенклатуру из таблицы на вэб-сервере. Затем при передаче в 1С вэб-сервер подставляет ГУИД из своей таблицы. |
|||
51
sikuda
01.05.13
✎
12:33
|
(0) У 1С есть динамические списки, но API к ним закрыт :(
(49) А можно поподробнее... А проблема актуальности данных в таком списке достаточно сложна. Лучше делать частное решение для конкретной задачи. И еще не забываем что сама 1С делаем выборки по 20 элементов и там могут быть дырки при быстром изменении таких списков(В книжке Реализация написано). |
|||
52
yukon
01.05.13
✎
12:53
|
(51) У 1С есть динамические списки, но API к ним закрыт
А запросы в SQL посмотреть что мешает? Там обыкновенный "top". > И еще не забываем что сама 1С делаем выборки по 20 элементов Не, ну я понимаю, что переход с 7-ки на 8-ку затянулся, но не настолько же. Выборки через Выбрать(), а не через запрос в многопользовательской системе со включенными RLS - это гарантированный способ найти приключений, да таких, что ограничение в 20 элементов будет мелкой конструктивной особенностью. |
|||
53
МихаилМ
01.05.13
✎
17:07
|
||||
54
vasbur
01.05.13
✎
17:16
|
(0) сделать пакетный запрос:
сначала выбрать первые 100, засунуть во временную таблицу, а потом отсортировать ее в обратном порядке и выбрать первые 20 |
|||
55
kokamoonga
01.05.13
✎
17:24
|
(45) AI мисты шагает по планете?:)
а смотри-ка тема цветет и пахнет. народ с упорством достойным лучшего применения изобретает как из 1с сделать бэкенд сайта, забывая при этом, что запросы 1с в десятки, если не в сотни, раз медленнее реального SQL да еще и прожорливее. Оле народ, даешь 1С:CMS + 1С:HTML-шаблонизатор на web-сервисах 1с с блекджеком и всем таким! |
|||
56
alexei366
01.05.13
✎
17:47
|
(55) В чем же конкретно прожорливост заключается, если не учитывать заменой команд (типа Выбрать на Select) и наименований таблиц и колонок + не использовать в запросе обращение через точку а по факту писать джойны?
|
|||
57
kokamoonga
01.05.13
✎
17:59
|
(56) прожорливость заключается хотя бы в том, что перед выполнением запрос 1с транслируется в SQL. так что джойны и прочие способы оптимизации запросов тут немного сбоку.
|
|||
58
alexei366
01.05.13
✎
18:41
|
(57) "запрос 1с транслируется в SQL", я как понимаю заменой слов, или ты что-то ещё имел ввиду?
|
|||
59
kokamoonga
01.05.13
✎
19:07
|
(58) вот точно, забыл этот технический термин! "заменой слов"
|
|||
60
Ковычки
01.05.13
✎
20:15
|
лимит он как бы в мускуле, или это моя отсталость ?
|
|||
61
kokamoonga
01.05.13
✎
21:13
|
(60) да. в смысле LIMIT в мускуле
|
|||
62
kokamoonga
01.05.13
✎
21:20
|
(61) + в Postgres как бы тоже, но думаю здесь в любом случае речь шла не о нем
|
|||
63
alexei366
02.05.13
✎
00:56
|
(60) У MSSQL не Limit а TOP но смысл тотже
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |