1С ЗАПРОС, Аналог LIMIT в SQL #663500


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

В этой группе 1С