Выгрузка таблицы значений в Excel

28.06.15

Интеграция - Загрузка и выгрузка в Excel

Примитивно, грубо, без дизайна, но очень быстро.

Честно говоря, это не столько публикация, сколько антисклерозник для меня самого. Вот как Трактор делает - собрал свои наработки, укомпоновал и выложил, удобно отовсюду доставать. А поскольку я этот блок свой уже пару раз про...любил и заново написал, то во избежание - пусть будет таким образом. Как говорится, "в копипасте - щастье".

 

// Внимание! Исходная таблица тДанных должна содержать только данные простых типов!!!
Процедура БыстроВывестиТаблицуЗначенийВExcel(тДанных,рПутьИмяФайла,рОткрыватьДляПросмотра=Ложь) Экспорт
Попытка
    Если
тДанных.Количество()=0 Или ПустаяСтрока(рПутьИмяФайла) Тогда Возврат КонецЕсли;

   
// если таблица для экселя спецслужебная, то выводим в двумерный массив, и теперь уже знаем его размеры
   
квоКолонокДЭ=тДанных.Колонки.Количество();
   
квоСтрокДЭ=тДанных.Количество()+1; // припуск на заголовок
   
РезДокумент=Новый Массив(квоКолонокДЭ,квоСтрокДЭ);

   
// заголовки
   
мКолонокДат=Новый Массив;
    Для
итерКолонок=1 По квоКолонокДЭ Цикл
       
кол=тДанных.Колонки[итерКолонок-1];
       
РезДокумент[итерКолонок-1][0]=кол.Заголовок;
        Если
кол.ТипЗначения.СодержитТип(Тип("Дата")) Тогда мКолонокДат.Добавить(кол.Имя) КонецЕсли;
    КонецЦикла;

   
// основные данные
   
квоиз=" из "+СокрЛП(квоСтрокДЭ-1);
    Для
й=0 По квоСтрокДЭ-2 Цикл
       
#Если Клиент Тогда
           
ОбработкаПрерыванияПользователя();
           
Состояние("Вывод в Excel: "+Строка(й+1)+квоиз);
       
#КонецЕсли
       
стро=тДанных.Получить(й);
        Для
итерКолонок=1 По квоКолонокДЭ Цикл
           
знч=стро[итерКолонок-1];
            Если
мКолонокДат.Найти(тДанных.Колонки[итерКолонок-1])<>Неопределено Тогда
               
// выгрузка в эксель через COMSafeArray не понимает совсем пустые даты, поэтому надо это учесть!!!
               
знч=?(ЗначениеЗаполнено(знч),знч,Дата(1900,1,1));
            КонецЕсли;
           
РезДокумент[итерКолонок-1][й+1]=знч;
        КонецЦикла;
    КонецЦикла;

   
// сохраняем все в произвольный тип, подробнее см. типизацию в описании конструктора "По типу элемента 1"
   
рТипМассива="VT_VARIANT";
   
рМассив=Новый COMSafeArray(РезДокумент,рТипМассива,квоКолонокДЭ,квоСтрокДЭ);
   
Ексель=Новый COMОбъект("Excel.Application");
   
Книга=Ексель.Workbooks.Add();
    Если
Книга.WorkSheets.Count=0 Тогда
       
Лист=Книга.WorkSheets.Add();
    Иначе
       
Лист=Книга.WorkSheets.Item(1); // нумерация с 1
   
КонецЕсли;
   
// самое главное: диапазону ячеек можно просто присвоить SafeArray со значениями
   
рНачало=Лист.Cells(1,1);
   
рКонец=Лист.Cells(квоСтрокДЭ,квоКолонокДЭ);
   
Лист.Range(рНачало,рКонец).Value=рМассив;
   
//
    // соответствие форматов: xlOpenXMLWorkbook=51 это xlsx, xlExcel12=50 это xlsb, xlExcel8=56 это xls
   
стрпф=Новый Структура("xls,xslx,xlsb",56,51,50);
   
рФайл=Новый Файл(СокрЛП(рПутьИмяФайла));
   
расш=СтрЗаменить(рФайл.Расширение,".","");
   
рФормат=?(стрпф.Свойство(расш),стрпф[расш],51); // по умолчанию xlsx
   
Книга.SaveAs(СокрЛП(рПутьИмяФайла),рФормат);

    Если
рОткрыватьДляПросмотра Тогда
       
#Если Клиент Тогда
           
Ексель.Visible=Истина;
       
#КонецЕсли
   
КонецЕсли;
   
//
   
Ексель=Null;

Исключение
   
Сообщить("БыстроВывестиТаблицуЗначенийВExcel, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры


 

Желающим плюсить - сюда: //infostart.ru/public/269846/

Ну а первоисточник, который применял я, здесь: http://kb.mista.ru/article.php?id=707

Поскольку моё тут только конкретное воплощение, публикацию особо плюсить не стоит, и вообще она life.

COMSafeArray Excel выгрузка в Excel

См. также

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    209832    620    524    

438

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 11.12.2023, версия 9.5 - 9.9)

13200 руб.

20.11.2015    150386    365    375    

499

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

5400 руб.

04.06.2019    101139    296    173    

312

Загрузка данных отчета о реализации товаров из Excel файла СберМегаМаркет

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

3600 руб.

07.06.2022    14954    78    0    

59

Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы

Загрузка и выгрузка в Excel Оптовая торговля Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 руб.

09.11.2016    214616    921    886    

938

Универсальная загрузка остатков и цен поставщиков в 1С (УТ 11, КА 2, ERP 2.0) из файлов Excel, CSV, XML (YML и CML)

Прайсы Оптовая торговля Розничная торговля Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Загрузка и выгрузка в Excel Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Обработка позволяет легко настроить загрузку прайс-листов и остатков поставщиков. Форматы файлов задаются для каждого поставщика отдельно. В настройках предусмотрена возможность гибкой обработки входящих данных (убрать лишние символы, пересчитать цены в другую валюту, сделать произвольную наценку и т.д.).

12000 руб.

23.01.2017    58796    59    48    

67
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. BigClock 29.06.15 10:03 Сейчас в теме
ТабЗнч = РезЗапроса.Выгрузить();
ПострПечать = Новый ПостроительОтчета;
ПострПечать.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабЗнч);
ТабДок = Новый ТабличныйДокумент;                  
ПострПечать.Вывести(ТабДок);
ТабДок.Записать("ИмяФайла.xls");
user1619761; user1835472; ivan1703; ivnik; antonio_i; siliconvalet; badyrov; xoisim; avmironov; user1697585; denium; mai_k; user902161; Gendelf; marat.coolls; porese; user1447587; Zeus2090; grfsd; Henistaromin; bbbsss; Shmell; shved; primat; mvxyz; pikabu; androgin; mvsemenov; fancy; webester; ixijixi; dolter; Zeskord; vasyak319; +34 2 Ответить
4. Yashazz 4707 29.06.15 11:24 Сейчас в теме
(1) BigClock, господин "пионэр", вы, вероятно, не поняли фишку, что, возможно, ввиду малого опыта простительно. Я ведь написал - это вариант быстрого способа. Да ещё и не подвешивающего клиентскую машину. Флаг вам в руки сохранять моксель на 300 тысяч строк методом Записать() при небольшой оперативке, тогда поймёте.

(3) Что будет являться критерием "успешной загрузки" при проверке, и чем тогда, на ваш взгляд, загрузка будет отличаться от проверки оной?
20. genayo 29.06.15 18:58 Сейчас в теме
(4) А 300 тысяч строк в Екселе нужны чтобы что с ними делать?
user1619761; Sergex; Henistaromin; PheelSAV; andy23; +5 Ответить
21. anosin 29 01.07.15 09:03 Сейчас в теме
(20) genayo, Например загрузить в другую систему, которая умеет грузить только из файла эксела
user1619761; 13KrAs; +2 Ответить
23. Yashazz 4707 01.07.15 10:16 Сейчас в теме
(21) Именно.
(22) anosin, как даты сохраняются. Или это не ко мне вопрос?
5. Yashazz 4707 29.06.15 13:50 Сейчас в теме
(1) Вот мне интересно, сколько ещё ламеров, полагающих себя Кэпами Очевидность, плюсанут неработающий код из (1)? Прям хоть ставки делай)))
Vida; Smert-nik; +2 8 Ответить
6. Xershi 1473 29.06.15 14:07 Сейчас в теме
(5) так работает типовой механизм. Куда не поставь 1С везде создаст файл эксель. Ваш вариант предполагает установку экселя на сервер с 1С. Что может быть и вообще не быстро, т.к. просто не создастся наш файл.
8. Yashazz 4707 29.06.15 14:25 Сейчас в теме
(6), (7), мы с вами на разных 1С работаем, видимо, или у вас эксели ооочень сильно продвинутые. Позволю себе процитировать СП:
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.

А теперь скажите мне, в приведённом фрагменте кода явно указан второй параметр, определяющий формат документа? Нет, не указан. А это означает, что эксель нихрена не откроет файл, сделанный таким образом. Желающие приглашаются проверить.

Вообще это напоминает старый анекдот, как преобразовать pdf в вордовский файл - взять да и поменять расширение файла)))
user1835472; androgin; +2 1 Ответить
9. vasyak319 150 29.06.15 14:30 Сейчас в теме
(8) а вот хамить не надо. Я понимаю, обидно, когда сидишь тут, ваяешь супермегастатью про свой убергиперспособ, а тут первый же комментатор пишет шесть строк кода, которые делают то же самое. И - о, чудо! о, подарок судьбы! - допускает мелкую ошибку. В коде, набитом на коленке чисто ради примера.
Движок сайта не даёт ставить минусы чаще, чем раз в пять минут, но я никуда не тороплюсь.
user1619761; Serg2000mr; user1835472; DoReMu; avmironov; Meverix; Gendelf; marat.coolls; danil157; shved; Патриот; alest; CyberCerber; +13 Ответить
15. Yashazz 4707 29.06.15 15:13 Сейчас в теме
(9) vasyak319, эти 6 строчек кода я юзал ещё когда только вышла 8.0, и не надо считать себя первооткрывателями. Мне не обидно, т.к. и способ этот не я придумал, и воплощение до меня делали. "Мегастатью" ваял минут 5, спасибо автору "разукрашки" кода)
Меня возмущает манера выдать общеизвестный баян в виде истины "а мужыки-то не знают", да ещё ошибку посадить, и совершенно не подумать о производительности.

Насчёт "набитом на коленке" - знаете, вот клиенту потом трудно объяснить, что ошибка-то ерундовая. Потому что деление ошибок на ерундовые и серьёзные это признак неграмотного подхода. Любая ошибка, не позволяющая решить задачу - это серьёзная ошибка. И допущенная в цитируемом коде именно такова, сорри.

Минусуйте, если вам делать нечего. Я вот пока лучше новую интересную задачу порешаю, а результаты потом выложу.
31. lolm 21.09.21 12:57 Сейчас в теме
(9) вы попробуйте что делают эти 6 строк, служебный бред выгружают
10. webester 26 29.06.15 14:46 Сейчас в теме
(8) в (1) Действительно ошибка, но сам способ я использую тоже, не могу сказать про 300тыщ, это реально много, но я регулярно сохраняю таким образом в экселевккий файлик результат СКД отчета размером в 80К строк и десяток колонок, на стареньком ноуте со старым процом и 2гигами памяти. Занимает секунд 10-20 гдето, не могу сказать точнее.
11. Xershi 1473 29.06.15 15:00 Сейчас в теме
(8) то, что там не указано расширение. Это косяк поста 1, но метод рабочий и расширение явно зададим и получим результат без тонны кода.
Естественно для вывода простого отчета это то что нужно, ваш метод как раз таки не для таких случаем.
Так что вопрос в задаче, а не быстроте/простоте!
26. androgin 08.07.15 20:47 Сейчас в теме
(8) Эксель отлично открывает формат MXL !
27. Yashazz 4707 09.07.15 14:25 Сейчас в теме
(26) androgin, это в вас говорит или малый опыт, или большой оптимизм. Далеко не все версии и далеко не всегда способны открыть mxl. А иногда вроде и открывают, но лучше бы отказались, таков бывает результат.
7. ixijixi 1761 29.06.15 14:11 Сейчас в теме
(5) вполне все работает. (не про производительность речь)
18. BigClock 29.06.15 16:03 Сейчас в теме
Yashazz,
Да, в (1) есть косяк.
Но в статье не было приведено никаких цифр (хотя бы ориентировочных) по сравнению Вашего способа с очевидным.
Становится непонятным: стоит ли городить огород с такой большой процедурой?
В (10) были приведены цифры. Очевидно, что для большинства применений этого простейшего способа из 6 строк более, чем достаточно.

Насчёт "набитом на коленке" - знаете, вот клиенту потом трудно объяснить, что ошибка-то ерундовая. Потому что деление ошибок на ерундовые и серьёзные это признак неграмотного подхода. Любая ошибка, не позволяющая решить задачу - это серьёзная ошибка. И допущенная в цитируемом коде именно такова, сорри.

Речь идет о подходе к решению задачи, а не о том, что именно этот код я буду внедрять у клиента. Тем более, что перед внедрением я обязательно проведу тестирование решения, в результате которого эта ошибка будет обнаружена.

DoReMu; avmironov; Meverix; DevSerg; Патриот; Diego_Iv; alest; klinval; Yashazz; vasyak319; +10 Ответить
19. Yashazz 4707 29.06.15 17:09 Сейчас в теме
(18) BigClock,
Но в статье не было приведено никаких цифр (хотя бы ориентировочных) по сравнению Вашего способа с очевидным.
Не ставил такой цели. Я русским по белому написал, что это за публикация и зачем, а некоторые с таким жаром накинулись, будто я ноу-хау анонсировал. Прямо жаль, что того автора, ссылку на публикацию которого я привёл, так не комментили, потому что вон он понты раскидывал - не мне чета)

Становится непонятным: стоит ли городить огород с такой большой процедурой?
В моих случаях, в решениях промышленного масштаба, ещё как стоит.
В (10) были приведены цифры. Очевидно, что для большинства применений этого простейшего способа из 6 строк более, чем достаточно.
Согласен. Более того, если условия задачи допускают простое решение, то именно городить сложный огород и есть ошибка. Можно сделать просто - нужно сделать просто.
32. d.zhukov 1391 18.02.24 12:23 Сейчас в теме
(1)
ТабДок.Записать("ИмяФайла.xls");

В последней строке следует явно указать тип файла. Итого правильно должно быть так:
ТабЗнч = РезЗапроса.Выгрузить();
ПострПечать = Новый ПостроительОтчета;
ПострПечать.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабЗнч);
ТабДок = Новый ТабличныйДокумент;                  
ПострПечать.Вывести(ТабДок);
ТабДок.Записать("ИмяФайла.xlsx", ТипФайлаТабличногоДокумента.XLSX);
2. vasyak319 150 29.06.15 10:15 Сейчас в теме
Всего вторую публикацию за сегодня читаю и уже второй способ удаления гланд через задницу. Сегодня "День проктолога" что ли?
Meverix; andy23; DoctorRoza; +3 1 Ответить
3. DoctorRoza 29.06.15 10:48 Сейчас в теме
Вопрос в автору, как у гуру: можно в предложенном коде сделать "Попытку .." не в блоке загрузки данных? То бишь, я хочу в начале проверить, что все загрузиться, а уже потом точно загружать данные! Спасибо!
13. zikonza 29.06.15 15:06 Сейчас в теме
(3) DoctorRoza, Не проще тогда все делать в транзакции?
14. Yashazz 4707 29.06.15 15:09 Сейчас в теме
(13) zikonza, туманно представляю, чем может помочь транзакция. 1С ведь не будет откатывать изменения в стороннем клиентском приложении при отказе транзакции.
16. zikonza 29.06.15 15:51 Сейчас в теме
(14) не сохраню его так же,как и при попытке. По сути смысл тотже
17. Yashazz 4707 29.06.15 15:56 Сейчас в теме
(16) zikonza, а, это да. Это вариант.
12. zikonza 29.06.15 15:04 Сейчас в теме
Очень странно читать некоторые комментарии, с производительностью кто нибудь сталкивался вообще? С нагрузкой? С требованиями оптимизировать код? Автору плюс. Практически так же записываю.
22. anosin 29 01.07.15 09:04 Сейчас в теме
ячейки с датами как сохранятся в экселе в приведнном коде? к примеру результат выводя СКД?
24. MadDAD 152 03.07.15 11:51 Сейчас в теме
Как отлавливаете незакрывшиеся процессы экселя на сервере?
25. Yashazz 4707 06.07.15 00:22 Сейчас в теме
(24) MadDAD, правду сказать - никак. Всё руки не доходят заняться этой частью задачи.
28. Ivon 673 14.03.16 23:09 Сейчас в теме
Не понимаю восторгов автора от собственного творения. Метод не самый быстрый, хотя и не самый медленный. Но самый главный минус - использование Excel для выгрузки просто таблицы значений без форматирования. Копайте в сторону ADO и будет вам счастье - там можно выгружать и в Excel и в Access не имея установленного офиса.
29. Yashazz 4707 15.03.16 10:36 Сейчас в теме
(28) Ivon, во-первых, восторгов особых вроде не вижу. Покажите, где вы их нашли, а? Уж не фраза ли "публикацию особо плюсить не стоит" это восторг?
Во-вторых, спасибо, но механикой ADO я владею в достаточной мере.
В третьих, если кто-то справедливо раскритиковал вашу разработку, ползать по ИС и цепляться к его работам - ну, несколько странно выглядит.
30. Ivon 673 15.03.16 11:44 Сейчас в теме
(29) Если вы так хорошо во всем разбираетесь, зачем постить подобный шлак. И это тоже справедливая критика
Оставьте свое сообщение