#0
by d3N4eGG
Добрый вечер. Задача следующая: имеется вэб и 1с. В 1с создан веб-сервис, который возвращает на вэб таблицу. Таблица очень большая, и если передавать её сразу всю, то время обработки занимает много времени, иногда даже выскакивает ошибка timeout. для того, чтобы решить данную проблему требуется получать данные не все целиком, а частично. К примеру, у нас справочник, в нем 100 записей, мы получаем количество элементов данного справочника и хотим получать данные с градацией 20 штук. 1..20 21..40 В SQL имеется оператор LIMIT, который выполняет как раз это. Есть ли в 1с что-то подобное или как реализовать данную задачу по-другому?
#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С притворяться веб-сервером.
#7
by kokamoonga
использовать 1с в качестве бэкенда сайта идея очень и очень сомнительная. сначала стоит подумать об этом и только потом как именно реализовать запросы
#10
by kokamoonga
потому что даже sqlite будет в разы быстрее выборки на стороне 1с. не говоря уже о MySql или Postgre.
#11
by d3N4eGG
тогда может посоветуете, как лучше реализовать. вообще задача была следующая. В системе, есть документ заказ покупателя, к примеру. веб делается для клиентов, чтоб те могли заходить и смотреть состояние их заказов. если делать не через веб-сервисы, то как?
#12
by kokamoonga
на мой взгляд правильнее просто подписываться на события и коммитить изменения в базу сайта.
#13
by kokamoonga
+ а уж каким образом именно коммитить это как удобно. можно напрямую в базу, можно в движке сайта простенькие API написать
#14
by d3N4eGG
как из веба обращаться к 1ске я научился, а вот как обратно Х_Х можете по-подробней немножко.. Как напрямую в базу? с помощью каких механизмов это реализуется? средствами 1с или внешние "силы" нужно задействовать? или скажите в какую сторону копать хотя бы
#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 и тд
#21
by kokamoonga
ты сейчас заново переизобретаешь пагинатор:) но собственно в чем проблема? ВЫБРАТЬ ПЕРВЫЕ 20 * ИЗ блабла ГДЕ это например. но это все равно велосипеды с квадратными колесами ибо 1с не веб-сервер и не бэкенд сайта и никогда ни при каких обстоятельсвах таковым не будет.
#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). и так далее, до конца справочника.
#29
by kokamoonga
ты мне пытаешься рассказать про срезы которые 1с делать не умеет. я тебе пытаюсь рассказать как притвориться, что 1с их делать умеет.
#30
by d3N4eGG
ну вот этого я и ждал "1с делать не умеет.". Ладно, спасибо за идею с базой на вебе, будем её реализовывать. Еще раз, спасибо! Всем спокойной ночи
#31
by kokamoonga
если ты отсортировал справочник по коду и выбрал 20 первых элементов. следующий запрос с условием "блабла.код > &код_последнего_выбранного_элемента" какие по счету элементы выберет?
#32
by d3N4eGG
ааааа... я только сейчас понял о чем ты. Извиняюсь, голова уже не варит :D спасибо огромное!!!
#33
by kokamoonga
не стоит сильно радоваться. это очень плохое решение особенно если справочник большой.
#37
by kokamoonga
я не то чтобы возражаю, но все же интересно. где-нить написано вообще про логику появления этих штук?
#42
by kokamoonga
а ничо если справочник будет на 100к элементов и полсотни клиентов разом навалятся? смысл пагинации в том чтобы показать только текущую страницу, а на остальные дать ссылки. на кой хрен тащить туда всю таблицу каждый раз?
#43
by alexmobile
ну тогда отдельный реквизит добавить в справочник "номер по порядку" и по заданному диапазону этого реквизита выбирать записи. тока надо следить за его заполнением, при удалении очищать, периодически пересчитывать.
#44
by kokamoonga
какбы почти то же самое я и предложил ТС с той только разницей, что я не предлагаю структуру базы менять. но сразу оговорился, что решение это очень плохое. от замены кода любым другим реквизитом оно лучше не становится.
#47
by necro
как насчет выбирать как-то так: select top 20 * from Справочник.Номенклатура as Номенклатура where Номенклатура.Ссылка не в (select top размерстраницы*номерстраницы Ссылка from Справочник.Номенклатура) ? а по коду нельзя, коды обычно как попало идут, да еще и элементы из групп перетаскивают
#48
by alexei366
Вообще надо организовывать как в динамическом списке, на сервер передавать такие параметры как значение первичного ключа таблицы + значения полей сортировки последнего элемента списка, и конеш лимит (ну типа html страница будет говорить скоко ей нужно, а то мало ли экран у пользователя огромный). И на сервере строить запрос с "Первые 20" к примеру а в условии сначала писать больше по полям сортировки, а если равно больше по полям первичного ключа. Офсета у 1С нет, так как его нет у MSSQL, ну по крайней мере до 2012 сервака.
#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 элементов будет мелкой конструктивной особенностью.
#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", я как понимаю заменой слов, или ты что-то ещё имел ввиду?
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- 1С + MS SQL Прямой запрос на SQL к журналу расчетов на V 7.7
- Как написать SQL запрос на 1С при обращении к другой SQL базе?
- Один запрос - все ок , два запрос - не получается :(
- 1cv8 SQL: Имя SQL сервера и имя SQL базы данных
- почему не работает SQL запрос (аналит SQL) ?
- Как собрать в запросе товар, аналоги товара и аналоги аналогов?
- Запрос в обработке и запрос в консоли отчетов выдают разные результаты
В этой группе 1С
- Нечеткая печать штрихкода на этикетках!
- v8: Как вывести дерево значений на управляемую форму?
- v7: Выделение строки таблицы значений
- Отчет реестр спецификаций УПП
- Отбор СКД на форме
- Выгрузка Бухгалтерской справки в ОперацияБух (КД 2.0 Из БП 7.7 в БП 8.2)
- v8: 1C 8.2. почему регистр не видит значение субконто?
- Преобразовать строку в число Запрос 1С
- Ошибка в типовой УПП?
- ЗУП НДФЛ при увеличении уставного капитала
- УФ. Представление реквизита типа булево картинкой на форме.
- БСП. Можно ли использователь некоторые функции в своей не коммерческой конфе?
- не считывается штрихкод
- Фоновое задание не видит глТекущийПользователь
- как проверить реквизит булево
- как подсчитать в запросе количество документов
- Не растягиваются по горизонтали элементы формы
- прелоудинг для обработки
- Не удалось заблокировать таблицу '_SYSTEMSETTINGS'
- индекс находится за границами массива