Выгружаем из 1С в EXCEL с помощью ADO. Часть I

Выгружаем из 1С в EXCEL с помощью ADO. Часть I

Наверное уже многие знают что с помощью технологии ADO можно быстро читать большие объемы информации из книг excel. Но ведь с помощью данной технологии можно так же легко создавать и заполнять файлы excel прямо из 1С. Неверите ? Смотрите …
Итак, постановка задачи: Создать с помощью механизма ADO из 1С файл excel и выгрузить в него из справочника номенклатура код и наименование.

ИмяФайлаЭксель = "D:\Export.xls"; // Имя создаваемого файла
// Собираем строку подключения
СтрокаПодключения = "
|Provider=Microsoft.Jet.OLEDB.4.0;
|Data Source="+ИмяФайлаЭксель+";
|Extended Properties=""Excel 8.0;HDR=No;"";";

// Создаем объект ADOX.Catalog
Catalog = Новый COMОбъект("ADOX.Catalog");
Catalog.ActiveConnection = СтрокаПодключения;

// Создаем таблицу и добавляем в неё два столбца
Table = Новый COMОбъект("ADOX.Table");
Table.Name = "Table";
Table.Columns.Append("Code");
Table.Columns.Append("Description");

// Присоединяем таблицу
Catalog.Tables.Append(Table);
Table = Неопределено;
Catalog = Неопределено;

// Создаем соединение
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаПодключения);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
Command.CommandType = 1;

// Получаем номенклатуру для выгрузки
Запрос = Новый Запрос("
|ВЫБРАТЬ
|    Номенклатура.Код,
|    Номенклатура.Наименование
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура");

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

// Заполняем таблицу данными выборки
Пока Выборка.Следующий() Цикл
    Command.CommandText = "
    |INSERT INTO [Table] VALUES ('"+Выборка.Код+"','"
    +Выборка.Наименование+"')";
    Command.Execute();
КонецЦикла;

// Закрываем соединение
Command = Неопределено;
Connection.Close();
Connection = Неопределено;

Все, готово !

Плюсы данного способа формирования файла excel:

  • Большая скорость работы.
  • Не требуется запуск самого процесса excel.exe, как это происходит в случае использования OLE-сервера excel.application, а следовательно на него не тратятся ресурсы. Кроме того нет необходимости отслеживать и перехватывать ошибки, связанные с процессом excel.exe, те кто использовал OLE-cоединение — тот поймет о чем я говорю, мало радости когда в случае программной или пользовательской ошибки процесс excel.exe остается висеть в памяти.
  • Не требуется самого приложения EXCEL, достаточно что бы на компьютере был установлен OLEDB провайдер Microsoft.Jet.OLEDB.4.0 (он входит в состав практически всех ОС семейства Windows) Это особенно актуально, когда данный код выполняется на сервере 1С:Предприятия, например в качестве регламентного задания.

Минусы тоже имеются:

  • Нельзя красиво оформить ячейки — шрифт, рамки и т.д.

Возможен «комбинированный» способ: с помощью ADO формируется файл, а затем с помощью OLE «наводится марафет». Читайте продолжение «Выгружаем из 1С в EXCEL с помощью ADO. Часть II»

Скачать обработку

Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.

Комментарии:

  1. Aspect:

    Пишет ошибку: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft JET Database Engine): Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘с выключателем’. Command.Execute();

    1. Администратор:

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

  2. Антон:

    при открытии в версии 8.2 (файл/открыть) пишет «Ошибка загрузки документа. Внешняя обработка не может быть прочитана текущей версией программы»…

    1. AlexO:

      Откройте сначала в Конфигураторе 8.2 обработку, переконвертируйте (совместимость с 8.1 пропадет!), и если без управляемых форм (в Толстом клиенте) — открывайте переконвертированную обработку уже в Предприятии 8.2.

  3. Андрей:

    Код рабочий. Одна проблема — если в наименовании присутствует апостроф — система падает. Как его можно сохранить? (Вариант — вырезать возможен, но некрасиво). Спасибо

    1. Администратор:

      Насколько я помню в SQL апостроф экранируется обратным слэшом, таким образом можно попробовать заменить все ‘ в наименовании на \’
      Сам не пробовал, но на мой взгляд решение данной проблемы следует искать в этом направлении.

  4. orbazan:

    Добрый день, большое спасибо за статью, очень помогла.
    Есть ньюанс — в файле Экселя, в начале каждого значения присутствует апостроф ‘ — можно ли от него избавиться ?

  5. Муратик:

    1) при повторном сохранении данного примера выводится ошибка.
    2) или можно ли узнать более много команд как «Command.Execute()» ???

    или спрошу по другому, если надо будет перезаписать данный файл то как поступить???

  6. Роман:

    В силу сиквельного синтаксиса заполнения эксельного листа возникают проблемы, если в названии номенклатуры были всевозможные кавычки.

    1. admin:

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

  7. Андрей:

    {Форма.Форма.Форма(134)}: Ошибка при установке значения атрибута контекста (ActiveConnection)
    Catalog.ActiveConnection = СтрокаПодключения;
    по причине:
    Произошла исключительная ситуация (Microsoft JET Database Engine): Файл ‘D:\1С\Для аудиторов\’ не может быть открыт ядром базы данных Microsoft Jet. Файл уже открыт другим пользователем для монопольного доступа или требуется разрешение на просмотр данных.
    вот такую штуку выдает, хоть при попытке создать новый, хоть при попытке записи в старый файл 🙁

  8. Илья:

    Добрый день.

    Пока Выборка.Следующий() Цикл
    Command.CommandText = »
    |INSERT INTO [Table] VALUES (‘»+Выборка.Код+»‘,'»
    +Выборка.Наименование+»‘)»;
    Command.Execute();
    КонецЦикла;

    Возможно ли в данном случае добавить все необходимые записи одним запросом?
    Т.е. в одном INSERT’е добавить одновременно несколько строк.
    Спасибо.

  9. Надежда:

    Добрый день. Вопрос немного на другую тему. Загружаем из Excel в 1С. В экселевском файле в ячейке вместо значения указана ссылка на ячейку на другом листе книги. Как считать конечное значение?

  10. Владимир:

    Красиво работаете — молодцы

  11. Андрей:

    Добрый день скачал обработку такая ошибка

    {ВнешняяОбработка.ADOX.Форма.Форма.Форма(22)}: Помилка при встановленні значення атрибуту контексту (ActiveConnection)
    Catalog.ActiveConnection = СтрокаПодключения;
    через:
    Відбулася виняткова ситуація (ADOX.Catalog): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.

  12. Alena:

    У меня задача сохранить 150 000 строк. В .xls формате максимум 65 536, пробую сохранить в .xlsx, но вылетает ошибка: «Произошла исключительная ситуация (Microsoft JET Database Engine): Cannot update. Database or object is read-only.». Может кто-нибудь сталкивался?

Оставить комментарий