Имя: Пароль:
1C
1C 7.7
v7: 1c++: Порционное получение результата запроса
,
0 Franchiser
 
гуру
30.08.17
12:06
В результате более миллиона строк, как можно получить результат запроса порциями по 50000 с ссылками на объекты 1с?
1 Ёпрст
 
30.08.17
12:10
обходить через рекорсет
2 МихаилМ
 
30.08.17
12:12
выгрузить в вт

из вт читать порциями
3 Franchiser
 
гуру
30.08.17
12:14
(1) при обходи через рекордсет если появляется ссылка то появляется ошибка "1C++: Connection is busy with results for another hstmt"
как я понял это из-за того, что в процессе фетча идет дополнительные запросы к базе.
4 Ёпрст
 
30.08.17
12:16
(3) Там всего лишь нужно Открыть() + пока ВыборкаОткрыта +След
5 Ёпрст
 
30.08.17
12:16
так делаешь хоть ?
6 Franchiser
 
гуру
30.08.17
12:19
(4) да именно так
Но если есть в запросе айдишники которые должны быть преобразованы в ссылки, то идет ошибка на этапе добавления строк в ТЗ или по Сообщить(). Пробовал и в запросе описывать типизацию и после запроса исползьовать объект MetaDataWorks.
На других форумах пишут есть 2 варианта:
1. Дофетчить выборку
2. Включить MARS на сервере.

Как можно сделать не прибегая ко 2-му варианту?
7 Franchiser
 
гуру
30.08.17
12:22
У меня идея следующая: минуя ТЗ вывести результат сразу в табличный документ (вроде как там может быть больше строк чем в ТЗ), но я на текущий момент не могу показать ссылки.
8 Ёпрст
 
30.08.17
12:24
(7) не угадал. Моксель жрёт еще больше памяти, чем тз.
В ИТЗ не пробовал сразу выгружать ?
9 Ёпрст
 
30.08.17
12:25
или, в дбф/xls, например ?
10 Franchiser
 
гуру
30.08.17
12:26
Нет, не пробовал. В крайнем случае на 10 документов разбить (не знаю будут ли они все в оперативной памяти сразу).
Мне потом еще по этим данным нужно делать корректирующие документы.
11 Franchiser
 
гуру
30.08.17
12:27
ТЗ валит программу примерно уже на 400000
12 Franchiser
 
гуру
30.08.17
12:29
как выгрузить в ИТЗ из SQL?
13 Ёпрст
 
30.08.17
12:31
(12) ВыполнитьИнструкцию же..там в параметр передаешь ИТЗ
14 Franchiser
 
гуру
30.08.17
12:31
Есть разница в использовании памяти ИТЗ и ТЗ?
15 Ёпрст
 
30.08.17
12:31
16 Ёпрст
 
30.08.17
12:32
(14) есть, итз, по-крайней мере, оптимизировали
17 Ёпрст
 
30.08.17
12:32
и это, попытка не пытка :)
18 Franchiser
 
гуру
30.08.17
12:32
ИТЗ на форму можно положить?
19 Ёпрст
 
30.08.17
12:33
если не поможет, то (2)
20 Ёпрст
 
30.08.17
12:33
(18) да. табличное поле же есть.
Можешь, и свой запрос поставщиком сделать..
21 Franchiser
 
гуру
30.08.17
12:34
(19) Да я думал сделать поле identity и читать из ВТ 10-ю запросами
22 Franchiser
 
гуру
30.08.17
12:34
"Можешь, и свой запрос поставщиком сделать.." не понял
23 Ёпрст
 
30.08.17
12:36
(22) поставщиком данных для табличного поля на форме.
Тебе этот результат в миллионы строк.. зачем вообще ?
24 Franchiser
 
гуру
30.08.17
12:37
1. Пользователь запросил такой отчет
2. Потом по нему нужно создать корректирующие документы.

Я получаю около 700000 строк из oracle закидываю в sql, сравниваю и получаю расхождения которые требуется откорректировать.
25 Franchiser
 
гуру
30.08.17
12:38
(23) есть где то пример как привязать табличное поле к индексированной таблице, сделать поставщиком и тд?
26 Ёпрст
 
30.08.17
12:51
(25)
Процедура ПослеСозданияФормы()
    
    _Форма = СоздатьОбъект("Форма");
    _Форма.УстановитьФорму(Форма);
    ТП = _Форма.СоздатьЭлементУправления("ТабличноеПоле", "ТП");
    Колонка = ТП.Колонки.Добавить("Контрагент");
    Колонка.Заголовок = "Контрагент";
    Колонка.Данные = "Контрагент";
    ТП.ПоставщикДанных = СоздатьОбъект("ПоставщикДанныхТЗ");
    ТЗ = СоздатьОбъект("ИндексированнаяТаблица");
    ТЗ.НоваяКолонка("Контрагент");
    ТП.ПоставщикДанных.ТаблицаЗначений = ТЗ;
    
КонецПроцедуры
27 Franchiser
 
гуру
30.08.17
12:53
Проверил с использованием индексированной таблицы:
ошибка "Error: Cannot allocate memory"
28 Franchiser
 
гуру
30.08.17
13:00
ПослеСозданияФормы() это  предопределенная процедура?
Почему не попадает в отладчике ни в ПослеСозданияФормы() ни в ПослеОткрытия()
29 Franchiser
 
гуру
30.08.17
13:01
На форму нужно закидывать табличное поле?
30 Ёпрст
 
30.08.17
13:03
(27) тогда , только несколько запросов лепить
31 Ёпрст
 
30.08.17
13:04
(29) кнопку или текст с идентификатором ТП
32 Franchiser
 
гуру
30.08.17
13:05
Это код для formex?
33 Ёпрст
 
30.08.17
13:05
(28) да. Должен быть загружен 1cpp перед этим.
Только не помню, чьё событие, возможно, формекса. Тогда и его загрузи
34 Ёпрст
 
30.08.17
13:05
(32) итд и табл поле - это всё 1cpp
35 Ёпрст
 
30.08.17
13:06
*ИТЗ
36 Franchiser
 
гуру
30.08.17
13:11
Ошибка "Неудачная попытка создания ЭУ 'ТабличноеПоле'."
37 Franchiser
 
гуру
30.08.17
13:13
С кнопкой прокатило)
38 toypaul
 
гуру
30.08.17
13:38
не знаю как в 1С++ в ToySQL пока не обращаешься к реквизитам выборки через точки никаких доп запросов не делается. если нужны такие запросы, то выборка идет через доп. соединение, а все запрос от 1С через собственное. и все чики-пуки.
39 toypaul
 
гуру
30.08.17
13:42
если пользователь запросил отчет, то значит нужен вывод в таб документ. не знаю что будет с ним при 700 тыр строк, но можно в самой выборке разбивать таб док на части, сохранять его и потом показывать по частям.
40 АЛьФ
 
30.08.17
14:12
Хрм... И сколько понадобится пользователю времени, чтобы хотя бы просмотреть такой объем данных? Подозреваю, что их не нужно выводить, надо сразу по ним некие действия производить. А тогда можно тупо ставить ТОР 10. И в цикле запрос крутить, по десятку обрабатывая (это если отработанные потом в запрос не попадают).
41 Franchiser
 
гуру
30.08.17
17:21
(41) Ну понятно что пользователю такой объем может и не к чему, но почему не реализовано работа с обходом результата запороса с проставлением ссылок через доп. соединение в 1с++?
Раньше никто не получал ссылки с обходом выборки без использования выгрузки в ТЗ?
42 Franchiser
 
гуру
30.08.17
17:26
еще нашел косяк в 1С++:
Если я помещаю внешние данные в 1 ВТ в SQL методомВыполнитьSQLИЗТЗ(), например по 50000 и строк не кратно 50000 (к примеру, 230000), то будет передано 230000, а 250000. Последние 20000 будут добиты.
Обход ошибки: при передачи хвоста (30000) нужно заново подготовить запрос и отправлять результат на сервер.
43 Ёпрст
 
30.08.17
17:28
(42) не делай sqlизТз, делай тупо insert
44 Sserj
 
30.08.17
17:48
(0) Ну вообще то можно просто и получать данные из запроса порциями

select top 50000
....


что то поделал, когда надо следующие

select top 50000

where
  key > ПоследнийКлючПредыдущегоЗапроса.
45 Franchiser
 
гуру
30.08.17
18:30
(44) для этого нужные уникальные (неповторяющиеся) ключи.
46 Franchiser
 
гуру
30.08.17
18:31
у меня запрос с конструкцией With RollUP
47 Sserj
 
30.08.17
21:18
(45) Дэк ты запрос не забирай сразу. Создай временную таблицу в скуле с ключом. Запрос свой туда инсертом впихай и из нее уже бери потихоньку.
48 Franchiser
 
гуру
31.08.17
00:31
(47) ок, так и реализовал
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.