|   |   | 
| 
 | 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 но смысл тотже     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |