Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.
Содержание
Общая информация
В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.
Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456
- Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
- Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”
Использование объекта ВременноеХранилище
Вспомогательные процедуры — диалог выбора файла
Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу
Создадим обработчик события НачалоВыбора:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВыбратьФайлНаКлиенте();
КонецПроцедуры
Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.
&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
Перем Диалог;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.МножественныйВыбор = Ложь;
РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
Если РезультатВыбора <> Неопределено Тогда
ПутьКФайлу = РезультатВыбора[0];
КонецЕсли;
КонецПроцедуры
Двоичные данные во временное хранилище
Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.
Клиентский код:
- проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
- Получаем двоичные данные из файла по указанному пути
- Помещаем эти двоичные данные во временное хранилище
- Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Возврат;
КонецЕсли;
ДД = Новый ДвоичныеДанные(ПутьКФайлу);
АдресВХ = ПоместитьВоВременноеХранилище(ДД);
ПрочитатьИзВХНаСервере(АдресВХ);
КонецПроцедуры
Серверный код:
- Создаем временный файл с нужным расширением (в примере – xlsx)
- Получаем двоичные данные из временного хранилища
- Записываем во временный файл
- Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
- Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ
Метод Прочитать лучше делать в попытке, и отдельно продумать и написать код обработки исключения. для упрощения примера мы это исключение никак не обрабатываем. В случае, если передан поврежденный файл, или его невозможно прочитать по какой-то другой причине, он просто не считается в табличный документ.
&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДД = ПолучитьИзВременногоХранилища(АдресВХ);
ДД.Записать(ИмяВременногоФайла);
Если Режим = "Текст" Тогда
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
Иначе
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
КонецЕсли;
Попытка
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
Исключение
КонецПопытки;
КонецПроцедуры
Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.
Помещение файла на сервер в 1С
Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.
Логика кода следующая:
- Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
- Указываем параметры диалога выбора файла и добавляем фильтр
- Вызываем помещение файла на сервер
- После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
КонецПроцедуры
Использование потока для чтения файла
В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.
В этом случае нам не понадобится создавать временный файл и следить за его корректным удалением. Код будет очень похож на прерыдущий пример. Мы также выбираем файл с использованием метода НачатьПомещениеФайлаНаСервер, но указываем другой фильтр. А в обработчике оповещения вызываем серверную процедуру ПрочитатьВПоток. В методе Прочитать() нам нужно явным образом указать тип файла табличного документа, который мы считываем.
&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещенияПоток(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)
ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();
КонецПроцедуры
Надеюсь, рассмотренные примеры помогут вам справиться с задачей передать файл с клиента на сервере и прочитать файл Excel в 1С.
Чтение файла Excel в 1С 8.х может проводиться несколькими способами. Одним из самых простых способов программного чтения файлов Excel в 1С является подключение через COMобъект.
Перед тем как перейти к процедурам чтения файла Excel, нужно найти его адрес. Для этого удобно воспользоваться стандартным диалогом открытия файла. Нужно создать текстовое поле с достаточной длиной (адреса бывают длинные). В обработчике события НачалоВыбора нужно прописать следующую процедуру.
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = «(*.xls)|*.xls»;
Если ЗначениеЗаполнено(Файл) Тогда
Диалог.ПолноеИмяФайла= Файл;
КонецЕсли;
Если Диалог.Выбрать() Тогда
Файл= Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
После этого в реквизите Файл должен находить полный адрес файла Excel.
Допустим, файл содержит две колонки:
- Артикул.
- Наименование товара.
Данные начинаются с 4 строки. Всего строк в файле 5000.
Процедура будет выглядеть так:
Процедура ИмпортироватьЛистФАдрес ()
Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);
ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
Для СчетчикЦикла=4 По 5000 Цикл
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
КонецЦикла;
Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти
КонецПроцедуры
Пустые ячейки файла Excel имеют значение Неопределено. Поэтому, если количество строк в файле заранее не известно, но есть уверенность, что записи идут одна за другой и не прерываются пустыми строками, то процедуру можно модифицировать так.
Процедура ИмпортироватьЛистФАдрес ()
Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);
ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
СчетчикЦикла=4;
Пока СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value)<>Неопределено Цикл
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
СчетчикЦикла=СчетчикЦикла+1;
КонецЦикла;
Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти
КонецПроцедуры
Кроме того, можно определить количество строк в файле Excel. Это делается так:
Версия = Лев(Ехсел.Version,Найти(Ехсел.Version,«.»)—1);
Если Версия = «8» тогда
ФайлСтрок = Ехсел.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Ехсел.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Ехсел.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Ехсел.Cells(1,1).SpecialCells(11).Column;
Конецесли;
После этого можно применять полученные значения количества строк и колонок в коде, аналогичном описанному выше.
Процедура ИмпортироватьЛистФАдрес ()
Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);
Если Версия = «8» тогда
ФайлСтрок = Ехсел.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Ехсел.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Ехсел.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Ехсел.Cells(1,1).SpecialCells(11).Column;
Конецесли;
ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
Для СчетчикЦикла=4 По ФайлСтрок Цикл
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
КонецЦикла;
Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти
КонецПроцедуры
Содержание
- Чтение файла Excel в 1С
- Как прочитать файл Excel в 1С 8.3
- Содержание
- Общая информация
- Использование объекта ВременноеХранилище
- Вспомогательные процедуры — диалог выбора файла
- Двоичные данные во временное хранилище
- Помещение файла на сервер в 1С
- 1С 8.3 Чтение Excel через Табличный документ — Программист 1С Минск. Автоматизация бизнеса.
- 1С 8.3 Чтение Excel через Табличный документ
- Практика 1С: Как загрузить данные из Excel в 1С (20 строк кода)
- 1С. Чтение XLS файлов
Чтение файла Excel в 1С
Чтение файла Excel в 1С 8.х может проводиться несколькими способами. Одним из самых простых способов программного чтения файлов Excel в 1С является подключение через COMобъект.
Перед тем как перейти к процедурам чтения файла Excel, нужно найти его адрес. Для этого удобно воспользоваться стандартным диалогом открытия файла. Нужно создать текстовое поле с достаточной длиной (адреса бывают длинные). В обработчике события НачалоВыбора нужно прописать следующую процедуру.
Процедура ФайлНачалоВыбора ( Элемент , ДанныеВыбора , СтандартнаяОбработка )
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие ) ;
Диалог . ПредварительныйПросмотр = Ложь ;
Диалог . Фильтр = «(*.xls)|*.xls» ;
Если ЗначениеЗаполнено ( Файл ) Тогда
Диалог . ПолноеИмяФайла = Файл ;
КонецЕсли ;
Если Диалог . Выбрать ( ) Тогда
Файл = Диалог . ПолноеИмяФайла ;
После этого в реквизите Файл должен находить полный адрес файла Excel.
Допустим, файл содержит две колонки:
Данные начинаются с 4 строки. Всего строк в файле 5000.
Процедура будет выглядеть так:
Ехсел = Новый COMObject ( «Excel.Application» ) ;
Книга = Ехсел . Workbooks ;
Книга . Open ( Файл ) ;
ТЗ = новый ТаблицаЗначений ;
ТЗ . Колонки . Добавить ( «Артикул» ) ;
ТЗ . Колонки . Добавить ( «Наименование» ) ;
Для СчетчикЦикла = 4 По 5000 Цикл
НоваяСтрока = ТЗ . Добавить ( ) ;
НоваяСтрока . Артикул = СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 1 ) . value ) ;
НоваяСтрока . Наименование = СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 2 ) . value ) ;
КонецЦикла ;
Ехсел . Application . Quit ( ) ; // Если этого не сделать, процесс EXCEL останется в памяти
Пустые ячейки файла Excel имеют значение Неопределено. Поэтому, если количество строк в файле заранее не известно, но есть уверенность, что записи идут одна за другой и не прерываются пустыми строками, то процедуру можно модифицировать так.
Ехсел = Новый COMObject ( «Excel.Application» ) ;
Книга = Ехсел . Workbooks ;
Книга . Open ( Файл ) ;
ТЗ = новый ТаблицаЗначений ;
ТЗ . Колонки . Добавить ( «Артикул» ) ;
ТЗ . Колонки . Добавить ( «Наименование» ) ;
Пока СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 1 ) . value ) <>Неопределено Цикл
НоваяСтрока = ТЗ . Добавить ( ) ;
НоваяСтрока . Артикул = СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 1 ) . value ) ;
НоваяСтрока . Наименование = СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 2 ) . value ) ;
СчетчикЦикла = СчетчикЦикла + 1 ;
Ехсел . Application . Quit ( ) ; // Если этого не сделать, процесс EXCEL останется в памяти
Кроме того, можно определить количество строк в файле Excel. Это делается так:
После этого можно применять полученные значения количества строк и колонок в коде, аналогичном описанному выше.
Ехсел = Новый COMObject ( «Excel.Application» ) ;
Книга = Ехсел . Workbooks ;
Книга . Open ( Файл ) ;
Если Версия = «8» тогда
ФайлСтрок = Ехсел . Cells . CurrentRegion . Rows . Count ;
ФайлКолонок = Макс ( Ехсел . Cells . CurrentRegion . Columns . Count , 13 ) ;
Иначе
ФайлСтрок = Ехсел . Cells ( 1 , 1 ) . SpecialCells ( 11 ) . Row ;
ФайлКолонок = Ехсел . Cells ( 1 , 1 ) . SpecialCells ( 11 ) . Column ;
Конецесли ;
ТЗ = новый ТаблицаЗначений ;
ТЗ . Колонки . Добавить ( «Артикул» ) ;
ТЗ . Колонки . Добавить ( «Наименование» ) ;
Для СчетчикЦикла = 4 По ФайлСтрок Цикл
НоваяСтрока = ТЗ . Добавить ( ) ;
НоваяСтрока . Артикул = СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 1 ) . value ) ;
НоваяСтрока . Наименование = СокрЛП ( Ехсел . Cells ( СчетчикЦикла , 2 ) . value ) ;
КонецЦикла ;
Ехсел . Application . Quit ( ) ; // Если этого не сделать, процесс EXCEL останется в памяти
Источник
Как прочитать файл Excel в 1С 8.3
Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.
Содержание
Общая информация
В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.
Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456
- Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
- Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”
Использование объекта ВременноеХранилище
Вспомогательные процедуры — диалог выбора файла
Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу
Создадим обработчик события НачалоВыбора:
Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.
Двоичные данные во временное хранилище
Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.
- проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
- Получаем двоичные данные из файла по указанному пути
- Помещаем эти двоичные данные во временное хранилище
- Далее передаем на сервер адрес этого временного хранилища
- Создаем временный файл с нужным расширением (в примере – xlsx)
- Получаем двоичные данные из временного хранилища
- Записываем во временный файл
- Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
- Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ
Метод Прочитать лучше делать в попытке, и отдельно продумать и написать код обработки исключения. для упрощения примера мы это исключение никак не обрабатываем. В случае, если передан поврежденный файл, или его невозможно прочитать по какой-то другой причине, он просто не считается в табличный документ.
Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.
Помещение файла на сервер в 1С
Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.
Логика кода следующая:
- Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
- Указываем параметры диалога выбора файла и добавляем фильтр
- Вызываем помещение файла на сервер
- После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
Источник
1С 8.3 Чтение Excel через Табличный документ — Программист 1С Минск. Автоматизация бизнеса.
1С 8.3 Чтение Excel через Табличный документ
&НаКлиенте
Процедура ФайлНачалоВыбора ( Элемент , ДанныеВыбора , СтандартнаяОбработка ) //необходимо в событии «НачалоВыбора» поля ввода вызвать ДиалогВыбораФайла
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие );
Диалог . Заголовок = «Выберите файл Excel» ;
Диалог . ПредварительныйПросмотр = Ложь;
Диалог . Фильтр = «(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx» ;
Если ЗначениеЗаполнено ( Объект . Файл ) Тогда
Диалог . ПолноеИмяФайла = Объект . Файл ;
КонецЕсли;
Если Диалог . Выбрать () Тогда
ВыбранныйФайл = Диалог . ПолноеИмяФайла ;
Объект . Файл = ВыбранныйФайл ;
ЧтениеExcel_через_ТД ( ВыбранныйФайл );
КонецЕсли;
&НаСервере
Процедура ЧтениеExcel_через_ТД ( ВыбранныйФайл )
//1) Выводим Excel в табличн.документ
ТаблДок = Новый ТабличныйДокумент ;
ТаблДок . Прочитать ( ВыбранныйФайл , СпособЧтенияЗначенийТабличногоДокумента . Значение );
//2) Выгружаем в таблицу значений
ПЗ = Новый ПостроительЗапроса ;
ПЗ . ИсточникДанных = Новый ОписаниеИсточникаДанных ( ТаблДок . Область ());
ПЗ . ДобавлениеПредставлений = ТипДобавленияПредставлений . НеДобавлять ;
ПЗ . ЗаполнитьНастройки ();
ПЗ . Выполнить ();
ТаблицаЗначений = ПЗ . Результат . Выгрузить ();
Источник
Практика 1С: Как загрузить данные из Excel в 1С (20 строк кода)
В этой статье рассмотрим простой пример загрузки данных из файла Excel.
Исходная задача: в файле хранится список контрагентов со следующей информацией:
- наименование
- полное наименование
- УНП
Нужно прочитать данные из этого файла для последующей загрузки в 1С в справочник «Контрагенты». В этой статье не будем затрагивать вопрос создания контрагентов в справочнике, рассмотрим только процесс чтения данных из файла Excel.
Прочитать файл Excel в 1С можно с помощью объекта встроенного языка ТабличныйДокумент. Ниже приведен фрагмент программного кода, который решает эту задачу:
————————————————————————————-
ТабДок = Новый ТабличныйДокумент;
//путь к файлу, который нужно прочитать
ПутьКФайлу = «C:tempСписокКонтрагентов.xls»;
//чтение файла, используя метод Прочитать (ВАЖНО: метод доступен только на сервере)
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Не удалось прочитать указанный файл по причине: » + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;
КонецПопытки;
//получение количества строк в таблице
КоличествоСтрок = ТабДок.ВысотаТаблицы;
//создание таблицы, в которую будут помещены данные из файла
ДанныеФайла = Новый ТаблицаЗначений;
ДанныеФайла.Колонки.Вставить(«Наименование»);
ДанныеФайла.Колонки.Вставить(«ПолноеНаименование»);
ДанныеФайла.Колонки.Вставить(«УНП»);
//чтение данных таблицы по ячейкам
Для НомерСтроки = 2 По КоличествоСтрок Цикл
СтрокаДанных = ДанныеФайла.Добавить();
//получение данных ячейки с адресом R C (пример: R1C2)
СтрокаДанных.Наименование = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 1).ТекущаяОбласть.Текст;
СтрокаДанных.ПолноеНаименование = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 2).ТекущаяОбласть.Текст;
СтрокаДанных.УНП = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 3).ТекущаяОбласть.Текст;
КонецЦикла;
————————————————————————————-
Примечание: метод «Прочитать()» объекта ТабличныйДокумент доступен только на сервере. Поэтому чтение данных описанным способом возможно только на стороне сервера.
Ставьте + в комментариях, если Вам помогла эта статья 🙂
Источник
1С. Чтение XLS файлов
Приветствую, мои маленькие любители длинных запросов.
Сегодня мы с вами рассмотрим несколько способов реализации часто встречающейся задачи, которая неизменно вызывает определенные трудности у каждого начинающего программиста, а именно разбор XLS файлов.
«Какая уж тут сложность. Берешь Com объект Excel.Application, наискосок пробегаешь по методичке MSDN Microsoft и готово!» — воскликнет один из наших более опытных коллег, уже успевший сваять две нетленки и раскурочить до неузнаваемости типовую УПП. А сложность есть, и она в неопределенности доступных ресурсов. Расшифруем эту красивую фразу чуть подробнее.
- Предположим, что у нас все хорошо (нет) и сервером является что-то вроде Windows Server 2013 R2 (далее просто Win). И на нем даже установлен Microsoft Office. Или, будь не к ночи помянута, у нас файловая база.
В этом случае все очень просто:
Создаем EA = ComObject(«Excel.Application”);
Открываем книгу Книга = EA.Worlbooks.Open(ПолныйПутьКФайлу);
Получаем нужный лист Лист = Книга.WorkSheets(ИмяНужногоЛиста);
Теперь можно работать, как с обычным табличным документам при помощи метода Лист.Range(х,y);
Не забываем, что область заполненных данных мы можем определить через методы Лист.Cells.SpecialCells(11).Column и Лист.Cells.SpecialCells(11).Row
Не забываем убирать за собой, а именно делать корректные обработки ошибки, и в случае возникновения оных закрывать подключение к COM объекту, иначе рискуем получить заблокированный документ и сотни сеансов Excel на сервере:
- Априори утверждать, что на сервере будет установлена какая-либо версия Excel, нельзя. Особенно во времена, когда по организациям ходят мужчины в строгих костюмах и просят предъявить лицензионное соглашение на все, включая пасьянс на компьютере секретаря.
Тем не менее сервера на Win довольно-таки распространенная вещь. Допустим у нас именно такой, а вот на лицензионный Office денег не хватило.
В этом случае допустим следующий метод – чтение файла через драйвер Ado.
Стоит отдельно заметить, что это один из наиболее быстрых способов чтения файлов Excel.
Последовательность та же, что и в первом варианте, создаем сом объект и используем его методы.
А вот далее идет … запрос. Да, мы будем читать данные файла запросом, как данные любой другой базы данных.
Чтение Recordset’а выполняется в цикле. Условием завершения цикла является значение, возвращаемое методом РС.EOF();
Перебор набора – методом РС. MoveNext();
Количество колонок и строк, хранится в свойствах РС.RecordCount и РС.Fields.Count. Не забываем, что это не методы, и следовательно скобки не нужны.
Позиционирование на конкретной ячейке документа — РС.Fields.Item(НомерКолонки).
Опять же, как и в варианте 1 не забываем убирать за собой, везде, где вероятность возникновения ошибки не абсолютно нулевая, т.е. весь алгоритм целиком, а так же в конце алгоритма.
- Есть еще один вариант, сервер на WIn и OpenOffice. Такое сочетание встречается чуть менее, чем повсеместно в гос.конторах и прочих бюджетных учреждениях. Его, я конечно, же не буду рассматривать(с).
На самом деле, этот метод абсолютно уступает чтению через ADO, как в быстродействии, так и простое построения алгоритмов. - В случае, если сервер развернут на Linux единственный вариант – это через использование стандартного 1Совского ЧтенияXML(ну или ПостроительDOM, для гурманов). Так же данные метод применим только для «соверменного» формата XLSX. Устаревший XLS таким образом прочитать не получится. Но не унывайте, есть решение и на этот случай (см.пункт 5)Дело в том, что файл формат XLSX это фактически архив, в котором хранятся XML файлы и служебные таблицы, так же в формате XML.
Строковые, численные и прочие примитивные значения ячеек в файле xlsharedStrings.xml
Формулы в файле xl calcChain.xml
Разметки листов в xlworksheetssheetsX.xml
Оформления листов в файле xlstyles.xml
Указанные файлы можно прочитать при помощи объекта ЧтениеXML или более продвинутого ПостроительDOM.
В любом случае структура этих файлов достаточно сложна и достойна отдельной статьи. Так же с ней можно ознакомиться самостоятельно, просто открыв файл XLSX любым архиватором.
- На сладкое оставим способ, доступный если у вас платформа 8.6.3 или старше.
Разработчики 1С позаботились о тех, несчастных, которым недоступна технология COM, ADO или приходится работать с устаревшим XLS.
Для этого для метода Прочитать() ТабличногоДокумента добавили параметр
СпособЧтенияЗначений типа СпособЧтенияЗначенийТабличногоДокумента.
Таким образом можно «скормить» файл табличному документу, а затем работать с ним.
Небольшой хинт, чтобы не парсить области табличного документу вручную, его, в свою очередь, можно подсунуть в качестве источника данные ПостроителюЗапросов.
И получить ТаблицуЗначений здорового человека, с которой справится и вчерашний студент.
В данной статье мы рассмотрели целых 5 способов чтения XLS|X файлов. Надеюсь, в следующий раз, когда вы столкнетесь с подобной задачей, она поможет вам разобрать многометровые листинги кода разборов XLS из результатов гугла, толстого троллинга от завсегдатаев мисты или тотального игнора на инфостарте, в поисках ответа, который до вас задавался тысячи раз.
Источник
&НаКлиенте
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) //необходимо в событии «НачалоВыбора» поля ввода вызвать ДиалогВыбораФайлаДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = «Выберите файл Excel»;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = «(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx»;
Если
ЗначениеЗаполнено(Объект.Файл) Тогда
Диалог.ПолноеИмяФайла= Объект.Файл;
КонецЕсли;
Если
Диалог.Выбрать() Тогда
ВыбранныйФайл = Диалог.ПолноеИмяФайла;
Объект.Файл = ВыбранныйФайл;
ЧтениеExcel_через_ТД(ВыбранныйФайл);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЧтениеExcel_через_ТД(ВыбранныйФайл)//1) Выводим Excel в табличн.документ
ТаблДок = Новый ТабличныйДокумент;
ТаблДок.Прочитать(ВыбранныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение);//2) Выгружаем в таблицу значений
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблДок.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();ТаблицаЗначений = ПЗ.Результат.Выгрузить();
КонецПроцедуры
В данной статье рассмотрим чтение из файлов Excel
Чтение построчно
ExcelApp=Новый ComОбъект("Excel.Application"); Книга=ExcelApp.Workbooks.Open("C:1.XLS"); ВсегоСтрок = Книга.Cells.CurrentRegion.Rows.Count; Лист=Книга.Sheets(1); Для i=1 по ПоследняяСтрока Цикл Контрагент =Лист.Cells(i,1).Value; НашДолг =Лист.Cells(i,7).Value; ДолгКлиента =Лист.Cells(i,8).Value; //... //... КонецЦикла; ExcelApp.Workbooks.Close(); ExcelApp.Quit();
Чтение массивом
Для более быстрого чтения можно использовать следующий способ
(взято с http://infostart.ru/public/20090/)
Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт Если ЛистЭксель = Неопределено Тогда ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application"); КонецЕсли; Если ВсегоСтрок = 0 Тогда ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row; КонецЕсли; Если ВсегоКолонок = 0 Тогда ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column; КонецЕсли; Если ТЗ = Неопределено Тогда ТЗ = Новый ТаблицаЗначений; Для Счетчик = 1 По ВсегоКолонок Цикл ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка")); КонецЦикла; КонецЕсли; Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл НоваяСтрока = ТЗ.Добавить(); КонецЦикла; Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок)); Данные = Область.Value.Выгрузить(); Для Счетчик = 0 По ВсегоКолонок-1 Цикл ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик); КонецЦикла; ЛистЭксель = Неопределено; Возврат ТЗ; КонецФункции