Метод загрузки данных из таблиц Excel в 1С без установки Office

20.06.17

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

Импорт данных в 1С:Предприятие 7.7 из Excel через JET.OLEDB или ACE.OLEDB. Данный метод позволяет загружать данные из файлов на ПК, на которых не установлен MS Office.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Загрузка данных из Excel (пример обработки)
.ert 32,50Kb
12
12 Скачать (1 SM) Купить за 1 850 руб.

Загрузка в 1С:7.7 (далее просто 1С) из Excel, казалось бы, что может быть проще? Создаем объект "Excel.Application", открываем в нем необходимый файл и загружаем все необходимы данные. Но есть одно маленькое но: чтобы создать этот объект, на компьютере должен быть установле Excel. А если Excel-я нет, что делать? Уже несколько раз сталкивался с такими организациями: на компьютерах пользователей, разумеется, стоит все необходимое, в т.ч. и MS Office, нет только 1С, а вот на сервере терминалов все наоборот: только 1С:7.7 и все. На предложение установить хотя бы только Excel отвечают категорическим отказом, мотивируя это проблемами безопасности или отсутствием свободных лицензий, или и тем, и другим. В таком случае открыть файл через объект "Excel.Application" оказывается невозможно, что же делать? Но выход есть! Наша любимая Microsoft все предусмотрела! Чтобы извлечь данные из файлов Excel можно использовать специальные объекты ACE.OLEDB или более старые JET.OLEDB.

Итак, если у Вас возникла необходимость обратится из 1С к книге Excel на машине, где неустановлен этот самый Excel, то порядок действий следующий:

  1. Проверяем, что у нас установлено и каких версий, для этого смотрим в реестре ветку  HKEY_CLASSES_ROOT\Microsoft.ACE.х.х. Если этого раздела нет, то там же может быть такая ветка: HKEY_CLASSES_ROOT\Microsoft.JET.х.х, где "х.х" - это номера версий. Если ничего нет, то гуглим в Яндексе "скачать microsoft ace.oledb" и переходим на сайт Microsoft, где эта штука называется как "Microsoft Access Database Engine 2010 Redistributable", кто не хочет долго искать может сразу скачать по #здесьссылке https://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

  2. Переходим к написанию процедуры импорта. Сначала формируем строку подключения. Для JET.OLEDB 4-ой версии она будет выглядеть следующим образом:

    ИмяФайла = "C:\AAA\file123.xls"; //Имя файла, для импорта
    СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + ИмяФайла;
    СтрокаПодключения = СтрокаПодключения + "; Extended Properties = "+"""Excel 8.0"+";HDR=NO;IMEX=1"";";

    А для ACE.OLEDB 12-ой так:

    ИмяФайла = "C:\AAA\file123.xls"; //Имя файла, для импорта
    СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + ИмяФайла;
    СтрокаПодключения = СтрокаПодключения + "; Extended Properties = "+"""Excel 12.0"+";HDR=NO;IMEX=1"";";

    Описание тонкостей данных настроек - это тема для отдельной публикации. Для наших целей достаточно тех, что указаны здесь. Но интересующиеся могут воспользоваться поисковыми запросами "подключение к microsoft.jet.oledb" или "подключение к microsoft.Ace.oledb".

  3. Подключаемся к файлу:

        // Подключаемся
    	Екс = СоздатьОбъект("ADODB.Connection");	
    	Екс.Open(СтрокаПодключения); 	//Таблица EXCEL
    

    Файл открыт. Для получения из него данных необходимо будет использовать объект RecordSet, если Вы работали в VB или VBA, то знаете что это такое, для остальных буду в процессе пояснять. Теперь таблица Excel представляется обычной таблицей базы данных, у которой есть строки, есть колонки, чтобы прочитать данные из этой таблицы необходимо сформировать SQL-запрос и передать его объекту RecordSet. Сейчас мы сформируем запрос, который откроет доступ к диапазону строк с 10 до 120 и колонок с A по S:

    НачСтрока = 10; КонСтрока = 120;
    СтрокаЗапроса = "
        |SELECT *
        |FROM [A" + Строка(НачСтрока) + ":S" + Строка(КонСтрока) + "] 
    
        |"; //Выбираются необходимые ячейки листа
    	//Для наложения условия используется синтаксис SQL
    
    //РабЛ	= СоздатьОбъект("ADODB.RecordSet"); Объект этого типа мы сейчас получим
    РабЛ = Екс.Execute(СтрокаЗапроса);

    Последовательно читаем все строки объекта RecordSet с помощью методов MoveFirst (ПолучитьПервуюЗапись) и MoveNext (ПолучитьСледующуюЗапись). Внутри строки перемещаемся с помощью коллекции Fields:

    СтрТекст = "";
    СчСтрок = 0;
    РабЛ.MoveFirst(); //Получить первую строку набора
    Пока Число(РабЛ.EOF()) = 0 Цикл 
    //Выполняем цикл пока флаг окончания набора записей (Метод EOF) 
    //не будет установлен в значение Истина (перебираем строки таблицы)
    
       СчСтрок = СчСтрок + 1;   
       Сообщить(СтрТекст);	                
       СтрТекст = "Строка № " + СчСтрок + ": ";
    		
       Для Сч = 1 По РабЛ.Fields.Count() Цикл 
          //Перебор элементов коллекции Fields (колонки внутри строки)
       
          ТекЗначение = СокрЛП(РабЛ.Fields(Сч - 1).Value);
          СтрТекст = СтрТекст + ТекЗначение + "!";
    			
       КонецЦикла;
       РабЛ.MoveNext(); //Получить следующую строку набора
    
    КонецЦикла; 
    	                       
    Сообщить(СтрТекст);
    //Закрываем объекты Оле
    РабЛ.Close();
    Екс.Close();
    

Вот так, с помощью нехитрых методов и обрывочных знаний по Visual Basic можно обращаться к информации, хранящейся в недоступных, казалось бы, файлах. Если фрагменты представленного здесь кода собрать вместе, то получим процедуру, читающую данные в книге Excel и выводящую их в виде сообщений пользователю. Для тех, кто ценит свое время, прилагаю уже готовую обработку, которая воспроизводит описанные здесь дейтсвия. Её Вы можете взять за основу и доработать под свои нужды.

Импорт эксель excel OLEDB 1C77 1С77 7.7

См. также

Банковские операции Загрузка и выгрузка в Excel Бухгалтер Пользователь Платформа 1С v7.7 Конфигурации 1cv7 Россия Бухгалтерский учет Платные (руб)

Решение предоставляет комплексную загрузку банковской выписки из CSV, XLS, TXT файла в 1С 7.7 любой конфигурации. Позволяет создавать документы выбранного вида, например "Строка выписки банка (приход/расход)", или многострочный табличный документ, например Выписка, для каждой операции из загружаемого файла банковской выписки. Загружает реквизиты документа, а также создаёт контрагентов и другие необходимые элементы справочников.

3588 руб.

29.07.2021    22685    15    22    

16

Загрузка и выгрузка в Excel Программист Платформа 1С v7.7 Абонемент ($m)

Сводная таблица Excel из 1С - как сделать ее программно через COM соединение.

1 стартмани

30.07.2021    6679    2    atdonya    1    

2

Загрузка и выгрузка в Excel ККМ Программист Бухгалтер Пользователь Платформа 1С v7.7 1С:Комплексная 7.7 1С:Торговля и склад 7.7 Бухгалтерский учет Управленческий учет Абонемент ($m)

Выполняет выгрузку товаров (всех, только с признаком в прайсе, только из указанной папочки) с гибкой настройкой выгружаемых данных. Формируется файл в формате XLSX подходящий для прямой удаленной загрузки в кассовый аппарат АТОЛ 91Ф/92Ф и им подобных, имеющих управление через Личный кабинет АТОЛ (lk.atol.ru).

1 стартмани

31.01.2021    8348    2    &-rey    1    

4

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Программист Пользователь Платформа 1С v7.7 1С:Комплексная 7.7 Управленческий учет Абонемент ($m)

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

1 стартмани

11.10.2019    12079    2    ksnik    2    

2

Оптовая торговля Загрузка и выгрузка в Excel Пользователь Платформа 1С v7.7 Конфигурации 1cv7 Оптовая торговля, дистрибуция, логистика Управленческий учет Абонемент ($m)

В данной публикации приведены примеры обработок обмена дистрибьютора с поставщиками и покупателями через Эксель. Создание товаров-новинок. Автоматическое формирование Заказа поставщику по продажам. Заполнение бланка заказа поставщику. Загрузка приходной накладной от поставщика. Загрузка любых справочников из Эксель, например товарных сертификатов. Выгрузка прайслиста в бланк заказа (создание бланка заказа). Загрузка заявки покупателя из произвольного файла Эксель. Загрузка заявки покупателя из бланка заказа.. Для работы требуется установленный MS Excel.

1 стартмани

08.09.2019    16499    10    ksnik    2    

3

Загрузка и выгрузка в Excel Перенос данных 1C Программист Пользователь Платформа 1С v7.7 Платформа 1С v8.3 Конфигурации 1cv8 Конфигурации 1cv7 1С:ERP Управление предприятием 2 Абонемент ($m)

Описание технологии загрузки любых адресов из 1С 7.7 с разложением по ФИАС в современные конфигурации 1C 8.3 на примере ERP. Предлагаемый способ просто чудо, он гарантирует результат, он очень простой и качественный! Моя обработка является синтаксическим анализатором, который подставляет в строку грязного адреса выражение "Дом №" и "Корпус", благодаря чему грязные адреса 7.7 сами очень хорошо раскладываются по значимым полям ФИАС - заполняется область, город, улица, дом, корпус.. все раскладывается само с помощью встроенного механизма современных конфигураций 1С 8.3, который написали сами сотрудники фирмы 1С!

1 стартмани

16.08.2019    19653    18    ksnik    12    

8

Загрузка и выгрузка в Excel Оптовая торговля Розничная торговля Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Управление торговлей 10 1С:Комплексная 7.7 1С:ERP Управление предприятием 2 Управленческий учет Абонемент ($m)

Описание практического опыта переноса данных из двух устаревших учетных систем в одну современную с обобщением справочников (например номенклатуры, контрагентов, партнеров) и объединением учетных данных устаревших систем в единую новую УС применяя комбинацию стандартной загрузки из Эксель и КД2. Данная публикация является примером переноса данных из сильно устаревших и сильно переписанных конфигураций 1С:Предприятия 7.7 и 8 в современную 1С 8.3 своими силами при условии невозможности или нежелания пользоваться обновлением релизов и типовой функциональностью универсального обмена данными типовых мастеров переноса данных. Отличительной особенностью публикации является устранение зависимости от версий релиза конфигураций, отказ от обновлений устаревших конфигураций.

1 стартмани

29.07.2019    21500    16    ksnik    0    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 2712 20.09.16 08:00 Сейчас в теме
Как определить КонСтрока?
2. vadver 41 20.09.16 09:25 Сейчас в теме
(1) CheBurator, вероятно, с помощью ADOX.Catalog, ADOX.Tables
3. aserg 44 21.09.16 07:22 Сейчас в теме
(1) CheBurator, определить количество заполненных строк в файле Excel не открывая самого файла - задача еще та... Можно упростить задачу: задавать значение переменной КонСтрока как заведомо большое, чтобы в диапазон попала вся необходимая информация или предоставить эту возможность самому пользователю, выведя на форму соответствующее поле.
Есть еще 3-ий вариант: считывать информацию из файла в цикле небольшими блоками по N строк в каждом, когда в очередном блоке не оказалось нужной информации - выход из цикла.
4. aserg 44 21.09.16 07:53 Сейчас в теме
На самом деле строку запроса можно составить таким образом, чтобы в него попали все данные или только необходимые, например, если СтрокаЗапроса = "Select * FROM [Лист1$]", то в выборке окажется весь лист с именем "Лист1". Если лист Excel именно таблица, т.е. в первой строке его находятся заголовки столбцов, а ниже - данные, то к нему (листу) можно обращаться как к таблице базы данных с использованием имен столбцов и фильтров. Например запрос "Select * FROM [Лист1$] Where Количество = 2" отфильтрует строки на листе "Лист1" по колонке "Количество" = 2.
Причем меня терзают смутные подозрения, что если в запросе обратиться к пустому листу, то выборка также окажется пустой, но времени на проверку данного подозрения не было. Отпишитесь, у кого будет желание
5. пользователь 13.06.22 22:57
Сообщение было скрыто модератором.
...
6. пользователь 13.06.22 23:33
Сообщение было скрыто модератором.
...
7. пользователь 13.06.22 23:42
Сообщение было скрыто модератором.
...
Оставьте свое сообщение