Имя: Пароль:
1C
1С v8
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 но смысл тотже