Содержание
- Как в 1С загрузить данные из *.XLS если нет офиса на ПК?
- Работа с файлами Excel
- Обмен через табличный документ
- Обмен через OLE
- Использование COMSafeArray
- Обмен через ADO
- Выгрузка без программирования
Как в 1С загрузить данные из *.XLS если нет офиса на ПК?
adodb а как он тоже требует Эксель вот пример
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+ИмяФайла+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Лист1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
Смотри вставляем имя файла получаем вот это
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Лист1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
ответ системы
<ОбщийМодуль.ЗагрузкаизЭксель.Модуль(4,73)>: Неопознанный оператор
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C >:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»; (Проверка: Сервер)
<ОбщийМодуль.ЗагрузкаизЭксель.Модуль(9,28)>: Обнаружено логическое завершение исходного текста модуля
RecordSet = Connection. >Execute(СтрЗапроса); (Проверка: Сервер)
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
За такое я бы сразу того.
Кавычки для кого были придуманы??
Например, тут.
ты вообще — со строками работать умеешь?
Ну у меян решение. Полное. Работает под всеми виндами и линусами, всеми редимами 1С (клиент-серверная, управляемые формы, облака и так далее.
Нативная компонента, на питоне. Читает напрямую все и хавает все.
Считывает сразу все листы экселя, все возвращает в 1С в виде массива таблицы эксель.
Не нужно выбирать листы, не нужно указывать именя листов и так далее.
Сразу мгновенно все в 1С.
Скорость 100 000 строк в минуту.
Пока НЕ RecordSet.EOF Цикл
(28) у тебя же написан запрос к листу:
ИмяЛиста = «Лист1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
А теперь полный текст программы
Процедура ЗагрузкаИзЭксель() Экспорт
Перем Нов;
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+»C:usersuserdocumentsbook1.xls»+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Sheet1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
// Пока НЕ RecordSet.EOF() Цикл
RecordSet.MoveNext();
ФИО = RecordSet.Fields(2).value;
// //.
//сообщить(ФИО);
// КонецЦикла;
Connection.Close();
RecordSet = «»;
// Excel = новый COMОбъект(«Excel.Application»);
// Книга = Excel.Workbooks.Open(«C:UsersuserdocumentsBook1.xls»);
// Лист = Книга.Worksheets(«Лист1»).UsedRange;
// КолонкаНаименования = 1;
//Для Стр = 1 По 5 Цикл
// ФИО = Лист.Cells(2, КолонкаНаименования).Value;
//КонецЦикла ;
// Excel.WorkBooks.Close();
// Excel = «»;
Нов = Справочники.Сотрудники.СоздатьЭлемент();
НовГруппа = Справочники.Сотрудники.СоздатьГруппу();
НовГруппа.Наименование = «Работающие»;
НовГруппа.Записать();
Нов.Наименование = «Иванов Иван Иванович»;
СпрСотр = Справочники.Сотрудники;
ГруппаРаботающие = СпрСотр.НайтиПоНаименованию(«Работающие»);
выборка = СпрСотр.Выбрать(ГруппаРаботающие);
Нов.Родитель = ГруппаРаботающие;
Нов.ФИО = ФИО;
Нов.ДатаПриема = ‘2014.12.12’;
Нов.Записать();
КонецПроцедуры
Мужики не парьтесь вы с адо и прочими методами. все выкинуть на свалку можно. поверьте человеку который 5 лет загрузку писал.
с АДо все заканчивается когда к вам попадает прайс какого нибудь 95 офиса, а таких навалом просто или еще вагон проблем.
Все это неуниверсально, ломается и выходит из строя.
(52) а где бы исходники то взять? декомпиляцию не предлагать плиз
изваял бы «за час» — ну пусть сутки некий форк ))
(49) если в качестве входных данных может быть вообще все что угодно, то да, ADO не вариант. Но если файлы идут из одного источника и их структура боле-менее предсказуема, то ADO лучшее что можно придумать. Потому как бесплатно и есть на любом компе с виндой.
Хотя если действительно что угодно — ну хрен знает. мне как-то прайс попался из-под навижена. вроде на экселе. но цены были сделаны надписями. Т.е. в каждую ячейку был вкрячен объект «надпись» (тот что с панели рисования) и в нем цена. Вот и подумайте — ЭТО чем-нибудь считать получится?
Ну вот зачем так сложно? Нет экслея, конвертирую с помощью Yoksel файл в формат MXL и читаю средствами 1с.
Второй вариант — ставить Open Office, конвертировать в csv и читать оттуда опять же средствами 1с.
блин ну очевидно же — сохраните файл в XLSX и разберите файл средствами 1С
это кстати еще и самый быстрый способ загрузки файлов.
Источник
Работа с файлами Excel
MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.
Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.
Обмен через табличный документ
Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:
- Записать ( ИмяФайла >, ТипФайлаТаблицы >) для выгрузки данных в файл;
- Прочитать ( ИмяФайла >, СпособЧтенияЗначений >) для загрузки данных из файла.
Внимание!
Метод Записать () доступен как на клиенте, так и на сервере. Метод Прочитать () доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.
Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:
ТабДок . Записать ( ПутьКФайлу , ТипФайлаТабличногоДокумента . XLSX );
Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:
- XLS95 — формат Excel 95;
- XLS97 — формат Excel 97;
- XLSX — формат Excel 2007.
Загрузка из файла осуществляется также достаточно просто:
ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПутьКФайлу , СпособЧтенияЗначенийТабличногоДокумента.Значение );
Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:
Обмен через OLE
Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:
- На компьютере конечного пользователя, если обмен происходит на стороне клиента;
- На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.
Пример выгрузки:
// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Отключение вывода предупреждений и вопросов
Эксель . DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель . WorkBooks . Add ();
// Позиционирование на первом листе
Лист = Книга . Worksheets ( 1 );
// Запись значения в ячейку
Лист . Cells ( НомерСтроки , НомерКолонки ). Value = ЗначениеЯчейки ;
// Сохранение файла
Книга . SaveAs ( ИмяФайла );
// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;
Примеры чтения:
// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Открытие книги
Книга = Эксель . Workbooks . Open ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );
// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
// Закрытие книги
Книга . Close ( 0 );
// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;
// Открытие книги
Книга = ПолучитьCOMОбъект ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );
// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
// Закрытие книги
Книга . Application . Qui t ();
Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:
// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
КонецЦикла;
// —— ВАРИАНТ 2 ——
НомерСтроки = 0 ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
Если НЕ ЗначениеЗаполнено ( ЗначениеЯчейки ) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:
ВсегоКолонок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Column ;
ВсегоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Область = Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок ));
Данные = Область . Value . Выгрузить ();
В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:
Действие | Код | Комментарий |
Работа с приложением | ||
Установка видимости окна приложения | Эксель . Visible = Ложь; | |
Установка режима вывода предупреждений (выводить/не выводить) | Эксель . DisplayAlerts = Ложь; | |
Закрытие приложения | Эксель . Quit (); | |
Работа с книгой | ||
Создание новой книги | Книга = Эксель . WorkBooks . Add (); | |
Открытие существующей книги | Книга = Эксель . WorkBooks . Open ( ИмяФайла ); | |
Сохранение книги | Книга . SaveAs ( ИмяФайла ); | |
Закрытие книги | Книга . Close ( 0 ); | |
Работа с листом | ||
Установка текущего листа | Лист = Книга . WorkSheets ( НомерЛиста ); | |
Установка имени | Лист . Name = Имя ; | |
Установка защиты | Лист . Protect (); | |
Снятие защиты | Лист . UnProtect (); | |
Установка ориентации страницы | Лист . PageSetup . Orientation = 2 ; | 1 — книжная, 2 — альбомная |
Установка левой границы | Лист . PageSetup . LeftMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Установка верхней границы | Лист . PageSetup . TopMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Установка правой границы | Лист . PageSetup . RightMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Установка нижней границы | Лист . PageSetup . BottomMargin = Эксель . CentimetersToPoints ( Сантиметры ); | |
Работа со строками, колонками, ячейками | ||
Установка ширины колонки | Лист . Columns ( НомерКолонки ). ColumnWidth = Ширина ; | |
Удаление строки | Лист . Rows ( НомерСтроки ). Delete (); | |
Удаление колонки | Лист . Columns ( НомерКолонки ). Delete (); | |
Удаление ячейки | Лист . Cells ( НомерСтроки , НомерКолонки ). Delete (); | |
Установка значения | Лист . Cells ( НомерСтроки , НомерКолонки ). Value = Значение ; | |
Объединение ячеек | Лист . Range ( Лист . Cells ( НомерСтроки , НомерКолонки ), Лист . Cells ( НомерСтроки1 , НомерКолонки1 )). Merge (); | |
Установка шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Name = ИмяШрифта ; | |
Установка размера шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Size = РазмерШрифта ; | |
Установка жирного шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Bold = 1 ; | 1 — жирный шрифт, 0 — нормальный |
Установка курсива | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Italic = 1 ; | 1 — курсив, 0 — нормальный |
Установка подчеркнутого шрифта | Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Underline = 2 ; | 2 — подчеркнутый, 1 — нет |
Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.
Использование COMSafeArray
При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.
// Создание COMSafeArray
МассивКом = Новый COMSafeArray ( «VT_Variant» , ВсегоКолонок , ВсегоСтрок );
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом . SetValue ( Кол , Стр , Значение );
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок )). Value = МассивКом ;
Обмен через ADO
Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.
Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.
Пример выгрузки:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );
// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения
// Создание COM-объекта для команды
Команда = Новый COMОбъект ( «ADODB.Command» );
Команда . ActiveConnection = Соединение ;
// Присвоение текста команды для создания таблицы
Команда . CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)» ;
Команда . Execute (); // Выполнение команды
// Присвоение текста команды для добавления строки таблицы
Команда . CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)» ;
Команда.Execute(); // Выполнение команды
// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение . Close ();
Соединение = Неопределено ;
Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:
// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект ( «ADOX.Catalog» );
Книга . ActiveConnection = Соединение ;
// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект ( «ADOX.Table» );
Таблица . Name = «Лист1» ;
Таблица . Columns . Append ( «Колонка1» , 202 );
Таблица . Columns . Append ( «Колонка2» , 7 );
Таблица . Columns . Append ( «Колонка3» , 5 );
Таблица . Columns . Append ( «Колонка4» , 5 );
// Создание в книге листа с описанной структурой
Книга . Tables . Append ( Таблица );
Таблица = Неопределено;
Книга = Неопределено;
В приведенном примере в методе
Таблица . Columns . Append ( «Колонка1» , 202 );
во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:
- 5 — adDouble;
- 6 — adCurrency;
- 7 — adDate;
- 11 — adBoolean;
- 202 — adVarWChar;
- 203 — adLongVarWChar.
Пример чтения:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );
// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения
// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект ( «ADODB.Recordset» );
ТекстЗапроса = «SELECT * FROM [Лист1$]» ;
// Выполнение запроса
Выборка . Open ( ТекстЗапроса , Соединение );
// Обход результата выборки
Пока НЕ Выборка . EOF () Цикл
ЗначениеКолонки1 = Выборка . Fields . Item ( «Колонка1» ). Value ; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка . Fields . Item ( 0 ). Value ; // Обращение по индексу колонки
Выборка . MoveNext ();
КонецЦикла;
Выборка . Close ();
Выборка = Неопределено;
Соединение . Close ();
Соединение = Неопределено;
В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:
- YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
- NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.
В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:
Выгрузка без программирования
Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.
Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.
В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.
Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:
- Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
- Сохранить табличный документ в требуемый формат.
Источник
09.12.14 — 21:04
Как загружать данные из XLS при наличии на компьютере EXCEL я представляю, а что делать если Excel на компьютере нет, а данные из файла выгрузить в 1С надо(купить или скачать офис не получится нужен лицензионный)?
1 — 09.12.14 — 21:05
2 — 09.12.14 — 21:08
adodb а как он тоже требует Эксель вот пример
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+ИмяФайла+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Лист1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
3 — 09.12.14 — 21:10
На эту конструкцию сильно ругается программа пита неизвестный оператор.
4 — 09.12.14 — 21:10
(3) И на что ругается конкректно?
5 — 09.12.14 — 21:12
Сейчас
{ОбщийМодуль.ЗагрузкаизЭксель.Модуль(4,72)}: Переменная не определена (ИмяФайла)
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+<<?>>ИмяФайла+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»; (Проверка: Сервер)
6 — 09.12.14 — 21:13
через опенофис можно, но там тоже танцы с бубном
7 — 09.12.14 — 21:14
(5) И в этом тоже ексель виноват???
метлу не предлагаю, она занята…
Но может, лопату совковую?
8 — 09.12.14 — 21:16
Смотри вставляем имя файла получаем вот это
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Лист1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
ответ системы
{ОбщийМодуль.ЗагрузкаизЭксель.Модуль(4,73)}: Неопознанный оператор
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C<<?>>:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»; (Проверка: Сервер)
{ОбщийМодуль.ЗагрузкаизЭксель.Модуль(9,28)}: Обнаружено логическое завершение исходного текста модуля
RecordSet = Connection.<<?>>Execute(СтрЗапроса); (Проверка: Сервер)
9 — 09.12.14 — 21:18
И еще вот это
{ОбщийМодуль.ЗагрузкаизЭксель.Модуль(4,73)}: Неопознанный оператор
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C<<?>>:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»; (Проверка: Сервер)
{ОбщийМодуль.ЗагрузкаизЭксель.Модуль(9,28)}: Обнаружено логическое завершение исходного текста модуля
RecordSet = Connection.<<?>>Execute(СтрЗапроса); (Проверка: Сервер)
10 — 09.12.14 — 21:19
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+C:usersuserdocumentsbook1.xls+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
За такое я бы сразу того…
Кавычки для кого были придуманы??
11 — 09.12.14 — 21:19
Агде их не хватает?
12 — 09.12.14 — 21:20
Data Source=»+C:usersuserdocumentsbook1.xls+»
Например, тут.
ты вообще — со строками работать умеешь?
13 — 09.12.14 — 21:20
Такой длинный хвостик…
14 — 09.12.14 — 21:22
Умею но эта конструкция не от мира сего
15 — 09.12.14 — 21:23
Ты хочешь сказать что он эту строку складывает по правилам сложения строк? тогда ясно в чем ошибка.
16 — 09.12.14 — 21:24
Спасибки помогло ошибок больше нет.
17 — 09.12.14 — 21:24
(15) щас «оператор БСЛ» прилипнет
18 — 09.12.14 — 21:24
Ну у меян решение. Полное. Работает под всеми виндами и линусами, всеми редимами 1С (клиент-серверная, управляемые формы, облака и так далее.
Нативная компонента, на питоне. Читает напрямую все и хавает все.
19 — 09.12.14 — 21:25
Считывает сразу все листы экселя, все возвращает в 1С в виде массива таблицы эксель.
Не нужно выбирать листы, не нужно указывать именя листов и так далее.
Сразу мгновенно все в 1С.
Скорость 100 000 строк в минуту.
20 — 09.12.14 — 21:25
:челодлань.пнг:
21 — 09.12.14 — 21:30
я даже написать не успел — спроси маню…
22 — 09.12.14 — 21:31
(21) :слоупок.жпг:
)))))
23 — 09.12.14 — 21:35
гы
24 — 09.12.14 — 21:38
(0) через GoogleDocs ?
25 — 09.12.14 — 21:42
Так отлично работает только не понятно как определить какую строку и какой столбец как выгружать конструкция типа
ФИО = RecordSet.Fields(1).value;
ничего не говорит как выбрать конкретный столбец и строку в таблице Эксель?
26 — 09.12.14 — 21:46
не… с лопатой я погорячился…
Максимум черпак третьего ученика младшего помощника при холерных бараках…
27 — 09.12.14 — 21:48
(25) Fields(1) — вот тебе поле
28 — 09.12.14 — 21:49
(27) Как при этой хитрой системе определить какой столбец и какую строку ты выбираешь? Когда работаешь через
Excel = новый COMОбъект(«Excel.Application»);
там понятно
ФИО = Лист.Cells(2, КолонкаНаименования).Value;
есть строка и столбец, а здесь что вместо этого?
29 — 09.12.14 — 21:49
Пока НЕ RecordSet.EOF Цикл
//блаблабла
RecordSet.MoveNext();
КонецЦикла;
30 — 09.12.14 — 21:50
(28) у тебя же написан запрос к листу:
ИмяЛиста = «Лист1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
31 — 09.12.14 — 21:50
(27) Fields(1) — вот тебе поле. Что поле он все поля по очереди перебирает слева направо и сверху вниз?
32 — 09.12.14 — 21:51
как с выборкой из результата запроса — так и здесь по сути
33 — 09.12.14 — 21:52
Понятно
34 — 09.12.14 — 21:58
Это как VISUAL BASIC я так с ACCESS работал когда миниСУБД писал.
35 — 09.12.14 — 22:02
Спасибки
36 — 09.12.14 — 22:04
Скопируй через буфер обмена в табличный документ 1С. Потом из него грузи.
37 — 09.12.14 — 22:05
(36) сто пудово
38 — 09.12.14 — 22:07
(36)Интересное предложение наверное так действительно проще.
39 — 09.12.14 — 22:08
(36) А это зачем? Доверять пользователю нельзя!
40 — 09.12.14 — 22:13
А теперь полный текст программы
Процедура ЗагрузкаИзЭксель() Экспорт
Перем Нов;
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+»C:usersuserdocumentsbook1.xls»+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Sheet1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
// Пока НЕ RecordSet.EOF() Цикл
RecordSet.MoveNext();
ФИО = RecordSet.Fields(2).value;
// //…
//сообщить(ФИО);
// КонецЦикла;
Connection.Close();
RecordSet = «»;
// Excel = новый COMОбъект(«Excel.Application»);
// Книга = Excel.Workbooks.Open(«C:UsersuserdocumentsBook1.xls»);
// Лист = Книга.Worksheets(«Лист1»).UsedRange;
// КолонкаНаименования = 1;
//Для Стр = 1 По 5 Цикл
// ФИО = Лист.Cells(2, КолонкаНаименования).Value;
//КонецЦикла ;
// Excel.WorkBooks.Close();
// Excel = «»;
Нов = Справочники.Сотрудники.СоздатьЭлемент();
НовГруппа = Справочники.Сотрудники.СоздатьГруппу();
НовГруппа.Наименование = «Работающие»;
НовГруппа.Записать();
Нов.Наименование = «Иванов Иван Иванович»;
СпрСотр = Справочники.Сотрудники;
ГруппаРаботающие = СпрСотр.НайтиПоНаименованию(«Работающие»);
выборка = СпрСотр.Выбрать(ГруппаРаботающие);
Нов.Родитель = ГруппаРаботающие;
Нов.ФИО = ФИО;
Нов.ДатаПриема = ‘2014.12.12’;
Нов.Записать();
КонецПроцедуры
41 — 09.12.14 — 22:16
(40) НовГруппа = Справочники.Сотрудники.СоздатьГруппу();
.
.
ГруппаРаботающие = СпрСотр.НайтиПоНаименованию(«Работающие»);
профит
42 — 09.12.14 — 22:20
(41) это просто заготовка лишнее будет удалено
43 — 09.12.14 — 22:26
Процедура ЗагрузкаИзЭксель() Экспорт
Перем Нов;
СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source=»+»C:usersuserdocumentsbook1.xls»+»; Extended Properties=»»Excel 8.0;HDR=No;IMEX=1;»»»;
Connection = Новый COMОбъект(«ADODB.Connection»);
Connection.Open(СтрокаПодключения);
ИмяЛиста = «Sheet1$»;
СтрЗапроса = «SELECT * FROM [» + ИмяЛиста+ «]»;
RecordSet = Connection.Execute(СтрЗапроса);
RecordSet.MoveNext();
ФИО = RecordSet.Fields(2).value;
Connection.Close();
RecordSet = «»;
Нов = Справочники.Сотрудники.СоздатьЭлемент();
НовГруппа = Справочники.Сотрудники.СоздатьГруппу();
НовГруппа.Наименование = «Работающие»;
НовГруппа.Записать();
Нов.Наименование = «Иванов Иван Иванович»;
СпрСотр = Справочники.Сотрудники;
Нов.Родитель = СпрСотр.НайтиПоНаименованию(«Работающие»);
Нов.ФИО = ФИО;
Нов.ДатаПриема = ‘2014.12.12’;
Нов.Записать();
КонецПроцедуры
44 — 09.12.14 — 22:36
реальный программист — из-за одной позиции целая обработка
45 — 09.12.14 — 22:44
(38) Нет, можно еще проще. Размещаешь на форме поле табличного документа, в него копируешь твой эксель через Ctrl+C — Ctrl+V и грузишь. Не надо никаких файлов конвертить/пересохранять/открывать_программно — все средствами 1С: дешево, удобно и практично.
46 — 09.12.14 — 22:45
+(45) Оу, сорри, похоже крымский мускатель в голову дал, в (36) именно об эт ом и написано.
47 — 09.12.14 — 22:47
Пойду лучше, вместо того чобы умничать, книжку почитаю про то, как наши бойцы в 43-м фашистам люлей под Днестром наваляли…
48 — 09.12.14 — 23:09
(19) и что у тебя тянется из ячейки — значение или форматное представление?
49 — 10.12.14 — 00:11
Мужики не парьтесь вы с адо и прочими методами. все выкинуть на свалку можно. поверьте человеку который 5 лет загрузку писал.
с АДо все заканчивается когда к вам попадает прайс какого нибудь 95 офиса, а таких навалом просто или еще вагон проблем.
Все это неуниверсально, ломается и выходит из строя.
50 — 10.12.14 — 00:11
Я уже молчу про получение листов. Это просто головной мозг взорвет когда пользователю надо писать имя листа который он хочет считать.
51 — 10.12.14 — 00:12
Самый универсальный сопосб и просто — буфер. Табличное поле на форме 1С. копи-паст — ВСЕ
52 — 10.12.14 — 00:28
Например, можно скачать ломаную ActiveX OLE XLSFile (или купить) и получить чтение порядка 150К ячеек в секунду и запись 100К без необходимости иметь офис. http://sm-software.com/ole-xlsfile-benchmark.htm
А если взять ее исходники и за час изваять компоненту (только не на всяком ховне типа питона) — скорость еще выше будет
53 — 10.12.14 — 00:33
(0) А может эта подойдет на сайте 1с?
—————————
1С:Предприятие — Работа с файлами
Программа «1С:Предприятие — Работа с файлами» представляет собой отдельный программный продукт, который распространяется бесплатно. Она предназначена для просмотра и редактирования файлов 1С:Предприятия на тех компьютерах, где система 1С:Предприятие не установлена.
http://v8.1c.ru/metod/fileworkshop.htm
54 — 10.12.14 — 01:17
(52) а где бы исходники то взять? декомпиляцию не предлагать плиз
изваял бы «за час» — ну пусть сутки некий форк ))
55 — 10.12.14 — 05:39
(53) Что-то я там не увидел работу с файлами, типа, *.XLS прямо из приложения 1С.
«Программа «1С:Предприятие — Работа с файлами» представляет собой отдельный программный продукт…»
56 — 10.12.14 — 08:02
(0) На инфостарте уже давно валяются несколько обработок с набором процедур для чтение .xls. Одна от Душелова, другая от Абадонны и ещё какая-то.
57 — 10.12.14 — 08:27
(0) Через ADO
58 — 10.12.14 — 08:53
(49) если в качестве входных данных может быть вообще все что угодно, то да, ADO не вариант. Но если файлы идут из одного источника и их структура боле-менее предсказуема, то ADO лучшее что можно придумать. Потому как бесплатно и есть на любом компе с виндой.
Хотя если действительно что угодно — ну хрен знает… мне как-то прайс попался из-под навижена… вроде на экселе… но цены были сделаны надписями… Т.е. в каждую ячейку был вкрячен объект «надпись» (тот что с панели рисования) и в нем цена. Вот и подумайте — ЭТО чем-нибудь считать получится?
59 — 10.12.14 — 09:04
Ну вот зачем так сложно? Нет экслея, конвертирую с помощью Yoksel файл в формат MXL и читаю средствами 1с.
Второй вариант — ставить Open Office, конвертировать в csv и читать оттуда опять же средствами 1с.
60 — 10.12.14 — 09:28
(58) вот не на любом компе с виндой. До сих пор не могу найти компоненту для WinServer 2012 R2
61 — 10.12.14 — 09:28
(36) я так понял даже открыть нет возможности…
хотя можно в гмейле или мейл.ру прицепить к письму и открыть.
и еще обработка такая на ИТС есть: ЗагрузитьИзТабличногоДокумента.
62 — 10.12.14 — 09:29
блин ну очевидно же — сохраните файл в XLSX и разберите файл средствами 1С
это кстати еще и самый быстрый способ загрузки файлов…
63 — 10.12.14 — 09:30
64 — 10.12.14 — 09:31
http://infostart.ru/public/142187/ и еще 100500 примеров по поиску по строке «чтение xlsx»
65 — 10.12.14 — 10:55
(60) в 2012 похоронили OLE DB?
66 — 10.12.14 — 14:53
(63) ок, спасибо
постараюсь сделать
67 — 10.12.14 — 15:08
(50) тоже решаемо. Список листов получается через то же АДОДБ.
На чтение 9 мин Просмотров 26.4к. Опубликовано 09.11.2017
MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.
Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.
Содержание
- Обмен через табличный документ
- Обмен через OLE
- Использование COMSafeArray
- Обмен через ADO
- Выгрузка без программирования
Обмен через табличный документ
Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:
- Записать(<ИмяФайла>, <ТипФайлаТаблицы>) для выгрузки данных в файл;
- Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>) для загрузки данных из файла.
Внимание!
Метод Записать() доступен как на клиенте, так и на сервере. Метод Прочитать() доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.
Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:
- XLS95 — формат Excel 95;
- XLS97 — формат Excel 97;
- XLSX — формат Excel 2007.
Загрузка из файла осуществляется также достаточно просто:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:
- Значение;
- Текст.
Обмен через OLE
Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:
- На компьютере конечного пользователя, если обмен происходит на стороне клиента;
- На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.
Пример выгрузки:
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель.WorkBooks.Add();
// Позиционирование на первом листе
Лист = Книга.Worksheets(1);// Запись значения в ячейку
Лист.Cells(НомерСтроки, НомерКолонки).Value = ЗначениеЯчейки;// Сохранение файла
Книга.SaveAs(ИмяФайла);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;
Примеры чтения:
// —— ВАРИАНТ 1 ——
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Открытие книги
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Close(0);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;// —— ВАРИАНТ 2 ——
// Открытие книги
Книга = ПолучитьCOMОбъект(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Application.Quit();
Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:
// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
КонецЦикла;// —— ВАРИАНТ 2 ——
НомерСтроки = 0;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Если НЕ ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:
ВсегоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();
В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:
Действие | Код | Комментарий |
Работа с приложением | ||
Установка видимости окна приложения | Эксель.Visible = Ложь; | |
Установка режима вывода предупреждений (выводить/не выводить) | Эксель.DisplayAlerts = Ложь; | |
Закрытие приложения | Эксель.Quit(); | |
Работа с книгой | ||
Создание новой книги | Книга = Эксель.WorkBooks.Add(); | |
Открытие существующей книги | Книга = Эксель.WorkBooks.Open(ИмяФайла); | |
Сохранение книги | Книга.SaveAs(ИмяФайла); | |
Закрытие книги | Книга.Close(0); | |
Работа с листом | ||
Установка текущего листа | Лист = Книга.WorkSheets(НомерЛиста); | |
Установка имени | Лист.Name = Имя; | |
Установка защиты | Лист.Protect(); | |
Снятие защиты | Лист.UnProtect(); | |
Установка ориентации страницы | Лист.PageSetup.Orientation = 2; | 1 — книжная, 2 — альбомная |
Установка левой границы | Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка верхней границы | Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка правой границы | Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка нижней границы | Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Работа со строками, колонками, ячейками | ||
Установка ширины колонки | Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | |
Удаление строки | Лист.Rows(НомерСтроки).Delete(); | |
Удаление колонки | Лист.Columns(НомерКолонки).Delete(); | |
Удаление ячейки | Лист.Cells(НомерСтроки, НомерКолонки).Delete(); | |
Установка значения | Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | |
Объединение ячеек | Лист.Range(Лист.Cells(НомерСтроки, НомерКолонки), Лист.Cells(НомерСтроки1, НомерКолонки1)).Merge(); | |
Установка шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Name = ИмяШрифта; | |
Установка размера шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Size = РазмерШрифта; | |
Установка жирного шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Bold = 1; | 1 — жирный шрифт, 0 — нормальный |
Установка курсива | Лист.Cells(НомерСтроки, НомерКолонки).Font.Italic = 1; | 1 — курсив, 0 — нормальный |
Установка подчеркнутого шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Underline = 2; | 2 — подчеркнутый, 1 — нет |
Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.
Использование COMSafeArray
При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.
// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом.SetValue(Кол, Стр, Значение);
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value = МассивКом;
Обмен через ADO
Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.
Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.
Пример выгрузки:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для команды
Команда = Новый COMОбъект(«ADODB.Command»);
Команда.ActiveConnection = Соединение;// Присвоение текста команды для создания таблицы
Команда.CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)»;
Команда.Execute(); // Выполнение команды// Присвоение текста команды для добавления строки таблицы
Команда.CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)»;
Команда.Execute(); // Выполнение команды// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение.Close();
Соединение = Неопределено;
Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:
// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект(«ADOX.Catalog»);
Книга.ActiveConnection = Соединение;// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект(«ADOX.Table»);
Таблица.Name = «Лист1»;
Таблица.Columns.Append(«Колонка1», 202);
Таблица.Columns.Append(«Колонка2», 7);
Таблица.Columns.Append(«Колонка3», 5);
Таблица.Columns.Append(«Колонка4», 5);// Создание в книге листа с описанной структурой
Книга.Tables.Append(Таблица);
Таблица = Неопределено;
Книга = Неопределено;
В приведенном примере в методе
Таблица.Columns.Append(«Колонка1», 202);
во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:
- 5 — adDouble;
- 6 — adCurrency;
- 7 — adDate;
- 11 — adBoolean;
- 202 — adVarWChar;
- 203 — adLongVarWChar.
Пример чтения:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект(«ADODB.Recordset»);
ТекстЗапроса = «SELECT * FROM [Лист1$]»;// Выполнение запроса
Выборка.Open(ТекстЗапроса, Соединение);// Обход результата выборки
Пока НЕ Выборка.EOF() Цикл
ЗначениеКолонки1 = Выборка.Fields.Item(«Колонка1»).Value; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка.Fields.Item(0).Value; // Обращение по индексу колонки
Выборка.MoveNext();
КонецЦикла;Выборка.Close();
Выборка = Неопределено;
Соединение.Close();
Соединение = Неопределено;
В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:
- YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
- NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.
В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:
- Connection;
- Command;
- Recordset;
- Record;
- Fields;
- Stream;
- Errors;
- Parameters;
- Properties.
Выгрузка без программирования
Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.
Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.
В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.
Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:
- Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
- Сохранить табличный документ в требуемый формат.
Программисту 1С часто приходится работать с таблицами Excel из 1С. Я постарался собрать небольшой FAQ и набор функций для работы с файлами Excel. Надеюсь, кому-то будет полезна данная статья.
Работать с файлами Excel можно тремя способами:
- Через OLE объект;
- Через Табличный Документ 1С.
- Через ADODB
Разберем первый способ.
1. Подключаемся к OLE и октрываем файл Excel:
//Поключимся к Excel через OLE, откроем файл и вернем список страниц
//ИмяФайла = Полный путь к файлу Excel
Соотв = Новый Соответствие;
Попытка
Листы = Новый Массив;
Excel = Новый COMОбъект("Excel.Application");
Соотв.Вставить("Соединение",Excel);
ExcelФайл = Excel.WorkBooks.Open (ИмяФайла);
Соотв.Вставить("ExcelФайл",ExcelФайл);
Для Сч = 1 По ExcelФайл.Sheets.Count Цикл
Листы.Добавить(ExcelФайл.Sheets(Сч));
КонецЦикла;
Соотв.Вставить("Листы",Листы);
лРезультат = Соотв;
Исключение
Сообщить("Ошибка создания обьекта Microsoft Excel" + ОписаниеОшибки());
лРезультат = Неопределено;
КонецПопытки;
Возврат лРезультат;
Отсоединяемся от Excel и закрываем файл:
После манипуляции с файлом необходимо его закрыть. В противном случае он останется захваченным в системе, и мы не сможем его использовать в других приложениях.
Процедура ОтключатьсяОтExcel(Соответстие)
Попытка
Соответстие["Соединение"].DisplayAlerts = 0;
Соответстие["ExcelФайл"].Close();
Соответстие["Соединение"].DisplayAlerts = 1;
Соответстие["Соединение"].Quit();
Соответстие["Соединение"] = Неопределено;
Исключение
Сообщить("Не удалось отключиться от Excel - "+ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Клиент-Серверный вариант в управляемых формах.
При работе в клиент-серверном варианте основная трудность заключается в том, что обычно файл мы загружаем на стороне клиента, а данные, как правило, обрабатываем на стороне сервера. Причем, таблицу значений нельзя передать от клиента на сервер (точнее, передать таблицу значений можно, но только в толстом клиенте. На тонком — 1С выдаст вам сообщение об ошибке). Есть два пути решения данной задачи:
1. Считываем данные из файла в массив из структур и затем этот массив передаем на сервер для дальнейших манипуляций с данными.
&НаКлиенте
Процедура Загрузить1(Команда)
Если Объект.ИмяФайла = "" Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не указан файл для загрузки";
Сообщение.Поле = "Объект.ИмяФайла";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
Соединение = ПоключитьсяКExcel(Объект.ИмяФайла);
Если Соединение = Неопределено Тогда
Возврат;
КонецЕсли;
Лист = Соединение["Листы"][0];
//Создаем Массив для строк
МассивДанных = Новый Массив;
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Для Сч = 1 по ВсегоСтрок Цикл
//Создаем структуру для текущей строки
Строка = Новый Структура;
Для Сч2 = 1 по ВсегоКолонок Цикл
Строка.Вставить("Колонка"+Строка(Сч2),Лист.Cells(Сч,Сч2).Value);
КонецЦикла;
МассивДанных.Добавить(Строка);
КонецЦикла;
Загрузить1НаСервере(МассивДанных);
КонецПроцедуры
&НаСервере
Процедура Загрузить1НаСервере(МассивДанных)
//Создадим колонки
Если МассивДанных.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Таб = РеквизитФормыВЗначение("Результат");
МассивРеквизитов = Новый Массив;
Для Каждого Кл Из МассивДанных[0] Цикл
Мас = Новый Массив;
Мас.Добавить(ТипЗнч(Кл.Значение));
Таб.Колонки.Добавить(Кл.Ключ,Новый ОписаниеТипов(Мас),Кл.Значение);
КонецЦикла;
Первая = Истина;
Для Каждого Ст ИЗ МассивДанных Цикл
Если Первая Тогда
Первая = Ложь;
Продолжить;
КонецЕсли;
ТБ = Таб.Добавить();
Для Каждого Кл из СТ Цикл
ТБ[Кл.Ключ] = Кл.Значение;
КонецЦикла;
КонецЦикла;
ОтобразитьТабНаФорме(Таб);
КонецПроцедуры
2-ой способ — это передать файл Excel на сервер через хранилище данных и далее работать с ним уже на сервере.
&НаСервере
Процедура Загрузить2НаСервере(пФайл)
лФайл = ПолучитьИмяВременногоФайла("xlsx");
лДвоичДанные = ПолучитьИзВременногоХранилища(пФайл);
лДвоичДанные.Записать(лФайл);
Соединение = ПоключитьсяКExcelСервер(Объект.ИмяФайла);
Если Соединение = Неопределено Тогда
Возврат;
КонецЕсли;
/// Обработка Excel
ОтключатьсяОтExcelСервер(Соединение);
КонецПроцедуры
&НаКлиенте
Процедура Загрузить2(Команда)
лДвоичДанные = Новый ДвоичныеДанные(Объект.ИмяФайла);
лФайл = ПоместитьВоВременноеХранилище(лДвоичДанные);
Загрузить2НаСервере(лФайл);
КонецПроцедуры
Очень часто приходится работать с очень большими файлами Excel, и его обработка путем перебора строк занимает огромное количество времени.
В таких случаех удобно в одно действие загрузить всю таблицу в массив и в потом работать уже непосредственно с массивом.
Лист = Соединение["Листы"][0];
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Область = Лист.Range(ЛистЭксель.Cells(1,1), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();
На выходе получаем двумерный массив, который содержит все данные указанного листа Excel
Полезные функции при работе с Excel:
Устанавливает видимость Excel при работе |
//0 - Excel не виден, 1 - виден. Соединение.Visible = Видимость; |
Добавление новой книги в файл Excel |
Книга = Соединение.WorkBooks.Add(); |
Сохранение книги Excel |
Книга.SaveAs(ИмяФайла); |
Добавление нового листа к книге |
Лист = Книга.WorkSheets.Add(); |
Переименование листа |
Лист.Name = ИмяЛиста; |
Изменение маштаба листа |
//"Масштаб" (от 10 до 400). Лист.PageSetup.Zoom = Масштаб; |
Изменение ориентации листа |
//1 - книжная, 2 - альбомная. Лист.PageSetup.Orientation = Ориентация; |
Отступы листа |
//Левый отступ Лист.PageSetup.LeftMargin = Соединение.CentimetersToPoints(Сантиметры); //Верхний отступ Лист.PageSetup.TopMargin = Соединение.CentimetersToPoints(Сантиметры); //Правый отступ Лист.PageSetup.RightMargin = Соединение.CentimetersToPoints(Сантиметры); //Нижний отступ Лист.PageSetup.BottomMargin = Соединение.CentimetersToPoints(Сантиметры); |
Обращение к ячейки чтение/запись |
//Прочитать значение ячейки //Сч = Номер строки //Сч2 = Номер колонки Данные = Лист.Cells(Сч,Сч2).Value //Записать значение в ячейку Лист.Cells(Сч,Сч2).Value = Данные |
Обращение к области ячеек |
//В качестве параметров передаем ячейки по диогонали Лист.Range(ЛистЭксель.Cells(1,1),ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок)) |
Очень часто при чтении или записи значений в Excel ставятся лишние пробелы в числе, например, вместо 1502 он читает как 1 502 и в дальнейшем это значение не приводится к числу. Эту проблему можно решить заменой. |
ЗначениеЯчейки = Лист.Cells(1,3).Value; СтрЗаменить(Строка(ЗначениеЯчейки),Символы.НПП,""); |
Объединение ячеек |
Лист.Range(Лист.Cells(1,1),Лист.Cells(10,1)).Merge(); |
Работа с именованными ячейками в Excel |
Обл = Лист.Range("Имя_Ячейки_В_Excel").Select(); Обл.Value = "Присваиваем значение"; |
Удаление ячейки |
Лист.Cells(1,3).Delete(); |
Удаление области ячеек |
Лист.Range(Лист.Cells(1,1),Лист.Cells(10,1)).Delete(); |
Обращение к строке |
//Сч = Номер строки Лист.Rows(Сч) |
Изменение ширины колонки |
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; |
Обращение к колонке |
//Сч = Номер Колонки Лист.Cols(Сч) |
Удаление Строки |
Лист.Rows(Сч).Delete() |
Фон ячейки / области / Строки / |
//Фон Ячейки Лист.Cells(1,1).Interior.Color = ПолучитьЦветExcelRGB(10,10,10); //Фон Области Лист.Range(Лист.Cells(1,1),Лист.Cells(10,1)).Interior.Color = ПолучитьЦветExcelRGB(10,10,10); //Фон строки Лист.Rows(Сч).Interior.Color = ПолучитьЦветExcelRGB(10,10,10); |
Функция переводит цвет из формата RGB в формат Excel |
Функция ПолучитьЦветExcelRGB(R,G,B) Возврат ((B*256) + G) * 256 + R; КонецФункции |
Управление шрифтом в ячейки/строке/области |
//Изменение шрифта Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; //Изменение размера шрифтв Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; //Управление жирностью шрифта //1-жирный шрифт (bold) //0-нормальный шрифт (normal) Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; //Управление курсивом шрифта //1-Курсив //0-Нормальный Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; //2 - Подчеркнутый шрифт //1- нет Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; |
Разрешает переносить по словам в ячейке |
//1-Переносить Лист.Cells(1, 1).WrapText = 1; |
Управление рамкой ячейки |
//1 - Тонкая сплошная линия Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; |
Устанавливаем формат ячейки |
//"@" - текстовый //"0.00" - числовой Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; |
Формула в ячейки |
Лист.Cells(Сч,Сч2).FormulaLocal = "=ОКРУГЛ(135,46456;0)"; |
Формула в ячейки |
Лист.Cells(Сч,Сч2).FormulaLocal = "=ОКРУГЛ(135,46456;0)"; |
Формула в ячейки |
Лист.Cells(Сч,Сч2).FormulaLocal = "=ОКРУГЛ(135,46456;0)"; |
Формула в ячейки |
Лист.Cells(Сч,Сч2).FormulaLocal = "=ОКРУГЛ(135,46456;0)"; |
Функция для получения ширины колонки Excel Спасибо пользователю goodwill |
&НаКлиенте Функция ПолучитьШиринуКолнкиЭксель(ПараметрШиринаВПикселях) Если ПараметрШиринаВПикселях > 9 Тогда ШиринаВСимволах = (ПараметрШиринаВПикселях/0.75-5)/7; Иначе ШиринаВСимволах = ПараметрШиринаВПикселях/9; КонецЕсли; Возврат ШиринаВСимволах; КонецФункции Лист.Columns("A").ColumnWidth = ПолучитьШиринуКолнкиЭксель(РазмерШиринаВПикселях); |
Разрешить перенос слов в ячейке Спасибо пользователю roofless |
Лист.Cells(1, 1).WrapText = 1; |
Группировки данных на листе Спасибо пользователю dr-wit, ignor |
1. Развернуть все группы (строки и колонки): Excel.ActiveSheet.Outline.ShowLevels(3, 3); 2. Сернуть все группы (строки и колонки) до первого уровня: Excel.ActiveSheet.Outline.ShowLevels(1, 1); 3. Вернуть глубину дерева Лист.Rows(Инд).OutlineLevel |
При работе с Excel мы оперируем столбцами как числом (Например, 1 столбец), а у Excel адресация столбцов производится с помощью символов. И когда нам нужно отредактировать формулу, то нам нужно номер столбца преобразовать в символ. В таких случаях вам пригодится эта функция.
Функция ПреобразоватьНомерСтолбцаВФорматExcel(Столбец)
стСтолбец = "";
А = Окр(Столбец/27,0);
В = Столбец - (А*26);
Если А>0 Тогда
стСтолбец = Символ(А+64);
КонецЕсли;
Если В>0 Тогда
стСтолбец = стСтолбец + Символ(В+64);
КонецЕсли;
Возврат стСтолбец;
КонецФункции
2. Работа с Excel через ТабличныйДокумент 1С
С помощью данного метода можно и загружать из Excel и выгружать в Excel. Но на мой взгляд этот метод идепально подходит когда вам необходимо посто сохранить информацию в Excel без дальнейшей манипуляции.
Итак, приступим: загрузка из Excel:
1. Загружаем файл Excel в табличный документ
//Файл - это файл Excel
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
Возврат Неопределено;
КонецПопытки;
2. Производим манипуляции уже с ТабличнымДокументом
//Создадим ТЗ куда будем собирать инфу
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Номенклатура",Новый ОписаниеТипов("Строка"));
Таб.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число"));
Таб.Колонки.Добавить("Цена",Новый ОписаниеТипов("Число"));
//Определяем количество строк
КолСтр = ТабДок.ВысотаТаблицы;
Для Сч = 2 по КолСтр Цикл
Попытка
ТБ = Таб.Добавить();
//Обращаемся к ячейки и забираем данные
ТБ.Номенклатура = Строка(ТабДок.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0") + "C" + 1).ТекущаяОбласть.Текст);
ТБ.Количество = Число(ТабДок.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0") + "C" + 2).ТекущаяОбласть.Текст);
ТБ.Цена = Число(ТабДок.ПолучитьОбласть("R" + Формат(Сч, "ЧГ=0") + "C" + 3).ТекущаяОбласть.Текст);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось загрузить строку "+Строка(Сч);
Сообщение.Сообщить();
КонецПопытки;
КонецЦикла;
Давайте теперь разберем сохранение в Excel с помощью данного метода:
Тут все очень просто сначала мы формируем обычный Табличный документ и затем записываем его в Excel
//ТабДок - Табличный документ
ТабДок.Записать(Объект.ИмяФайла,ТипФайлаТабличногоДокумента.XLSX);
2. Работа с Excel ADODB
Выражаю особую благодарность коллеги Fragster за хороший комментарий
Данный метод позволяет работать с Excel через ODBC и имеет ряд преимуществ:
- Не требует установки самой Excel, необходима лишь установить ODBC. Но как правило он уже установлен. Это особенность позволяет работать на стороне сервера без дополнительных установок Excel.
- Позволяет работать с таблицой Excel как с БД и строить к ней запросы на T-SQL. Таким образом мы можем делать отборы еще на этапе чтения данных и другие преимущества что дает Т-SQL. Что на мой взгляд огромный плюс.
Подключение к ADO
Функция СоединитьсяСADO(ИмяФайла)
//Поз = СтрНайти(ИмяФайла,"",НаправлениеПоиска.СКонца);
Поз = 0;
Найден = 1;
ТмпСтр = ИмяФайла;
Пока Найден <> 0 Цикл
Найден = Найти(ТмпСтр,"");
ТмпСтр = Прав(ТмпСтр,СтрДлина(ТмпСтр) - Найден);
Если Найден <> 0 Тогда
Поз = Найден;
КонецЕсли;
КонецЦикла;
Путь = Лев(ИмяФайла,Поз-1);
Данные = Новый Структура;
СтрокаСоединения = "
| Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+СокрЛП(ИмяФайла)+";
| Extended Properties=""Excel 12.0 Xml;HDR=YES""";
Соединение = Новый COMОбъект("ADODB.Connection");
Попытка
Соединение.Open(СтрокаСоединения);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+ИмяФайла+"] открыт другим пользователем.");
Возврат Неопределено;
КонецПопытки;
Данные.Вставить("Соединение",Соединение);
Возврат Данные;
КонецФункции
Строка подключения зависит от версии ODBC. И вызывает наибольшие трудности при подключение поэтомя я рекомендую ее сгенерировать на сайте http://www.connectionstrings.com
Отключение от ADO
Процедура ОтключитьсяОтADO(Подключение)
Попытка
Подключение["Соединение"].Close();
Подключение = Неопределено;
Исключение
КонецПопытки;
КонецПроцедуры
Выполнение запроса
Функция ВыполнитьЗапросADO(ТекстЗапроса,Подключение)
Попытка
Записи = Новый COMОбъект("ADODB.Recordset");
Исключение
Сообщить ("Не удалось Создать к Microsoft Excel Driver!!!");
Возврат Неопределено;
КонецПопытки;
Попытка
Записи.Open(ТекстЗапроса, Подключение["Соединение"]);
Возврат Записи;
Исключение
Сообщить ("Проблемы с выполнением запроса");
КонецПопытки;
КонецФункции
Пример запроса:
//Сразу отбираем только не пустые номенклатуры
ТекстЗапроса = "SELECT * FROM [Лист1$] WHERE `Номенклатура`<>""""";
Запись в Excel тоже производится в виде запроса:
ТекстЗапроса = "
|INSERT INTO [Лист1$] (`Номенклатура`,`Количество`,`Цена`,`Сумма`) VALUES ('"
+ТБ.Номенклатура+"','"+ТБ.Количество+"','"+ТБ.Цена+"','"+ТБ.Сумма+"')";
Хочу отметить что наименование полей производится по первой строке в таблице
ADODB предоставляет ряд объектов, с которыми мы работаем
ADODB.Connection предназначен для соединения с ADO |
|
ADOX.Table для работы с таблицей |
|
ADODB.Command Для выполнения комманд на языке T-SQL |
|
ADODB.Recordset Похож на ADODB.Command предназначен для выполнения запросов и обработки результата |
|
В файле продемонстрированны оба варианта работы с запросами.
На этом пока все. По возможности буду дополнять статью 🙂
В архиве находится обработка, которая демонстрирует все описанные и другие возможности при работе с Excel.
И тренировочный файл Excel.
Раньше всегда делала загрузку из Excel используя объект «Excel.Application». Прочитала в интернете, что используя объект «ADODB.Connection» можно открывать файлы с данными, не запуская и не используя приложения которые эти файлы создают… Нашла простенький пример, чтобы научиться пользоваться этим объектом: db.Close; Но мне выдает ошибку: Microsoft JET Database Engine: Нераспознаваемый формат базы данных: ‘C:03092008.xls’. Подскажите где можно прочитать про этот «ADODB.Connection»??? Кто — нибудь работал с ним? Буду рада любым полезны ссылкам или готовым загрузкам… Заранее всем большое спасибо!!!!
Поищи «Йоксель» — проще будет
Проблема в том, что на машину, где будет выполняться обработка поставить excel я не могу. Подскажите, пожалуйста, что делать???
Я так делал — все получалось
автор куда пропала? книжку нашел
РЕК, какую книжку вы нашли? Можете мне скинуть? Я вам почтовый ящик или аську свою напишу….
она 57 метров в архиве занимает…:( , давайте поробую на мыло сбросить, если получиться
Да…. большая книжка…. я потом замучуюсь ее скачивать…. Но хорошо, мой почтовый ящик smile-nati@mail.ru Если вы скинете, напишите пожалуста. Заранее спасибо.
попытаюсь скинуть…попробуйте пока в инете поискать: Андрей Михайлов 1С предприятие системное программирование
Хорошо. Спасибо. Сейчас попробую.
Cthulhu, спасибо большое за вашу ссылку — сейчас разбираюсь в возможностях йокселя… Интерессная эта внешняя компонента!!! Надо бы получше изнать ее возможности… СПАСИБО!!!!
Не получилось сбросить, если не надете, пишите, попробую сбросить
Не о йти подходящей ссылки. Или по частям или 500 метров или платить надо или не скачивается… Если не получается скинуть на почту — может подскажете ссылку, с которой вы скачивали???
попроси может сначала эти рисунки его через файнридер в док или пдф зангать?.. ))))
Cthulhu, помогите пожалуста разобраться в йокселе. Я скачала yoksel_release_1_0_0.7z В нем сплошные ошибки. Что вы скачивали и у вас демонстрационная конфигурация работает без ошибок???
: угу, такой и есть… странно, у меня все работает (кроме того, что требует 1с++) да и юзаю в полный рост, главбушка пищит от собирания здоровенных mxl-файлов на листы XLS-книги, да и от прочего чего я успел ей намутить…
ЗЫ: кстати, «В НЕМ сплошные ошибки» — немного разочаровало, извините.. это не «в нем»… ))))
РЕК, спасибо я написала по вашему примеру и нашла в чем была у меня ошибка. Оказывается названия колонок не могут быть написаны русскими буквами… Но мне надо загрузить именно в таком виде. Не подскажете, что сделать???
Йокселем грузится нормально и даже заглавия столбцов русскими буквами по АДО столкнлся с тем что не загружается весь файл… причину не нашел..
может тогда лучше XML использовать? Ну, так — чтобы без нездоровых велосипедов…
РЕК, спасибо вам большое!!! Я скачала книжку и сейчас попробую по ней все сделать!!!
Тэги:
Комментарии доступны только авторизированным пользователям
Содержание
- Перенос данных из Эксель в 1С
- Подготовка данных
- Подключение внешнего загрузчика
- Загрузка данных
- Вопросы и ответы
Уже давно самой популярной программой среди бухгалтеров, планировщиков, экономистов и управленцев стало приложение 1C. Оно имеет не только разнообразное количество конфигураций для различных видов деятельности, но и локализации под стандарты учета в нескольких странах мира. Все больше предприятий переходят на ведение учета именно в этой программе. Но процедура переноса данных вручную из других программ учета в 1C — довольно долгое и скучное занятие, отнимающее массу времени. Если на предприятии велся учет с помощью Excel, то процесс переноса можно существенно автоматизировать и ускорить.
Производить перенос данных из Excel в 1С требуется не только на начальном периоде работы с данной программой. Иногда наступает необходимость подобного, когда по ходу деятельности нужно занести какие-то списки, хранящиеся в книге табличного процессора. Например, если требуется перенести прайс-листы или заказы из онлайн-магазина. В случае, когда списки небольшие, то их можно вбить и вручную, но что делать, если они содержат сотни наименований? Для того, чтобы ускорить процедуру, можно прибегнуть к некоторым дополнительным возможностям.
Для автоматической загрузки подойдут практически все типы документов:
- Список номенклатуры;
- Список контрагентов;
- Список прайсов;
- Перечень заказов;
- Информация о покупках или продажах и т.д.
Сразу нужно отметить, что в 1С нет встроенных инструментов, которые позволяли бы переносить данные из Эксель. Для этих целей нужно подключить внешний загрузчик, который представляет собой файл в формате epf.
Подготовка данных
Нам нужно будет подготовить данные в самой таблице Excel.
- Любой список, загружаемый в 1С, должен быть однородно структурирован. Нельзя выполнять загрузку при наличии в одном столбце или ячейке данных нескольких типов, например, имя человека и его телефонный номер. В этом случае, такие двойные записи обязательно следует разделять в разные столбцы.
- Не допускается наличия объединенных ячеек даже в заголовках. Это может привести к некорректным результатам при переносе данных. Поэтому, если объединенные ячейки имеются, их нужно разделить.
- Если исходную таблицу сделать максимально простой и понятной, без применения относительно сложных технологий (макросы, формулы, комментарии, сноски, лишние элементы форматирования и т.д.), то это поможет максимально предотвратить проблемы на дальнейших шагах переноса.
- Обязательно следует привести наименование всех величин к единому формату. Не допускается наличие обозначения, например, килограмм, отображаемого разными записями: «кг», «килограмм», «кг.». Программа будет их понимать как разные величины, поэтому нужно выбрать один вариант записи, а остальные исправить под этот шаблон.
- Обязательно наличие уникальных идентификаторов. В их роли может выступать содержимое любого столбца, которое не повторяется в других строках: индивидуальный налоговый номер, артикул и т.д. Если в существующей таблице нет столбца с подобным значением, то можно добавить дополнительную колонку и произвести там простую нумерацию. Это нужно для того, чтобы программа смогла идентифицировать данные в каждой строке отдельно, а не «сливала» их вместе.
- Большинство обработчиков файлов Эксель не работает с форматом xlsx, а только с форматом xls. Поэтому, если наш документ имеет расширение xlsx, то нужно его конвертировать. Для этого переходим во вкладку «Файл» и жмем на кнопку «Сохранить как».
Открывается окно сохранения. В поле «Тип файла» по умолчанию будет указан формат xlsx. Меняем его на «Книга Excel 97-2003» и жмем на кнопку «Сохранить».
После этого документ будет сохранен в нужном формате.
Кроме этих универсальных действий по подготовке данных в книге Эксель, нужно будет ещё привести документ в соответствие с требованиями конкретного загрузчика, который мы будем использовать, но об этом мы поговорим чуть ниже.
Подключение внешнего загрузчика
Подключить внешний загрузчик с расширением epf к приложению 1С можно, как до подготовки файла Эксель, так и после. Главное, чтобы к началу процесса выполнения загрузки оба этих подготовительных момента были решены.
Существует несколько внешних загрузчиков таблиц Эксель для 1С, которые созданы различными разработчиками. Рассматривать мы будем пример с использованием инструмента для обработки информации «Загрузка данных из табличного документа» для версии 1С 8.3.
- После того, как файл в формате epf скачан и сохранен на жестком диске компьютера, запускаем программу 1С. Если файл epf упакован в архив, то его предварительно нужно извлечь оттуда. На верхней горизонтальной панели приложения жмем на кнопку, запускающую меню. В версии 1С 8.3 она представлена в виде вписанного в оранжевую окружность треугольника, перевернутого углом вниз. В появившемся списке последовательно переходим по пунктам «Файл» и «Открыть».
- Запускается окно открытия файла. Переходим в директорию его расположения, выделяем тот объект и жмем на кнопку «Открыть».
- После этого загрузчик запустится в 1С.
Скачать обработку «Загрузка данных из табличного документа»
Загрузка данных
Одной из основных баз данных, с которыми работает 1C, является список номенклатуры товаров и услуг. Поэтому для описания процедуры загрузки из Excel остановимся на примере переноса именно этого типа данных.
- Возвращаемся к окну обработки. Так как мы будем загружать номенклатуру товаров, то в параметре «Загрузка в» переключатель должен стоять в позиции «Справочник». Впрочем, он так установлен по умолчанию. Переключать его следует только тогда, когда вы собрались переносить другой тип данных: табличную часть или регистр сведений. Далее в поле «Вид справочника» кликаем по кнопке, на которой изображено многоточие. Открывается выпадающий список. В нем нам следует выбрать пункт «Номенклатура».
- После этого обработчик автоматически расставляет те поля, которые программа использует в этом виде справочника. Нужно сразу отметить, что совсем не обязательно заполнять все поля.
- Теперь опять открываем переносимый документ Excel. Если наименование его колонок отличается от наименования полей справочника 1С, которые содержат соответствующие, то нужно переименовать эти столбцы в Экселе так, чтобы названия полностью совпадали. Если в таблице имеются столбцы, для которых в справочнике нет аналогов, то их следует удалить. В нашем случае такими столбцами являются «Количество» и «Цена». Также следует добавить, что порядок расстановки столбцов в документе должен строго совпадать с тем, который представлен в обработке. Если для некоторых столбцов, которые отображены в загрузчике, у вас нет данных, то эти колонки можно оставлять пустыми, но нумерация тех столбцов, где имеются данные, должна совпадать. Для удобства и быстроты редактирования можно применять специальную возможность Эксель для быстрого перемещения колонок местами.
После того, как данные действия произведены, жмем на значок «Сохранить», который представлен в виде пиктограммы, изображающей дискету в верхнем левом углу окна. Затем закрываем файл, нажав на стандартную кнопку закрытия.
- Возвращаемся в окно обработки 1С. Жмем на кнопку «Открыть», которая изображена в виде папки желтого цвета.
- Запускается окно открытия файла. Переходим в директорию, где расположен документ Эксель, который нам нужен. Переключатель отображения файлов по умолчанию установлен для расширения mxl. Для того чтобы показать нужный нам файл, его требуется переставить в позицию «Лист Excel». После этого выделяем переносимый документ и жмем на кнопку «Открыть».
- После этого содержимое открывается в обработчике. Чтобы проверить корректность заполнения данными, жмем на кнопку «Контроль заполнения».
- Как видим, инструмент контроля заполнения сообщает нам, что ошибки не найдены.
- Теперь перемещаемся во вкладку «Настройка». В «Поле поиска» ставим галочку в той строке, которая у всех наименований, заносимых в справочник номенклатуры, будет уникальная. Чаще всего для этого используют поля «Артикул» или «Наименование». Это нужно делать для того, чтобы при добавлении новых позиций в список, данные не задваивались.
- После того, как все данные внесены и настройки выполнены, можно переходить к непосредственной загрузке информации в справочник. Для этого кликаем по надписи «Загрузить данные».
- Выполняется процесс загрузки. После её завершения можно перейти в справочник номенклатуры и убедиться, что все нужные данные туда добавлены.
Урок: Как поменять столбцы местами в Excel
Мы проследили процедуру добавления данных в справочник номенклатуры в программе 1C 8.3. Для других справочников и документов загрузка будет проводиться по тому же принципу, но с некоторыми нюансами, с которыми пользователь сможет разобраться самостоятельно. Также нужно заметить, что у различных сторонних загрузчиков процедура может отличаться, но общий подход остается у всех одинаковый: сначала обработчик загружает из файла информацию в окно, где производится её редактирование, а уже потом она добавляется непосредственно в базу данных 1С.
Еще статьи по данной теме: