|
Почему может не работать конструкция Запрос.Выполнить()..Выгрузить() ? | ☑ | ||
---|---|---|---|---|
0
ignorant
15.02.19
✎
15:36
|
Есть примитивный запрос, который _точно_ возвращает результат:
Результат = Запрос.Выполнить(); Результат.Пустой() = Ложь Выборку по результату можно перебрать и увидеть отладчиком : Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл а= Выборка [0]; КонецЦикла; Метод Выгрузить() возвращает ПУСТУЮ таблицу значений, даже без колонок. Первый раз такое вижу. Пробовал на разных ИБ и разных компах. Куда посоветуете посмотреть? Спасибо за внимание. ПС. Платформа 8.3.11.3133, клиент-сервер |
|||
1
ДенисЧ
15.02.19
✎
15:39
|
Запрос под грифом три нуля?
|
|||
2
palsergeich
15.02.19
✎
15:39
|
Код рабочий и не рабочий целиком плз
|
|||
3
Ластик
15.02.19
✎
15:41
|
Выборка.Владелец().Выгрузить() что возвращает
|
|||
4
Chameleon1980
15.02.19
✎
15:41
|
:)
|
|||
5
Chameleon1980
15.02.19
✎
15:41
|
Тссс. тс пишет
|
|||
6
ignorant
15.02.19
✎
15:44
|
текст запроса
ВЫБРАТЬ РАЗЛИЧНЫЕ ОстаткиТоваровКомпанииОстатки.Номенклатура, ОстаткиТоваровКомпанииОстатки.СкладКомпании, ОстаткиТоваровКомпанииОстатки.КоличествоОстаток ИЗ РегистрНакопления.ОстаткиТоваровКомпании.Остатки( , ) КАК ОстаткиТоваровКомпанииОстатки |
|||
7
novichok79
15.02.19
✎
15:45
|
может быть итоги на регистр не пересчитаны? ну это чисто предположение.
|
|||
8
novichok79
15.02.19
✎
15:46
|
в хохлостане кажись забанили 1С, нарушаете закон.
|
|||
9
Ёпрст
15.02.19
✎
15:46
|
(6) больше кода.
|
|||
10
Buster007
15.02.19
✎
15:47
|
а РАЗЛИЧНЫЕ зачем?)
|
|||
11
Ёпрст
15.02.19
✎
15:47
|
Любой запрос, даже если ничего нет, вернёт тз с полями.
Автор утверждает, что полей нет. Видать, временную табличку в запросе создаёт |
|||
12
novichok79
15.02.19
✎
15:47
|
и да, может быть в запросе присутствует WHERE?
|
|||
13
OldCondom
15.02.19
✎
15:48
|
Вчера была тема ЭтаФорма.ТолькоПросмотр (не блокирует ТЧ)
Автор писал, что у них еще 3 разраба. Один нашелся. Вкратце: у меня все правильно! Проверять не буду, отладчиком не буду, скринов не будет. Предлагайте решение. |
|||
14
ДенисЧ
15.02.19
✎
15:48
|
(12) поля всё равно были бы
|
|||
15
ZDenis
15.02.19
✎
15:49
|
(0) Пустую в отладчике? Если там, то надо подождать некоторое время после того как нажали на кнопку
|
|||
16
ignorant
15.02.19
✎
15:49
|
(9)
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ОстаткиТоваровКомпанииОстатки.Номенклатура, ОстаткиТоваровКомпанииОстатки.СкладКомпании, ОстаткиТоваровКомпанииОстатки.КоличествоОстаток ИЗ РегистрНакопления.ОстаткиТоваровКомпании.Остатки( , ) КАК ОстаткиТоваровКомпанииОстатки"; Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Сообщить (" Нет товаров на учете ?!!!"); Возврат; Иначе ТЗ = Результат.Выгрузить(); КонецЕсли; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл а= Выборка [0]; КонецЦикла; так легче ? |
|||
17
semiluki
15.02.19
✎
15:50
|
А может просто ТЗ очень большая? Просто визуально в отладчике не видно? Что вернет Выборка.Владелец().Выгрузить().Количество()
|
|||
18
ignorant
15.02.19
✎
15:51
|
(17)
Выборка.Владелец().Выгрузить().Количество() = 4908 |
|||
19
OldCondom
15.02.19
✎
15:51
|
А, кстати, если ТЗ проверять именно в отладчике, у меня тоже иногда глючит и не отрисовывает данные.
|
|||
20
Ластик
15.02.19
✎
15:52
|
(17) +1
|
|||
21
OldCondom
15.02.19
✎
15:52
|
Автор, ты бы так и писал, таблица в отладчике не видно, код же отрабатывает и обходит таблицу. Или не так?
|
|||
22
Buster007
15.02.19
✎
15:52
|
(19) такая фишка появилась относительно недавно. Раньше конфигуратор зависал, а теперь в фоне подгружаются
|
|||
23
OldCondom
15.02.19
✎
15:53
|
(22) точно, если подождать, отрисовка идет.
|
|||
24
kennetmccormick
15.02.19
✎
15:54
|
Да с ТЗ проблема есть такая. Ждать приходится. Первый раз когда столкнулся тоже не мог понять почему не работает
|
|||
25
ignorant
15.02.19
✎
15:55
|
(21)
да, я плохо спросил. в ОТЛАДЧИКЕ не видно. |
|||
26
Вафель
15.02.19
✎
15:56
|
1совцы как обычно, сделали, но на половину. Не могли уж гифку загрузки прикрутить
|
|||
27
ZDenis
15.02.19
✎
15:58
|
(26) да уж лучше бы подвисало как раньше, все равно оно поверх всех окон и ничего другого не поделаешь.
|
|||
28
ignorant
15.02.19
✎
15:59
|
Похоже, фича платформы.
При многократном вызове в ОТЛАДЧИКЕ Результат.Выгрузить() ТЗ отрисовывает быстрее, кэш включается. Спасибо! Сберегли мой мосх ;) |
|||
29
Tonik992
15.02.19
✎
16:00
|
(17) Есть такое дело, у меня такое же бывало...
|
|||
30
Puzoter
15.02.19
✎
16:14
|
(0) Вообще-то использование Выполнить().Выгрузить() это моветон. Лучше делать все вычисления прямо в запросе и пользоваться перебором записей.
|
|||
31
Вафель
15.02.19
✎
16:18
|
(30) никакой разницы нет.
|
|||
32
ignorant
15.02.19
✎
16:24
|
(30) и поиск вроде такого
МассивСтрок = НайтиСтроки ( Новый Структура ( "Раздел, Точка, Оборудование", Раздел, Точка, Модель ); делать по результату запроса ? ;) |
|||
33
Ёпрст
15.02.19
✎
16:25
|
(32) да, почему бы и нет ?
|
|||
34
Puzoter
15.02.19
✎
16:25
|
(31) Разница в том, что при выгрузке выборка дублируется в оперативной памяти, при переборе записей этого скорее всего удастся избежать.
|
|||
35
Ёпрст
15.02.19
✎
16:26
|
НайтиСледующий, если что
|
|||
36
Puzoter
15.02.19
✎
16:27
|
(32) Можешь объяснить, зачем тебе нужна выгрузка в таблицу значений?
|
|||
37
Вафель
15.02.19
✎
16:27
|
выборка таблица особой разницы не дают.
ну только что слишком большая выборка сбрасывается в файл для экономи памяти |
|||
38
Puzoter
15.02.19
✎
16:29
|
(37)ИТС прямо рекомендует.
|
|||
39
Вафель
15.02.19
✎
16:31
|
(38) ИТС рекомендует партионно данные обрабатывать. типо по 1000 элементов
|
|||
40
ptiz
15.02.19
✎
16:32
|
(36) Иногда так код короче и читабельнее, а это бывает важно.
|
|||
41
Puzoter
15.02.19
✎
16:36
|
(40) Только если ты на 100% уверен, что эта выгрузка не подвесит базу когда она разрастется.
|
|||
42
ignorant
15.02.19
✎
16:38
|
(36) попробую кратко
В ТЗ ищу строки, отвечающие некоторым условиям и _удаляю_ их. оставшиеся строки - сырьё для инфо юзеру или дальнейшей обработки. Делать такое _запросом_ для меня затруднительно и непродуктивно |
|||
43
Вафель
15.02.19
✎
16:39
|
кстати на x64 на диск не сбрасывается, поэтому по памяти выбрать и выгрузить равны
https://its.1c.ru/db/v8std#content:2149184374:hdoc |
|||
44
VladZ
15.02.19
✎
16:48
|
1. Все, что можно получить запросом - нужно получить запросом.
2. Если полученная выборка небольшая - можно использовать Выполнить().Выгрузить(). С ТЗ удобнее работать в плане "Загрузить" и удобнее отлаживать. 3. Во всех остальных случаях - Выполнить() и Выборка = Результат.Выбрать(); |
|||
45
Puzoter
15.02.19
✎
16:50
|
(42) (44) Прав. Лучше Вам сконцентрировать усилия в этом направлении.
|
|||
46
VladZ
15.02.19
✎
16:55
|
Подход в стиле: "В ТЗ ищу строки, отвечающие некоторым условиям и _удаляю_ их. оставшиеся строки - сырьё для инфо юзеру или дальнейшей обработки." - это полная хрень. Не стоит плодить такие решения. Иначе в конце концов "идеальная и божественная конфигурация" превратится в кусок "непонятной коричневой субстанции"...
|
|||
47
Вафель
15.02.19
✎
16:55
|
ничуть не хуже чем запрос на пару тыщ строк
|
|||
48
ДенисЧ
15.02.19
✎
16:58
|
(46) А что, субстанция с запросом на 50 страниц пахнет шоколадом и ванилью?
|
|||
49
Вафель
15.02.19
✎
17:00
|
(48) зато никаких циклов
|
|||
50
VladZ
15.02.19
✎
17:00
|
(48) Запрос на 50 страниц - это показатель кривой архитектуры.
|
|||
51
VladZ
15.02.19
✎
17:01
|
+50 Пахнет тоже не очень.
|
|||
52
VladZ
15.02.19
✎
17:02
|
(42) Опиши, хотя бы коротко, что у тебя за условия. И почему их нельзя в запросе использовать.
|
|||
53
ignorant
15.02.19
✎
17:16
|
(52)
Конктерно сейчас у меня есть: ТЗ - результат запроса vs некая таблица Excel. По значению ячеек _некоторых_ (не всех!) строк Excel ищу соответствующий строки в ТЗ и удаляю их. Но в принципе, это мои тараканы, тема не про это, мы _сильно_ отклонились ;) |
|||
54
H A D G E H O G s
15.02.19
✎
17:19
|
(0) Смотришь отладчиком, ТЗ пустая, но нет, она просто большая и выводиться асинхронно.
Welcome to the club, men! |
|||
55
Eiffil123
15.02.19
✎
17:30
|
(50) казалось бы, причем тут зуп.
|
|||
56
FIXXXL
15.02.19
✎
17:31
|
(55) поэтому скромные разрабы типовых собирают их по кусочкам :)
|
|||
57
los_hooliganos
15.02.19
✎
17:47
|
(23) Надо закрыть отрисовку тз по "невидимой" кнопке и снова открыть.
|
|||
58
los_hooliganos
15.02.19
✎
17:52
|
(43) Это бред.
Если ты напишешь клиента на ООП, то поймешь что Выбрать() выгоднее чем Выгрузить(). Например java работает с ms sql Класса RecordSet достаточно для Выбрать(). Для Выгрузить() придется привлекать еще класс Map. Значит памяти уйдет в 2 раза больше. |
|||
59
Вафель
15.02.19
✎
17:55
|
(58) не знаю как на жаве, но на 1с одинаково
|
|||
60
Вафель
15.02.19
✎
17:56
|
в 1с есть класс РезультатвЗапроса.
его можно как выгрузить, так и выборку открыть. Оба действия полностью загружаются в память |
|||
61
los_hooliganos
15.02.19
✎
18:01
|
(60) Чтобы выгрузить, тебе надо открыть выборку и обойти её.
Т.е. когда делает выгрузить, создается таблица значений, потом Выбрать(), Следущий и идет запись в таблицу значений. Но можно этого не делать а просто обойти выборку самому. Ресурсов уйдет меньше, а не одинаково. Там внутри с++ никакой умной уникальной выгрузки нету. |
|||
62
Вафель
15.02.19
✎
18:03
|
(61) что такое выборка по твоему? где она хранится?
|
|||
63
Вафель
15.02.19
✎
18:10
|
Лично я не уверен что выборка - это порт RecordSet'a.
Иначе откуда всякие группировки и тд и тп? |
|||
64
hhhh
15.02.19
✎
18:14
|
объясните
Пока Выборка.Следующий() Цикл а= Выборка [0]; КонецЦикла; что такое здесь Выборка[0] ?? И почему она должна быть непустая? |
|||
65
ignorant
15.02.19
✎
18:21
|
(64)
Выборка [0] - это значение 1-го поля выборки. смысла - никакого, не пытайтесь его искать ;) просто иллюстрация того, что поле непустое. |
|||
66
los_hooliganos
15.02.19
✎
18:24
|
(63) РекордСет это обертка вокруг курсора sql
Курсор может и по группировкам пойти |
|||
67
H A D G E H O G s
16.02.19
✎
00:13
|
(66) Гуманитарии способны только трендеть про угнетающее их правительство, но не способны даже замер провести
10000 записей, 245 Кб на запись (текст в поле) Выборка 4 465048 Кб, 11 секунд ТаблицаЗначений 4 469572 Кб, 16 секунд Лишние несколько МБ тупо из за служебных данных в таблице. |
|||
68
etc
16.02.19
✎
01:38
|
Загляните по ссылке в (43) https://its.1c.ru/db/v8std#content:2149184374:hdoc
Там написано что даже при Выбрать() ".. и в этом случае при выполнении запроса его результат будет СНАЧАЛА считан в память целиком". Знатоки, это случаем не client side cursor? |
|||
69
Провинциальный 1сник
16.02.19
✎
05:25
|
(67) (68) Тоже думал, что в случае выборки используется построчное чтение курсора sql. Действительно, получается что выгрузка и выборка одного порядка по расходу памяти. Тогда лучше вообще с выборкой не связываться, а пользоваться более удобной выгрузкой в таблицу значений..
|
|||
70
Franchiser
гуру
16.02.19
✎
11:43
|
Если вопрос про отладку, то теперь в новых платформах приходится иногда ждать по несколько минут пока появится ТЗ
|
|||
71
Franchiser
гуру
16.02.19
✎
11:47
|
(69) т.к. выборка сериализуется, а следовательно не можно передать, например, в другое фоновое задание, то она не использует курсор sql
|
|||
72
ДенисЧ
16.02.19
✎
11:48
|
Мне тут когда-то подсказали, что 1с ушла от курсоров ещё в 8.1
|
|||
73
Franchiser
гуру
16.02.19
✎
11:49
|
(69) таблица значений ест оперативную память, а выборка нет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |