Выгрузка в эксель из запроса (более 1кк строк)
Доброго времени суток, возникла такая задача: необходимо выгрузить из разных конфигураций несколько справочников и загнать их в эксель (для дальнейшей обработки)
Возникла такая проблема до 1 миллиона строк нормально выгружаю следующим образом (для примера):
Проблема начинается когда в запросе более 1 миллиона строк, у экселя запор случается, подскажите как выгрузить запрос в два и более табличных документа или как разделить существующий табличный документ на несколько что бы потом выгрузить в эксель его частями. Или может как то проще можно сделать?
Очень не охота создавать ТабДоки в цикле перебора запроса...
Возникла такая проблема до 1 миллиона строк нормально выгружаю следующим образом (для примера):
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| *
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаСальдо, , , ) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("ДатаСальдо",ДатаСальдо);
Выборка= Запрос.Выполнить();
КоличествоОстатков = Выборка.Выбрать().Количество();
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Выборка);
Построитель.Вывести(ТабДокОстатки);
ТабДокОстатки.Записать(ИмяФайлаОс,ТипФайлаТабличногоДокумента.XLS);
ПоказатьПроблема начинается когда в запросе более 1 миллиона строк, у экселя запор случается, подскажите как выгрузить запрос в два и более табличных документа или как разделить существующий табличный документ на несколько что бы потом выгрузить в эксель его частями. Или может как то проще можно сделать?
Очень не охота создавать ТабДоки в цикле перебора запроса...
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(48) помещаешь первый в отдельную тз.
Потом выбираешь из источника следующий 1000000 кроме выбранных в первый раз.
Опять в тз. Третья выборка и так пока всё не выбрать.
Ещё можно сделать регистр новый. Записать туда выборку. Добавить поле номер и с отборами по этому полю прям из предприятия выгружать в mxl, а оттуда в Excel
Потом выбираешь из источника следующий 1000000 кроме выбранных в первый раз.
Опять в тз. Третья выборка и так пока всё не выбрать.
Ещё можно сделать регистр новый. Записать туда выборку. Добавить поле номер и с отборами по этому полю прям из предприятия выгружать в mxl, а оттуда в Excel
(10)
Тогда можно и одним запросом сделать. Кроме нумерации пусть колонка НПП, добавляется вторая колонка с Цел(НПП/100 000). По ней итоги и вперед.
Но в 1С нет нормальной нумерации строк без создания временной таблицы. Поэтому придется всю большую таблицу на лимон и больше строк совать во временную таблицу, только для того, что бы её пронумеровать. Ещё то извращение.
Функции NTILE() в 1С тоже нет.
затем сформируйте несколько запросов
Тогда можно и одним запросом сделать. Кроме нумерации пусть колонка НПП, добавляется вторая колонка с Цел(НПП/100 000). По ней итоги и вперед.
Но в 1С нет нормальной нумерации строк без создания временной таблицы. Поэтому придется всю большую таблицу на лимон и больше строк совать во временную таблицу, только для того, что бы её пронумеровать. Ещё то извращение.
Функции NTILE() в 1С тоже нет.
(16)
Потому-что в 1С не нормальная нумерация. Поэтому и каждый раз по разному.
Что бы каждый раз дать одинаковый результат, то надо добавить "Сортировать ПО", а что бы сортировку можно было указать, необходимо добавить "Выбрать первые 99999...9".
Нормальной нумерации в 1С нет.
Другой вопрос, что выполнение запроса несколько раз может дать разную нумерацию.....
Потому-что в 1С не нормальная нумерация. Поэтому и каждый раз по разному.
Что бы каждый раз дать одинаковый результат, то надо добавить "Сортировать ПО", а что бы сортировку можно было указать, необходимо добавить "Выбрать первые 99999...9".
Нормальной нумерации в 1С нет.
(12) Ну да, и всю получившуюся таблицу значений из первого запроса ты будешь отправлять в этот пакет из четырех/шести/двадцати запроса в качестве параметра. Я правильно понимаю? То есть ты решил убить SQL сервер и оперативную память сервера для выгрузки ТЗ, вместо того, чтобы пользовать минимум оперативки для выборки?
(1) Поменяй формат промежуточный с Ёкселя, на что-то другое. Самый простой, это json - он и структурирован и короче чем XML.
И работать с json не сложно и достаточно быстро.
Но опять же, всё упирается в "дальнейшую обработку". Где и на чем? Если на стороне какой-то СУБД и загрузка данных из табличного документа, то CSV проще, так как загрузка таких таблиц в СУБД штатная бывает.
И работать с json не сложно и достаточно быстро.
Но опять же, всё упирается в "дальнейшую обработку". Где и на чем? Если на стороне какой-то СУБД и загрузка данных из табличного документа, то CSV проще, так как загрузка таких таблиц в СУБД штатная бывает.
(21)
Одним запросом можно - ответ в (15).
Вопрос только - нужно ли запросом разбивать в 1С при таких объемах.
Если не 1С, то такого вопроса не стоит.
Расскажи нам, как ты сформируешь "несколько запросов в пакете" на основании "всего количества элементов во временной таблице"?
Одним запросом можно - ответ в (15).
Вопрос только - нужно ли запросом разбивать в 1С при таких объемах.
Если не 1С, то такого вопроса не стоит.
(22) Там ответ про нумерацию, а не получение результата запроса порционными кусками. В любом случае - предложение из (15) придется обрабатывать обходом результата запроса (циклом). А автор не хочет цикла - он хочет выводить в эксель сразу всю таблицу. Ему надо получить несколько таблиц для вывода в ёксель, а не несколько группировок для обхода (для обхода вообще группировки не нужны, можно просто анализировать счетчик итератора внутри линейного цикла).
(32) обработка данных - программа написанная для аналитики аудиторских проверок (что там как у этих аудиторов я не знаю) но прога берет кучу данных с разных экселек как то их анализирует и выдает нужные данные. я не аудитор и не бухгалтер, моя задача вытащить нужные данные с 1с и отдать аудиторам эти данные в файле экселя (ну либо несколько файлов) вот и все.
На данный момент эти данные выковыриваются вручную, внешнею обработку я накидал и она нормально переносит данные с 1с в эксель но упирается в 1кк строк, я могу сделать обход циклом результат запроса и каждые 1кк строк загонять в ТабДок и выкидывать ТабДок в эксель но это долго, могу напрямую построчно писать в файл экселя но это еще дольше... вот и спросил как сделать данную операцию быстрее
PS я админ а не программист
На данный момент эти данные выковыриваются вручную, внешнею обработку я накидал и она нормально переносит данные с 1с в эксель но упирается в 1кк строк, я могу сделать обход циклом результат запроса и каждые 1кк строк загонять в ТабДок и выкидывать ТабДок в эксель но это долго, могу напрямую построчно писать в файл экселя но это еще дольше... вот и спросил как сделать данную операцию быстрее
PS я админ а не программист
(41)
На самом деле, правильный ответ - программист БД (SQL) должен создать вьюшки по текущему количеству записей в таблице остатков, а программист 1С - просто подергать эти вьюшки в цикле.
Как только будет более 10 миллионов, то работать будет неправильно.
Тогда уж сразу на миллиард..
На самом деле, правильный ответ - программист БД (SQL) должен создать вьюшки по текущему количеству записей в таблице остатков, а программист 1С - просто подергать эти вьюшки в цикле.
(37) У любого файла есть ограничение по размеру и это ограничение как минимум файловой системы и размера диска. :-)
Ёксель - когда много строк - тупит. Он НЕ сделан для миллионов строк. Этот инструмент совсем для других целей, а его в данной задаче используют как промежуточную таблицу для хранения данных из СУБД.
Ёксель - когда много строк - тупит. Он НЕ сделан для миллионов строк. Этот инструмент совсем для других целей, а его в данной задаче используют как промежуточную таблицу для хранения данных из СУБД.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот