Выгрузка в эксель из запроса (более 1кк строк)

1. zhenek1980 05.04.23 14:10 Сейчас в теме
Доброго времени суток, возникла такая задача: необходимо выгрузить из разных конфигураций несколько справочников и загнать их в эксель (для дальнейшей обработки)

Возникла такая проблема до 1 миллиона строк нормально выгружаю следующим образом (для примера):
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	*
               |ИЗ
               |	РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаСальдо, , , ) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("ДатаСальдо",ДатаСальдо);
Выборка= Запрос.Выполнить();
КоличествоОстатков = Выборка.Выбрать().Количество();

Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных  = Новый ОписаниеИсточникаДанных(Выборка);
Построитель.Вывести(ТабДокОстатки);
ТабДокОстатки.Записать(ИмяФайлаОс,ТипФайлаТабличногоДокумента.XLS);
Показать


Проблема начинается когда в запросе более 1 миллиона строк, у экселя запор случается, подскажите как выгрузить запрос в два и более табличных документа или как разделить существующий табличный документ на несколько что бы потом выгрузить в эксель его частями. Или может как то проще можно сделать?
Очень не охота создавать ТабДоки в цикле перебора запроса...
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
14. Said-We 05.04.23 15:54 Сейчас в теме
(1)
(для дальнейшей обработки)


Что значит дальнейшая обработка? Загрузка куда-то?
2. user-z99999 67 05.04.23 15:10 Сейчас в теме
3. user1826630 05.04.23 15:11 Сейчас в теме
Значит Excel - не подходящий вариант. Либо разбивай на порции, либо используй другой формат файла.
5. zhenek1980 05.04.23 15:18 Сейчас в теме
(3) эксель обязателен, как разбивать? есть ли возможность взять скажем 1-999 999 строк и создать новый ТабДок потом взять 1 000 000 - 1 999 999 и создать второй ТабДок, или надо перебирать все строки циклом?
6. user1826630 05.04.23 15:19 Сейчас в теме
(5) Ну если ты умеешь построителем выбирать порциями из источника - то да, возьми.
А если не умеешь - то циклом.
8. zhenek1980 05.04.23 15:21 Сейчас в теме
(6) циклом умею, хочется более быстрый способ
9. user1826630 05.04.23 15:25 Сейчас в теме
(8)
хочется более быстрый способ
"Если нельзя, но очень хочется, - то можно" (С) Народная мудрость.
4. soft_wind 05.04.23 15:17 Сейчас в теме
выгружайте частями по поллимона!
7. zhenek1980 05.04.23 15:20 Сейчас в теме
(4)вот у меня есть выборка с количеством 2 кк как мне ее запихать на 4 табДока? есть ли варианты без перебора всех строк (это долго)
47. Dmitry77 83 05.04.23 17:47 Сейчас в теме
(7) 1 выбрать первые 1000000

2. Перенумеровать строки и но номерам отбор.
48. user1826630 05.04.23 17:48 Сейчас в теме
(47) А как потом выбрать второй миллион?
51. Dmitry77 83 05.04.23 18:48 Сейчас в теме
(48) помещаешь первый в отдельную тз.

Потом выбираешь из источника следующий 1000000 кроме выбранных в первый раз.

Опять в тз. Третья выборка и так пока всё не выбрать.

Ещё можно сделать регистр новый. Записать туда выборку. Добавить поле номер и с отборами по этому полю прям из предприятия выгружать в mxl, а оттуда в Excel
52. user1826630 05.04.23 18:55 Сейчас в теме
(51) Не катит.
Потом выбираешь из источника следующий 1000000 кроме выбранных в первый раз.
Можно узнать, как выбрать "Следующий 1000000" в отдельную таблицу значений?
Или все-таки использовать цикл?
53. sckif 146 05.04.23 20:08 Сейчас в теме
(52) ГДЕ Справочник.Поле НЕ В (Выбрать ТЗ.Поле Из ТЗ)
54. user1826630 05.04.23 20:13 Сейчас в теме
(53) Убил бы. То есть ты выбираешь 4,5М записей из 5М из основной таблицы, исключая те 500К, которые содержатся в неизвестной таблице ТЗ_Х? И сколько таких ТЗ_Х ты в своем запросе сформируешь?
55. sckif 146 05.04.23 20:23 Сейчас в теме
(54) Послушай, пассивно-агрессивный, лично я ничего не выбираю. Вопрос был "как", я и написал вариант. Если не подходит под твои условия, ищи ответ дальше.
56. пользователь 05.04.23 20:26
Сообщение было скрыто модератором.
...
57. user1880116 12.04.23 19:23 Сейчас в теме
(55)
под твои условия
А ему-то это зачем? Ты автору, автору это рассказывай.

А то ворвался тут в середину треда, пердак себе поджечь пытаешся...
10. soft_wind 05.04.23 15:29 Сейчас в теме
добавьте нумерацию строк в запросе (автоунмерация), затем сформируйте несколько запросов и выполните как пакет запросов
11. user1826630 05.04.23 15:34 Сейчас в теме
(10)
затем сформируйте несколько запросов
Сколько?
15. Said-We 05.04.23 15:59 Сейчас в теме
(10)
затем сформируйте несколько запросов

Тогда можно и одним запросом сделать. Кроме нумерации пусть колонка НПП, добавляется вторая колонка с Цел(НПП/100 000). По ней итоги и вперед.
Но в 1С нет нормальной нумерации строк без создания временной таблицы. Поэтому придется всю большую таблицу на лимон и больше строк совать во временную таблицу, только для того, что бы её пронумеровать. Ещё то извращение.
Функции NTILE() в 1С тоже нет.
16. nomad_irk 76 05.04.23 16:12 Сейчас в теме
(15)
Но в 1С нет нормальной нумерации строк без создания временной таблицы

Чёйта? Появилось с 8.3.20, однако:

Выбрать
     Поле1,
     АвтоНомерЗаписи() КАК НомерСтроки
ИЗ
     Таблица


Другой вопрос, что выполнение запроса несколько раз может дать разную нумерацию.....
20. Said-We 05.04.23 16:28 Сейчас в теме
(16)
Другой вопрос, что выполнение запроса несколько раз может дать разную нумерацию.....

Потому-что в 1С не нормальная нумерация. Поэтому и каждый раз по разному.
Что бы каждый раз дать одинаковый результат, то надо добавить "Сортировать ПО", а что бы сортировку можно было указать, необходимо добавить "Выбрать первые 99999...9".
Нормальной нумерации в 1С нет.
Farhat95; +1 Ответить
25. nomad_irk 76 05.04.23 16:36 Сейчас в теме
(20)сортировку можно и по ссылке сделать для таких случаев, либо по комбинации ключевых полей.
31. Said-We 05.04.23 16:43 Сейчас в теме
(25)
(20)сортировку можно и по ссылке сделать для таких случаев, либо по комбинации ключевых полей.

Вопрос не в сортировке, а в ВЫБРАТЬ ПЕРВЫЕ 99999...9. - это не нормальное требование и ограничение от 1С
12. soft_wind 05.04.23 15:44 Сейчас в теме
(11) так элементарно же
всеКоличествоЭлементов / 1 000 000

ну ладно ладно, можно в цикле сделать
13. user1826630 05.04.23 15:53 Сейчас в теме
(12) Ну да, и всю получившуюся таблицу значений из первого запроса ты будешь отправлять в этот пакет из четырех/шести/двадцати запроса в качестве параметра. Я правильно понимаю? То есть ты решил убить SQL сервер и оперативную память сервера для выгрузки ТЗ, вместо того, чтобы пользовать минимум оперативки для выборки?
17. starjevschik 05.04.23 16:15 Сейчас в теме
я б перенес хотя бы часть "дальнейшей обработки" в запрос. Миллионы строк все равно никто разглядывать не будет, очевидно.
18. Said-We 05.04.23 16:22 Сейчас в теме
(1) Поменяй формат промежуточный с Ёкселя, на что-то другое. Самый простой, это json - он и структурирован и короче чем XML.
И работать с json не сложно и достаточно быстро.

Но опять же, всё упирается в "дальнейшую обработку". Где и на чем? Если на стороне какой-то СУБД и загрузка данных из табличного документа, то CSV проще, так как загрузка таких таблиц в СУБД штатная бывает.
user1577718; +1 Ответить
19. soft_wind 05.04.23 16:25 Сейчас в теме
(13) какую всю таблицу?
выборка и из временной таблицы! из менеджера врем.таблиц
21. user1826630 05.04.23 16:29 Сейчас в теме
(19)
затем сформируйте несколько запросов
всеКоличествоЭлементов / 1 000 000
Расскажи нам, как ты сформируешь "несколько запросов в пакете" на основании "всего количества элементов во временной таблице"?
22. Said-We 05.04.23 16:31 Сейчас в теме
(21)
Расскажи нам, как ты сформируешь "несколько запросов в пакете" на основании "всего количества элементов во временной таблице"?

Одним запросом можно - ответ в (15).
Вопрос только - нужно ли запросом разбивать в 1С при таких объемах.
Если не 1С, то такого вопроса не стоит.
24. user1826630 05.04.23 16:35 Сейчас в теме
(22) Там ответ про нумерацию, а не получение результата запроса порционными кусками. В любом случае - предложение из (15) придется обрабатывать обходом результата запроса (циклом). А автор не хочет цикла - он хочет выводить в эксель сразу всю таблицу. Ему надо получить несколько таблиц для вывода в ёксель, а не несколько группировок для обхода (для обхода вообще группировки не нужны, можно просто анализировать счетчик итератора внутри линейного цикла).
35. user1826630 05.04.23 16:53 Сейчас в теме
(19)
из менеджера врем.таблиц
То есть ты настаиваешь на динамическом формировании текста запроса?
23. soft_wind 05.04.23 16:35 Сейчас в теме
(21)
выбрать * из ВремТаб где НомерСтроки между 1 и 999999 ;
выбрать * из ВремТаб где НомерСтроки между 1000000 и 1999999 ;
выбрать * из ВремТаб где НомерСтроки между 2000000 и 2999999 ;

и так далее, это пакет запросов
26. user1826630 05.04.23 16:36 Сейчас в теме
(23) И сколько таких строк ты напишешь? Ты же не знаешь конечного количества строк во ВремТаб!
28. Said-We 05.04.23 16:41 Сейчас в теме
(26) Даже в его случае количество не сложно посчитать: Выбрать sum(1) from ИмяТаблицы.
30. user1826630 05.04.23 16:43 Сейчас в теме
(28) Посчитать не сложно. Но потом надо сформировать пакет из нескольких запросов на основании этой суммы. Или ты предлагаешь сразу наструячить 100500 подзапросов?
32. Said-We 05.04.23 16:45 Сейчас в теме
(30) Не - я вообще такой вариант не предлагаю.
Я предлагаю сначала от автора услышать, что такое обработка данных. На чем она осуществляется и где.
33. user1826630 05.04.23 16:46 Сейчас в теме
(32) Причем тут автор? Мы обсуждаем предложение (10) и (23), а это вовсе не автор...
36. Said-We 05.04.23 16:53 Сейчас в теме
(33) Так я в (18) уже предложил поменять формат с Ёкселя на что-то другое.
То что предлагает (10), сделать можно, но не как он предлагает, и это всё равно извращение.
39. zhenek1980 05.04.23 16:59 Сейчас в теме
(32) обработка данных - программа написанная для аналитики аудиторских проверок (что там как у этих аудиторов я не знаю) но прога берет кучу данных с разных экселек как то их анализирует и выдает нужные данные. я не аудитор и не бухгалтер, моя задача вытащить нужные данные с 1с и отдать аудиторам эти данные в файле экселя (ну либо несколько файлов) вот и все.

На данный момент эти данные выковыриваются вручную, внешнею обработку я накидал и она нормально переносит данные с 1с в эксель но упирается в 1кк строк, я могу сделать обход циклом результат запроса и каждые 1кк строк загонять в ТабДок и выкидывать ТабДок в эксель но это долго, могу напрямую построчно писать в файл экселя но это еще дольше... вот и спросил как сделать данную операцию быстрее
PS я админ а не программист
40. user1826630 05.04.23 17:12 Сейчас в теме
(39)
PS я админ а не программист
Наймите программиста.
44. zhenek1980 05.04.23 17:28 Сейчас в теме
(40)кадровым вопрос я не занимаюсь, эту задачу я взялся решать, так как мне интересно, забить тоже могу.... но это за рамками этой темы
45. user1826630 05.04.23 17:29 Сейчас в теме
(44) Ну и забей. Или займись кадровым вопросом и не отвлекай людей.
Farhat95; +1 Ответить
46. zhenek1980 05.04.23 17:30 Сейчас в теме
(45)можно просто пройти мимо, если по теме нечего сказать, и не вызывать лишнего срача
49. user1826630 05.04.23 17:49 Сейчас в теме
(46) Можно. Но не нужно. Кто-то же должен настраивать ньюбов на путь истинный.
41. Said-We 05.04.23 17:19 Сейчас в теме
(39)
PS я админ а не программист


Если нет программиста, тогда тебе проще топорно примерно как в (10) нарисовал. Заложить на десяток запросов по миллиону и вперед. :-)
Как только будет более 10 миллионов, то работать будет неправильно.
42. user1826630 05.04.23 17:26 Сейчас в теме
(41)
Как только будет более 10 миллионов, то работать будет неправильно.
Тогда уж сразу на миллиард..

На самом деле, правильный ответ - программист БД (SQL) должен создать вьюшки по текущему количеству записей в таблице остатков, а программист 1С - просто подергать эти вьюшки в цикле.
27. Said-We 05.04.23 16:38 Сейчас в теме
(24) Не вижу разницы. Раз файлы разные, то это разные выборки в рамках одного запроса, но разных итогов.
У автора же:
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Выборка);

Какая разница какая это выборка внутри цикла или нет?
29. user1826630 05.04.23 16:41 Сейчас в теме
(27) Где здесь возможность использовать Выборку?
Прикрепленные файлы:
34. user1826630 05.04.23 16:48 Сейчас в теме
(27) И еще. У автора переменная Выборка - это тип "РезультатЗапроса", а не тип "Выборка". (Ну вот не умеет он корректно именовать переменные, что ж).
37. Glagoleva 05.04.23 16:55 Сейчас в теме
Блин xlsx! У экселя 97 ограничения
38. Said-We 05.04.23 16:58 Сейчас в теме
(37) У любого файла есть ограничение по размеру и это ограничение как минимум файловой системы и размера диска. :-)
Ёксель - когда много строк - тупит. Он НЕ сделан для миллионов строк. Этот инструмент совсем для других целей, а его в данной задаче используют как промежуточную таблицу для хранения данных из СУБД.
user1577718; +1 Ответить
43. Said-We 05.04.23 17:28 Сейчас в теме
(42) Ну нет у него программиста и решение данного вопроса (прием или найм программиста) не в его компетенции. Временный костыль - можно, но решать вопрос надо совсем не так.
50. user1826630 05.04.23 17:50 Сейчас в теме
(43) Ну и пусть идет к руководству, у которого есть компетенция в растрате денег... Аудиторская проверка нужна руководству, а не админу.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот