Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект( ПутьДоExcel) ;
Исключение
Сообщить( "Произошла ошибка при обращение к Excel:" + Символы. ПС + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
ЗакрытьФормуИндиктаора = Ложь ;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина ;
ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. Открыть( ) ;
КонецЕсли ;
ФормаИндикатора. КомментарийЗначения = "Загрузка данных из Excel..." ;
ТЗ = Новый ТаблицаЗначений( ) ;
Страница = Док. Sheets( НомерСтраницы) ;
МакСтрок = Страница. UsedRange. Rows. Count;
МакСтолб = Страница. UsedRange. Columns. Count;
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница. Cells( 1 , Столбец) . Value;
ИмяСтолбца = СокрЛП( ИмяСтолбца) ;
ИмяСтолбца = СтрЗаменить( ИмяСтолбца, " " , "_" ) ;
КонецЕсли ;
ТЗ. Колонки. Добавить( ИмяСтолбца, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
НачальнаяСтрока = 1 ;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2 ;
КонецЕсли ;
Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ. Добавить( ) ;
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница. Cells( НомСтрока, НомСтолбец) . Value;
СтрТЗ[НомСтолбец- 1 ] = Данные;
КонецЦикла ;
ФормаИндикатора. ЭлементыФормы. Индикатор. Значение = НомСтрока/ МакСтрок * 100 ;
КонецЦикла ;
Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора. Закрыть( ) ;
КонецЕсли ;
Возврат ТЗ;
КонецФункции
Пример вызова:
Код 1C v 8.х ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. НаименованиеОбработкиДанных = "Загрузка данных..." ;
ФормаИндикатора. Открыть( ) ;
ТЗ = ИзExcelВТаблицу( ФайлExcel, 1 , Истина , ФормаИндикатора) ;
Если ТЗ = Неопределено тогда
ФормаИндикатора. Закрыть( ) ;
Возврат ;
КонецЕсли ;
ФормаИндикатора. Закрыть( ) ;
или
Код 1C v 8.х ТЗ = ИзExcelВТаблицу( ФайлExcel) ;
Если ТЗ = Неопределено тогда
Возврат ;
КонецЕсли ;
Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х
Функция ЭлементСправочника(ИмяСправочника = "" ,ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить( "Укажите имя спрачоника - ЭлементСправочника()" ) ;
Возврат Неопределено ;
КонецЕсли ;
Если ПустаяСтрока( ИмяЭлемента) тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = Неопределено ;
Если ИмяРодителя < > Неопределено тогда
ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника]. ПустаяСсылка( ) ;
Пока НЕ ПустаяСтрока( ОбрабатИмяРодителя) цикл
ПозРазделителя = Найти( ОбрабатИмяРодителя, "\\" ) ;
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред( ОбрабатИмяРодителя, 1 , ПозРазделителя- 1 ) ;
ОбрабатИмяРодителя = Сред( ОбрабатИмяРодителя, ПозРазделителя+ 2 ) ;
КонецЕсли ;
ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник." + ИмяСправочника+ " КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа" ;
ЗапросРодителя = Новый Запрос( ТексЗапроса) ;
ЗапросРодителя. УстановитьПараметр( "Родитель" , РодительГруппы) ;
ЗапросРодителя. УстановитьПараметр( "Наименование" , ИмяГруппы) ;
РезультатРодителя = ЗапросРодителя. Выполнить( ) . Выгрузить( ) ;
Если РезультатРодителя. Количество( ) < > 0 тогда
РодительГруппы = РезультатРодителя[0 ]. Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника]. СоздатьГруппу( ) ;
ОбъектРодитель. Родитель = РодительГруппы;
ОбъектРодитель. Наименование = ИмяГруппы;
ОбъектРодитель. Записать( ) ;
РодительГруппы = ОбъектРодитель. Ссылка;
КонецЕсли ;
КонецЦикла ;
Родитель = РодительГруппы;
КонецЕсли ;
Элемент = Справочники[ИмяСправочника]. НайтиПоНаименованию( ИмяЭлемента) ;
ОбъектЭлемент = Неопределено ;
Если Элемент. Пустая( ) тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника]. СоздатьЭлемент( ) ;
ОбъектЭлемент. Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли ;
Иначе
ОбъектЭлемент = Элемент. ПолучитьОбъект( ) ;
КонецЕсли ;
Если ОбъектЭлемент < > Неопределено тогда
Если Параметры < > Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр. Ключ] = СтрПараметр. Значение;
КонецЦикла ;
КонецЕсли ;
Если Родитель < > Неопределено тогда
ОбъектЭлемент. Родитель = Родитель;
КонецЕсли ;
ОбъектЭлемент. Записать( ) ;
Элемент = ОбъектЭлемент. Ссылка;
КонецЕсли ;
Возврат Элемент;
КонецФункции
Автор:
borismor Код 1C v 8.х Процедура ЗаполнитьНажатие(Элемент)
запрос = СоставитьЗапрос( ) ;
ТаблицаВывода = Новый ТаблицаЗначений;
ТаблицаВывода. Очистить( ) ;
ТаблицаВывода = ЗапросКСкуль( CRM_MSSQL_Сервер, CRM_MSSQL_БазаДанных, CRM_MSSQL_Логин, CRM_MSSQL_Пароль, Запрос) ;
ТабличноеПоле. Очистить( ) ;
ЭлементыФормы. ТабличноеПоле. Значение= ТаблицаВывода;
ЭлементыФормы. ТабличноеПоле. СоздатьКолонки( ) ;
КонецПроцедуры
Функция ЗапросКСкуль(SQLServer,DSN,Login,Password,txtSQL)
Соединение = Новый COMОбъект( "ADODB.Connection" ) ;
НаборЗаписей = Новый ComObject( "ADODB.RecordSet" ) ;
Команда = Новый COMОбъект( "ADODB.Command" ) ;
Соединение. ConnectionString = ( "Provider=SQLOLEDB; Data Source = " ) + SQLServer +
( ";Initial Catalog=" ) + DSN + ( ";UID=" ) + Login + ( "; PWD=" ) + Password + ( ";" ) ;
Соединение. ConnectionTimeOut = 15 ;
Соединение. Open( ) ;
Команда. ActiveConnection = Соединение;
Команда. CommandText = txtSQL;
НаборЗаписей = Команда. Execute ( ) ;
Таблица = Новый ТаблицаЗначений;
Для НомерСтолбца = 0 По НаборЗаписей. Fields. Count- 1 Цикл
ИмяСтолбца = НаборЗаписей. Fields. Item( НомерСтолбца) . Name;
Таблица. Колонки. Добавить( ИмяСтолбца) ;
КонецЦикла ;
Пока НЕ НаборЗаписей. EOF Цикл
НоваяСтрока = Таблица. Добавить( ) ;
Для НомерСтолбца = 0 По НаборЗаписей. Fields. Count- 1 Цикл
НоваяСтрока. Установить( НомерСтолбца, НаборЗаписей. Fields( НомерСтолбца) . Value) ;
КонецЦикла ;
НаборЗаписей. MoveNext( ) ;
КонецЦикла ;
Соединение. Close( ) ;
Возврат Таблица;
КонецФункции
Код 1C v 8.х Функция ЗапросSQL (SQLServer,Login,Password,ТекстSQL) //Функция выборки данных из SQL сервера и передача во временную таблицу 1С
СтрокаСоединения = ( "Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = " ) + SQLServer +
( ";UID=" ) + Login + ( "; PWD=" ) + Password + ( ";" ) ;
Подключение = Новый ComObject( "ADODB.Connection" ) ;
Подключение. ConnectionString= СтрокаСоединения;
Попытка
Подключение. Open( СтрокаСоединения) ;
Состояние ( "Подключение к серверу SQL..." ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат Ложь ;
КонецПопытки ;
СоединениеSQL = Новый COMObject( "ADODB.Command" ) ;
СоединениеSQL. ActiveConnection = Подключение;
СоединениеSQL. NamedParameters = True;
СоединениеSQL. CommandText = ТекстSQL;
СоединениеSQL. CommandType = 1 ;
Param1 = СоединениеSQL. CreateParameter( "n" , 3 , 1 , 1 , 1 ) ;
СоединениеSQL. Parameters. Append( Param1) ;
Param2 = СоединениеSQL. CreateParameter( "ДатаПриходаС" , 200 , 1 , 8 , Формат( НачалоПериода, "ДФ=ггггММдд" ) ) ;
СоединениеSQL. Parameters. Append( Param2) ;
Param3 = СоединениеSQL. CreateParameter( "ДатаПриходаПо" , 200 , 1 , 8 , Формат( КонецПериода, "ДФ=ггггММдд" ) ) ;
СоединениеSQL. Parameters. Append( Param3) ;
СоединениеSQL. Parameters. Refresh( ) ;
Состояние ( "Выполнение запроса SQL..." ) ;
ЗаписиSQL = Новый ComObject( "ADODB.RecordSet" ) ;
ЗаписиSQL = СоединениеSQL. Execute( ) ;
Таблица = Новый ТаблицаЗначений;
Состояние ( "Заполнение временной таблицы..." ) ;
Для НомерСтолбца = 0 По ЗаписиSQL. Fields. Count- 1 Цикл
ИмяСтолбца = ЗаписиSQL. Fields. Item( НомерСтолбца) . Name;
Таблица. Колонки. Добавить( ИмяСтолбца) ;
Сообщить( ИмяСтолбца) ;
КонецЦикла ;
Пока ЗаписиSQL. EOF = 0 Цикл
НоваяСтрока = Таблица. Добавить( ) ;
Для НомерСтолбца = 0 По ЗаписиSQL. Fields. Count- 1 Цикл
НоваяСтрока. Установить( НомерСтолбца, ЗаписиSQL. Fields( НомерСтолбца) . Value) ;
Сообщить ( "Test " + ЗаписиSQL. Fields( ИмяСтолбца) . Value + ИмяСтолбца) ;
КонецЦикла ;
ЗаписиSQL. MoveNext( ) ;
КонецЦикла ;
Состояние ( "Закрываем соединение с SQL..." ) ;
ЗаписиSQL. Close( ) ;
Подключение. Close( ) ;
Возврат Таблица;
КонецФункции