gifts2017

NEW! Быстрый способ выгрузки в Excel без «геморроя» с помощью COMSafeArray.

Опубликовал Александр Кораблев (akor77) в раздел Обмен - Загрузка и выгрузка в Excel

Как очень быстро, легко и без всяких препятствий (драйвера ADODB, права пользователя Windows и т.п.) выгрузить данные в Excel с помощью COMSafeArray.

Заглянем в справку:

COMSafeArray  - объектная оболочка над многомерным массивом SAFEARRAY из COM. Позволяет создавать и использовать SAFEARRAY для обмена данными между COM-объектами.

Т.е., существует универсальный массив  для передачи данных между различными COM-объектами.  Всё что нужно, это 1С и Excel, ничего лишнего. Именно это привлекло моё внимание к этому объекту.

Скажу честно, мне пришлось потратить целый день, чтобы понять, как работать с этим объектом, в интернете ничего подобного мне не приходилось встречать. По этому пришлось стать первопроходцем.

Этот объект очень хитёр, т.к. при чтении файла из Excel возвращается массив в одном виде, а для передачи данных в Excel необходимо создать немного иной вариант. Но время было потрачено с пользой.

Кроме того, функция принимающая таблицу значений и сохраняющая данные в файл получилась универсальной. Теперь достаточно создать запрос с учётом некоторых нюансов и передать в эту функцию выгрузку запроса или таблицу значений.

Предложенная обработка спроектирована таким образом, что может быть вызвана как пользователем, так и регламентным заданием.

ОБРАТИТЕ ВНИМАНИЕ!

  1. Если в ТЗ будут строки из чисел, то как поступить, чтобы Excel не превратил их в числа, описано в публикации «Выгрузка данных в Excel без «геморроя». Один, но принципиально важный момент» (Ищите в моих публикациях).
  2. Учтите, Excel не понимает дат меньше 01.01.1900, по этому и пустую дату передавать нельзя, будет ошибка.
  3. ТЗ должна содержать только примитивные типы Дата, Число, Строка, Булево.

Эти нюансы, дополнительно, описаны в самой обработке.

Также, обратите внимание на статью «Как предотвратить возникновение ошибки при одновременном обращении пользователя и обработки к Excel»  (Ищите в моих публикациях).

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Шаблон выгрузки в Excel COMSafeArray.epf
.epf 8,48Kb
30.03.14
59
.epf 8,48Kb 59 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. rasswet (rasswet) 02.04.14 08:49
"по этому и пустую дату передавать нельзя"-натыкался на эти грабли. спасибо.
2. Андрей Овсянкин (Evil Beaver) 02.04.14 10:01
Решение интересное, не знал что можно диапазон ячеек сразу задать в виде SAFEARRAY.
Единственное замечание - уж очень много пафоса у вас в публикациях. Может попроще как-то?
Краткая суть, для тех кому интересен принцип предлагаемого решения:
// ИсходныйМассив - двумерный массив исходных данных (строки/колонки)
// Размер - размерности массива (см. синтакс-помощник для ComSafeArray)
Массив = Новый COMSafeArray(ИсходныйМассив, "VT_VARIANT", Размер);

// Самое главное. диапазону ячеек можно просто присвоить SAFEARRAY со значениями.
Лист.Range(Лист.Cells(2,1), Лист.Cells(Строк, Колонок)).Value = Массив;
...Показать Скрыть
JohnyDeath; yurii_host; AlexanderKai; dsv_nsk; artbear; Naill99; утюгчеловек; slavap; Yashazz; Nikola23; bulpi; +11 Ответить 1
3. Леонид Паутов (Pr-Mex) 02.04.14 11:21
Ну, насчет того, что "в интернете ничего подобного мне не приходилось встречать. По этому пришлось стать первопроходцем." у гугла есть другое мнение:

https://www.google.ru/search?q=1%D1%81+SAFEARRAY&oq=1%D1%81+SAFEARRAY&aqs=chrome..69i57.3672j0j7&sourceid=chrome&espv=210&es_sm=93&ie=UTF-8#newwindow=1&q=site%3Amista.ru+excel+comSAFEARRAY
dsv_nsk; artbear; Никс; Yashazz; Evil Beaver; +5 Ответить 1
4. Александр Кораблев (akor77) 02.04.14 17:30
(3) Pr-Mex, Действительно, в книге знаний описано, не натыкался. По Вашей ссылке нашлась только одна статья по выгрузке. Может я опять не так ищу. Но заметьте, там ни слова о граблях.
5. Александр Кораблев (akor77) 02.04.14 17:34
(2) Evil Beaver, На счёт "пафоса" - учту. Писал "на радостях", это эмоции радости выплеснулись. Постараюсь быть сдержанней.
6. Александр Кораблев (akor77) 02.04.14 20:43
В обработке есть ошибки:
1. Поместить строку
Лист.Range(Лист.Cells(2,1), Лист.Cells(Строк, Колонок)).Value = Массив;

В попытку.
	Попытка
		Лист.Range(Лист.Cells(2,1), Лист.Cells(Строк, Колонок)).Value = Массив;
	Исключение
		Книга.Close();
		Книга = Неопределено;
		Excel.Interactive = Истина;
		Excel.DisplayAlerts = Истина;
		Excel.Application.Quit();
		Excel = Неопределено;
		Возврат "Ошибка при вставке массива. Подробно: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
...Показать Скрыть

2. Переместить "возврат" ниже
	Попытка
		Книга.SaveAs(ПутьКФайлу, 56);
	Исключение
		Книга.Close();
		Книга = Неопределено;
		Возврат "Ошибка при записи файла. Подробно: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); // Отсюда
		Excel.Interactive = Истина;
		Excel.DisplayAlerts = Истина;
		Excel.Application.Quit();
		Excel = Неопределено;
		//Сюда
	КонецПопытки;
...Показать Скрыть
7. Алексей Роза (DoctorRoza) 03.04.14 08:04
За идею +, за оформление -! :)
8. Makc *** (makc2k) 03.04.14 09:17
Данный подход чем то похож на метод excel CopyFromRST, когда результат адошного запроса сразу сбрасывается на лист. Только вот все равно тяжеловесный эксель нужно запускать. Тем не менее это кирпичик в копилку знаний.
9. Сергей Скрынник (nofx) 20.02.16 15:06
Хреново что нужно указывать границы диапазона области, если работаем с именованными областями.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа