Имя: Пароль:
1C
 
Почему может не работать конструкция Запрос.Выполнить()..Выгрузить() ?
,
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) таблица значений ест оперативную память, а выборка нет
Программист всегда исправляет последнюю ошибку.