Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL.
При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть).
Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1 ;
НачалоСтолбец = 1 ;
КонецЕсли ;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтрока < ТабДок. ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1 ;
КонецЦикла ;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1 ;
Пока НЕ ТабДок. Область( НачалоСтрока, НачалоСтолбец) . СодержитЗначение
И НачалоСтолбец < ТабДок. ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1 ;
КонецЦикла ;
КонецЕсли ;
КонецСтрока = ? ( КонецСтрока = Неопределено , ТабДок. ВысотаТаблицы, КонецСтрока) ;
КонецСтолбец = ? ( КонецСтолбец = Неопределено , ТабДок. ШиринаТаблицы, КонецСтолбец) ;
ЭтоТаблица = ( ТипЗнч( СтруктураКолонок) = Тип( "ТаблицаЗначений" ) ) ;
ТабЗначений = ПолучитьТаблицуВывода( СтруктураКолонок) ;
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений. Добавить( ) ;
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ? ( ЭтоТаблица, Колонка. Наименование, Колонка. Ключ) ;
пИндексКолонки = ? ( ЭтоТаблица, Колонка. СтолбецОтчёт, ИндексКолонки) ;
Если ТабДок. Область( ИндексСтроки, пИндексКолонки) . СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок. Область( ИндексСтроки, пИндексКолонки) . Текст;
КонецЕсли ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
КонецЦикла ;
Возврат ТабЗначений;
КонецФункции ;
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли ;
НачалоСтрока = ? ( НачалоСтрока = Неопределено , 1 , НачалоСтрока) ;
НачалоСтолбец = ? ( НачалоСтолбец = Неопределено , 1 , НачалоСтолбец) ;
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Текст = ? ( ПустаяСтрока( Колонка. Заголовок) , Колонка. Имя, Колонка. Заголовок) ;
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЕсли ;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений. Колонки Цикл
ТабДок. Область( ИндексСтроки, ИндексКолонки) . СодержитЗначение = Истина ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . ТипЗначения = Новый ОписаниеТипов( Колонка. ТипЗначения) ;
ТабДок. Область( ИндексСтроки, ИндексКолонки) . Значение = Элемент[Колонка. Имя];
ИндексКолонки = ИндексКолонки + 1 ;
КонецЦикла ;
ИндексСтроки = ИндексСтроки + 1 ;
КонецЦикла ;
Возврат ТабДок;
КонецФункции ;
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок. Прочитать( ИмяФайла) ;
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл1 = ТабДок. Область( 1 , ИндексКолонки) ;
Обл2 = ТабДок. Область( 2 , ИндексКолонки) ;
ИмяКолонки = СокрЛП( Обл1 . Текст) ;
ИмяКолонки = ? ( Найти( ИмяКолонки, " " ) > 0 , СтрЗаменить( ТРег( ИмяКолонки) , " " , "" ) , ИмяКолонки) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок. ШиринаТаблицы Цикл
Обл2 = ТабДок. Область( 1 , ИндексКолонки) ;
ИмяКолонки = "К" + Формат( ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0" ) ;
СтруктураКолонок. Вставить( ИмяКолонки, ? ( Обл2 . СодержитЗначение, Обл2 . ТипЗначения, Новый ОписаниеТипов) ) ;
КонецЦикла ;
КонецЕсли ;
Таблица = ПреобразоватьТДвТЗ( ТабДок, СтруктураКолонок, ? ( ЕстьЗаголовок, 2 , 1 ) , 1 ) ;
Возврат Таблица;
КонецФункции ;
Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт
ТабДок = ПреобразоватьТЗвТД( ТабЗначений, Неопределено , 1 , 1 , ЕстьЗаголовок) ;
ТабДок. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. MXL) ;
КонецПроцедуры ;
Еще небольшой набор функций для вывода таблицы значений в табличный документ. После формирования табличного документа, - сохраняем его в файл mxl.
Табличный документ можно сохранить a файлы следующих типов:
ANSITXT - Текстовый документ DOCX - документ MS Word HTML HTML3 HTML4 HTML5 MXL MXL7 ODS - Файл Open Office PDF - файл Acrobat Readr TXT - Текстовый документ XLS - файл Excel XLS95 - файл Excel95 XLS97 - файл Excel97 XLSX - файл Excel2010
Код 1C v 8.3
Функция ЗагрузитьТЗизФайла(ИмяФайла)
Путь = КаталогВременныхФайлов( ) + ИмяФайла;
Текст = Новый ЧтениеТекста( Путь, КодировкаТекста. UTF8) ;
стрТЗ = Текст. Прочитать( ) ;
Текст. Закрыть( ) ;
ТЗ = ЗначениеИзСтрокиВнутр( стрТЗ) ;
Возврат ТЗ;
КонецФункции
Функция ЗаписьТЗ2ТабДок(записьТЗ,НомерСтроки,ТабличныйДокумент)
НомерКолонки = 1 ;
Символ160 = Символ( 160 ) ;
Для каждого полеТЗ из ЗаписьТЗ цикл
типПоляТЗ = ТипЗнч( полеТЗ) ;
если типПоляТЗ = Тип( "Число" ) тогда
полеТЗ= Строка( полеТЗ) ;
полеТЗ= СтрЗаменить( полеТЗ, Символ160 , "" ) ;
полеТЗ= СтрЗаменить( полеТЗ, "," , "." ) ;
иначеесли типПоляТЗ = Тип( "Строка" ) тогда
иначе
полеТЗ = строка( полеТЗ) ;
КонецЕсли ;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
номерСтроки= 1 ;
номКолонки= 1 ;
ТабличныйДокумент = новый ТабличныйДокумент;
Для НомКол= 0 по ТаблицаЗначений. Колонки. Количество( ) - 1 Цикл
имяКолонки= ТаблицаЗначений. Колонки[НомКол]. Имя;
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить( имяОбласти, Символ( 160 ) , "" ) ;
Ячейка = ТабличныйДокумент. Область( имяОбласти) ;
Ячейка. Текст = имяКолонки;
ЖирныйШрифт = ? ( ЖирныйШрифт = Неопределено , Новый Шрифт( Ячейка. Шрифт, , , Истина ) , ЖирныйШрифт) ;
Ячейка. Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1 ;
КонецЦикла ;
КонецФункции
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
НомСтр= 1 ;
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1 ;
ЗаписьТЗ2 ТабДок( записьТЗ, НомСтр, ТабличныйДокумент) ;
КонецЦикла ;
КонецФункции
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
НаимКолонок2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
Таблица2 Mxl( ТаблицаЗначений, ТабличныйДокумент) ;
ТабличныйДокумент. Записать( ФайлMxl, ТипФайлаТабличногоДокумента. MXL) ;
ТабличныйДокумент. Показать( ФайлMxl, ФайлMxl) ;
Возврат 0 ;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl() ;
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat" ;
ТЗ = ЗагрузитьТЗизФайла( файл_мТЗИсходныеДанные) ;
ФайлMxl = КаталогВременныхФайлов( ) + СтрЗаменить( файл_мТЗИсходныеДанные, ".dat" , ".mxl" ) ;
ТаблицаЗначений2 Mxl( ТЗ, ФайлMxl) ;
КонецФункции
Тест_ВыгрузитьТЗвMxl( ) ;
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Импорт/экспорт CSV в ТЗ Код 1C v 8.х
&НаСервереБезКонтекста
Функция ПреобразоватьТекстCSVвТЗ(ТекстCSV="" , Разделитель=";" ) Экспорт
ТЗ = Новый ТаблицаЗначений;
ОсобаяСтрока = "$#%^&*!xyxb$#%&*!^" ;
НомерСтроки = 1 ;
Стр = СтрПолучитьСтроку( ТекстCSV, НомерСтроки) ;
Пока НомерСтроки < = СтрЧислоСтрок( ТекстCSV) Цикл
СтрокаТЗ = ТЗ. Добавить( ) ;
НомерПоля = 0 ;
Пока Стр < > "" Цикл
Токен = "" ;
ПозицияРазделителя = Найти( стр, Разделитель) ;
ПозицияОткрКавычек = Найти( стр, """ " ) ;
Если ( ПозицияРазделителя > ПозицияОткрКавычек ИЛИ ПозицияРазделителя = 0 ) И ПозицияОткрКавычек > 0 Тогда
Токен = Сред( Стр, 1 , ПозицияОткрКавычек) ;
Стр = СтрЗаменить( Сред( Стр, ПозицияОткрКавычек+ 1 ) , """ "" " , ОсобаяСтрока) ;
ПозицияЗакрКавычек = Найти( Стр, """ " ) ;
Пока ПозицияЗакрКавычек = 0 Цикл
Токен = Токен + Стр + Символы. ПС;
НомерСтроки = НомерСтроки + 1 ;
Стр = СтрПолучитьСтроку( ТекстCSV, НомерСтроки) ;
Стр = СтрЗаменить( Стр, """ "" " , ОсобаяСтрока) ;
ПозицияЗакрКавычек = Найти( Стр, """ " ) ;
КонецЦикла ;
ПозицияРазделителя= Найти( Сред( Стр, ПозицияЗакрКавычек) , Разделитель) ;
ПозицияРазделителя = ? ( ПозицияРазделителя> 0 , ПозицияЗакрКавычек + ПозицияРазделителя- 1 , 0 ) ;
КонецЕсли ;
Токен = Токен + ? ( ПозицияРазделителя> 0 , Сред( Стр, 1 , ПозицияРазделителя- 1 ) , Стр) ;
Стр = ? ( ПозицияРазделителя> 0 , Сред( Стр, ПозицияРазделителя+ 1 ) , "" ) ;
Если Лев( Токен, 1 ) = """ " Тогда
Токен = Сред( Токен, 2 ) ;
Токен = ? ( Прав( Токен, 1 ) = """ " , Сред( Токен, 1 , СтрДлина( Токен) - 1 ) , Токен) ;
КонецЕсли ;
Токен = СтрЗаменить( Токен, ОсобаяСтрока, """ " ) ;
НомерПоля = НомерПоля + 1 ;
Если ТЗ. Колонки. Количество( ) < НомерПоля Тогда
ТЗ. Колонки. Добавить( "Колонка" + НомерПоля, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЕсли ;
СтрокаТЗ[НомерПоля- 1 ] = Токен;
КонецЦикла ;
НомерСтроки = НомерСтроки + 1 ;
Стр = СтрПолучитьСтроку( ТекстCSV, НомерСтроки) ;
КонецЦикла ;
Возврат ТЗ;
КонецФункции
&НаСервереБезКонтекста
Функция ПреобразоватьТЗвТекстCSV(ТЗ, Разделитель = ";" , флЭкспортироватьИменаКолонок = Ложь) Экспорт
ТекстCSV = "" ;
Если флЭкспортироватьИменаКолонок Тогда
ПодготовленнаяСтрока = "" ;
Для Каждого Колонка Из ТЗ. Колонки Цикл
ПодготовленнаяСтрока = ПодготовленнаяСтрока + Колонка. Имя + Разделитель;
КонецЦикла ;
ПодготовленнаяСтрока = Лев ( ПодготовленнаяСтрока, СтрДлина( ПодготовленнаяСтрока) - 1 ) ;
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы. ПС;
КонецЕсли ;
Для Каждого Строка Из ТЗ Цикл
ПодготовленнаяСтрока = "" ;
Для Каждого Колонка Из ТЗ. Колонки Цикл
ПреобразованноеПоле = Строка[Колонка. Имя];
Если Найти( ПреобразованноеПоле, """ " ) Тогда
ПреобразованноеПоле = СтрЗаменить( ПреобразованноеПоле, """ " , """ "" " ) ;
КонецЕсли ;
Если Найти( ПреобразованноеПоле, Разделитель) ИЛИ Найти( ПреобразованноеПоле, Символы. ПС) ИЛИ Найти( ПреобразованноеПоле, """ " ) Тогда
ПреобразованноеПоле = """ " + ПреобразованноеПоле + """ " ;
КонецЕсли ;
ПодготовленнаяСтрока = ПодготовленнаяСтрока + ПреобразованноеПоле + Разделитель;
КонецЦикла ;
ПодготовленнаяСтрока = Лев ( ПодготовленнаяСтрока, СтрДлина( ПодготовленнаяСтрока) - 1 ) ;
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы. ПС;
КонецЦикла ;
Возврат ТекстCSV;
КонецФункции
Источник
Категория:
Работа с Таблицей Значений Загрузка данных в документ из табличного документа (в ТД скопировано из Excel) Частенько пользователи просят упростить ввод данных в программу используя копирование таблиц из Excel. Ниже я приведу пример как загрузить данные скопированные из Excel:
Создаем форму для загрузки данных:
внутри пишем код:
Код 1C v 8.х
ТаблицаДанных = Новый ТаблицаЗначений;
НомерКолонки = 0 ;
Пока Истина Цикл
НомерКолонки = НомерКолонки + 1 ;
ИмяКолонки = ТабДок. Область( 1 , НомерКолонки) . Текст;
Если ПустаяСтрока( ИмяКолонки) Тогда
Прервать ;
КонецЕсли ;
ТаблицаДанных. Колонки. Добавить( "К" + Строка( НомерКолонки) ) ;
КонецЦикла ;
СчетчикКолонок = НомерКолонки - 1 ;
НомерСтроки = 1 ; ФлагПрерывания = Ложь ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
Стр = ТаблицаДанных. Добавить( ) ;
Для А = 1 ПО СчетчикКолонок Цикл
ТекстКолонки = ТабДок. Область( НомерСтроки, А) . Текст;
Если ПустаяСтрока( ТекстКолонки) Тогда
Если А = КолонкаИндекса Тогда
Флагпрерывания = Истина ;
ТаблицаДанных. Удалить( Стр) ;
КонецЕсли ;
Иначе
Стр[А - 1 ] = ТекстКолонки
КонецЕсли ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Если Флагпрерывания Тогда
Прервать
КонецЕсли ;
КонецЦикла ;
Возврат ТаблицаДанных
КонецФункции
Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
тзДанных= ПолучитьТЗИзМакета( ЭлементыФормы. ПолеТД) ;
Закрыть( тзДанных) ;
КонецПроцедуры
В документ добавлена кнопка - Загрузка из Excel ее код:
Код 1C v 8.х
Функция РазобратьДату(ИзмДата) ;
Возврат Дата( Сред( ИзмДата, 7 , 4 ) + Сред( ИзмДата, 4 , 2 ) + Сред( ИзмДата, 0 , 2 ) ) ;
КонецФункции
Процедура ЗагрузитьИзЕкселНажатие(Элемент)
тзДанных = ПолучитьФорму( "ФормаЗагрузкиИзExcel" ) . ОткрытьМодально( ) ;
ГрафикПлатежейКлиент. Очистить( ) ;
Для Каждого стр из тзДанных Цикл
нСтр = ГрафикПлатежейКлиент. Добавить( ) ;
нСтр. Дата = РазобратьДату( стр. К1 ) ;
нСтр. Сумма = стр. К2 ;
нСтр. СуммаАкта = стр. К3 ;
КонецЦикла ;
КонецПроцедуры
Смысл в том что из Excel копируют таблицу:
Жмут на кнопку загрузить и в документе Табличная часть заполняется автоматически:
Категория:
Табличный документ Excel файл как Внешний источник данных Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто.
1. В конфигурации добавляет новый объект метаданных типа "Внешние источники данных" и назовем его просто "Excel".
2. На закладке "Данные" созданного объекта "Excel" добавляем новую таблицу. При этом появится окно мастера добавления таблицы внешнего источника.
Выбираем первый пункт "Вручную", т.к. лично у меня второй пункт "Выбрать из списка таблиц внешнего источника данных" работает нестабильно.
Если Вы все же хотите попробовать добавить таблицу через второй пункт, то в качестве строки соединения в появившемся окне указываем:
Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\Documents and Settings\Admin\Мои документы\finance3.xls; DriverID=790
В этой строке укажите путь к своему файлу. Имя пользователя и пароль я не указывал.
Отмечу, что путь к файлу и строка соединения в дальнейшем не запоминается и нужны эти параметры единожды, чтобы создать автоматически описание полей таблицы источника.
Если соединение прошло нормально, то должен отобразиться список таблиц источника. Флажком можно выбрать нужную таблицу и ее поля.
3. Даем имя новой таблице "Данные". Переходим на вкладку таблицы "Данные". В поле "Имя в источнике данных" указываем имя листа в файле Excel и добавляем в конце знак "$". В моем случае это "Данные$". В табличной части "Поля" добавляем поля и редактируем их тип.
У каждого поля в свойствах должно быть задано как минимум "Имя" и "Имя в источнике данных".
4. Создаем процедуру в которой пишем подключение к источнику и запрос:
Код 1C v 8.х ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения. СтрокаСоединения=
"Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\Documents and Settings\Admin\Мои документы\finance2.xls; DriverID=790" ;
ВнешниеИсточникиДанных. Excel. УстановитьОбщиеПараметрыСоединения( ПараметрыСоединения) ;
ВнешниеИсточникиДанных. Excel. УстановитьСоединение( ) ;
Запрос = Новый Запрос( ) ;
Запрос. Текст = "ВЫБРАТЬ
| Данные.date КАК Дата,
| Данные.time КАК Время,
| Данные.account КАК Счет,
| Данные.amount КАК Сумма,
| Данные.currency КАК Валюта,
| Данные.category КАК Категория,
| Данные.parent КАК КатегорияРодитель
|ИЗ
| ВнешнийИсточникДанных.Excel.Таблица.Данные КАК Данные" ;
ТЗ = Запрос. Выполнить( ) . Выгрузить( ) ;
Вот и все!
Источник:
passion-programmer
Параметры соединения для файла Excel выглядят вот так:
Файлы XLSX (версия Office 2007 и выше)
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\ФайлExcel.xlsx;
Файлы XLS (ранее)
Driver={Microsoft Excel Driver (*.xls)}; DriverID=790; DBQ=D:\ФайлExcel.xls; Категория:
Внешние источники данных Универсальная функция для чтения данных из Excel в 1С Иногда требуется разобрать данные из 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 Категория:
Работа с Microsoft Office и OpenOffice Значение параметра Extended Properties для разных версий MS Excel Параметр
Extended Properties=""Excel 8.0;" обозначает версию в котором сохранен файл
* 1997 год — Excel 97(8) — Microsoft Office 97
* 1999 год — Excel 2000 (9) — Microsoft Office 2000
* 2001 год — Excel 2002 (10) — Microsoft Office XP
* 2003 год — Excel 2003 (11) — Microsoft Office 2003
* 2007 год — Excel 2007 (12) — Microsoft Office 2007
* 2010 год — Excel 2010 (13) — Microsoft Office 2010
Примеры
Код 1C v 8.х
Conn= Новый COMОбъект( "ADODB.Connection" ) ;
Conn. ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Параметры. ИмяФайла+ ";
|Extended Properties="" Excel 8.0;" + ? ( Параметры. ЗаголовкиКолонокИменаСтолбцовExcel, "HDR=NO;" , "" ) + "IMEX=1;"" " ;
Conn. Open( ) ;
ТекстЗапроса= "S_elect
| *
|FROM [Лист1$]
// |INNER JOIN
// | ON
// |WHERE
// |GROUP BY
// | ORDER BY
|" ;
Результат= Conn. Execute( ТекстЗапроса) ;
Ссылки по теме:
V8 1С8.1 и Excel 2007 Категория:
Работа с Microsoft Office и OpenOffice Импорт документа Excel через web-клиент Во время реализации задачи по регистрации продаж дистрибьюторов на основании Excel документов столкнулся с интересной задачей. Необходимо реализовать загрузку файла и на стороне сервера обработать его, заполнив табличную часть документа.
Решение состоит из двух функций: клиентской и серверной.
Клиентская часть инициирует выбор файла, передачу выбранного файла на сервер и передача управления серверной процедуре.
Код 1C v 8.2 УП #НаКлиенте
Процедура ИмпортИзВнешнегоФайла(Команда)
Если НЕ ПодключитьРасширениеРаботыСФайлами( ) Тогда
УстановитьРасширениеРаботыСФайлами( ) ;
КонецЕсли ;
Если ПодключитьРасширениеРаботыСФайлами( ) Тогда
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
Фильтр = "Текст(*.xls)|*.xls" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. Заголовок = "Выберите файл для импорта" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
Объект. МедицинскиеРаботники. Очистить( ) ;
ДанныеНачинаютсяС = 1 ;
Если Не ВвестиЧисло( ДанныеНачинаютсяС, "Данные начинаются со строки" , 2 , 0 ) Тогда
Возврат ;
КонецЕсли ;
МассивФайлов = ДиалогОткрытияФайла. ВыбранныеФайлы;
ПомещаемыеФайлы = Новый Массив;
Для Каждого Файл Из МассивФайлов Цикл
ТекФайл = Новый Файл( Файл) ;
Описание = Новый ОписаниеПередаваемогоФайла( Файл, "" ) ;
ПомещаемыеФайлы. Добавить( Описание) ;
КонецЦикла ;
ПомещенныеФайлы = Новый Массив;
Если ПоместитьФайлы( ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь , УникальныйИдентификатор) Тогда
ИмпортироватьФайлИзВременногоХранилищаВТЗ( ПомещенныеФайлы, ДанныеНачинаютсяС) ;
КонецЕсли ;
Иначе
Предупреждение( "Файл(ы) не выбран!" ) ;
КонецЕсли ;
Иначе
Предупреждение( НСтр( "ru ='Данная возможность недоступна, так как не подключено расширение работы с файлами.'" , "ru" ) ) ;
КонецЕсли ;
КонецПроцедуры
Серверная процедура перебирает полученные на сервер файлы. Получает COM-объекты и импортирует данные.
Код 1C v 8.2 УП #НаСервере
Процедура ИмпортироватьФайлИзВременногоХранилищаВТЗ(МассивФайлов, ДанныеНачинаютсяС)
ДокументОбъект = РеквизитФормыВЗначение( "Объект" ) ;
Для Каждого ЭлементМассива Из МассивФайлов Цикл
ФайлИзХранилища = ПолучитьИзВременногоХранилища( ЭлементМассива. Хранение) ;
ВременныйФайл = ПолучитьИмяВременногоФайла( "xls" ) ;
ФайлИзХранилища. Записать( ВременныйФайл) ;
Док = ПолучитьCOMОбъект( ВременныйФайл) ;
ФИОУчастника = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 2 ) . Value;
Пока СокрЛП( ФИОУчастника) = "" Цикл
НоваяСтрока = ДокументОбъект. МедицинскиеРаботники. Добавить( ) ;
НоваяСтрока. Фио = ФИОУчастника;
НоваяСтрока. Учреждение = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 7 ) . Value;
НоваяСтрока. Адрес = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 3 ) . Value;
НоваяСтрока. Телефон = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 4 ) . Value;
НоваяСтрока. ЭлПочта = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 5 ) . Value;
НоваяСтрока. Образование = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 6 ) . Value;
ДанныеНачинаютсяС = ДанныеНачинаютсяС + 1 ;
ФИОУчастника = Док. Sheets( 1 ) . Cells( ДанныеНачинаютсяС, 2 ) . Value;
КонецЦикла ;
Сообщить( "Импорт завершён" ) ;
Док. Application. Quit( ) ;
КонецЦикла ;
ЗначениеВРеквизитФормы( ДокументОбъект, "Объект" ) ;
КонецПроцедуры
Источник Категория:
Работа с Microsoft Office и OpenOffice Быстрая функция чтения данных с листа Excel При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки раз.
Вот текст функции:
Код 1C v 8.х Функция ПрочитатьЛист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 Цикл
ТЗ. ЗагрузитьКолонку( Данные[Счетчик], Счетчик) ;
КонецЦикла ;
ЛистЭксель = Неопределено ;
Возврат ТЗ;
КонецФункции
Комментировать функцию, думаю, нет необходимости. Вот собственно и все, что я хотел сказать.
wildhog Категория:
Работа с Microsoft Office и OpenOffice Загрузка данных из таблицы Excel в ТЗ (Таблицу значений) Код для 7 версии, при использовании в 8-ой - заменить E=СоздатьОбъект("Excel.Application");
на
E=Новый COMОбъект("Excel.Application");
Код 1C v 7.x Функция глОткрытьФайл(Маска="" ) Экспорт
Перем ИмяФайла, ИмяКаталога;
Маска_= "Файлы " + Маска+ "|*." + Маска;
Если СокрЛП( Маска) = "" Тогда
Маска_= "Все файлы |*.*"
КонецЕсли ;
Если ФС. ВыбратьФайл( 0 , ИмяФайла, ИмяКаталога, "Открыть файл" , Маска_) = 1 Тогда
Возврат ИмяКаталога+ ИмяФайла;
Иначе
Возврат "" ;
КонецЕсли ;
КонецФункции
Функция ReadExcel(ИмяФайла,Лист=1) Экспорт
Попытка
E= СоздатьОбъект( "Excel.Application" ) ;
Исключение
Предупреждение( "Excel на компьютере не установлен!" ) ;
Возврат ПолучитьПустоеЗначение( ) ;
КонецПопытки ;
E. Workbooks. Open( Сокрлп( ИмяФайла) ) ;
Строк= E. Sheets( Лист) . Cells. SpecialCells( 11 ) . Row;
Столбцов= E. Sheets( Лист) . Cells. SpecialCells( 11 ) . Column;
фТЗ= СоздатьОбъект( "ТаблицаЗначений" ) ;
Для А= 1 По Столбцов Цикл
фТЗ. НоваяКолонка( ) ;
КонецЦикла ;
Для Стр= 1 По Строк Цикл
Состояние( "Обработано " + Строка( Стр) + " строк из " + Строка( Строк) ) ;
фТЗ. НоваяСтрока( Стр) ;
Для Столб= 1 По Столбцов Цикл
фТЗ. УстановитьЗначение( Стр, Столб, СокрЛП( E. Sheets( Лист) . Cells( Стр, Столб) . Value) ) ;
КонецЦикла ;
КонецЦикла ;
E. Workbooks. Close( ) ;
Возврат фТЗ;
КонецФункции
Процедура Сформировать()
ИмяФайла= глОткрытьФайл( "xls" ) ;
Если СокрЛП( ИмяФайла) = "" Тогда Возврат ; КонецЕсли ;
ТЗ. Загрузить( ReadExcel( ИмяФайла, 1 ) ) ;
КонецПроцедуры
Подсказал Abadonna.
Категория:
Работа с Microsoft Office и OpenOffice Как выгрузиться в EXCEL со сводными таблицами Пошаговый рабочий алгоритм выгрузки в EXCEL на примере выгрузки отчетов производства за смену(Автор статьи:
Funny ):
(1) Нарисовать форму обработки и к кнопке запуска прицепить процедуру:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ПроверкаДат( ) Тогда
Состояние( "Запущена выгрузка данных" ) ;
ПолучитьДанныеВТаблице( ) ;
Если чОтчетов< > 0 Тогда
СортироватьТаблицу( ) ;
ВыгрузитьТаблицуВФайл( ) ;
ЗакрытьСистему( ) ;
Состояние( "Выгрузка завершена" ) ;
Иначе
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
(2) Создадим функцию ПроверкаДат() корректного указания дат обработки
(3) Создадим процедуру ПолучитьДанныеВТаблице() выборки требуемых данных из документов в таблицу значений
(4) Создадим процедуру СортироватьТаблицу() для сортировки таблицы значений как нам нужно
(5) Создадим процедуру ВыгрузитьТаблицуВФайл() выгрузки ТЗ в Excel-файл:
Код 1C v 8.х Процедура ВыгрузитьТаблицуВФайл()
Если FileOfReports = Неопределено Тогда
Попытка
FileOfReports = Новый COMОбъект( "Excel.Application" ) ;
MyBook= FileOfReports. WorkBooks. Add( истина ) ;
FirstSheet= MyBook. Worksheets( 1 ) ;
FirstSheet. Name = ОпределитьДату( НачПериода) + "-" + ОпределитьДату( КонПериода) ;
FirstSheet. Activate( ) ;
MyBook. SaveAs( КаталогDBF+ "ОтчетыПроизводства.xls" ) ;
Исключение
Сообщить( "ОШИБКА ЗАПИСИ В EXCEL-ФАЙЛ:" + ОписаниеОшибки( ) ) ;
Сообщить( "Совет: Возможно файл, в который должна быть произведена запись, Вами открыт для просмотра" ) ;
Сообщить( "Если это так, то закройте файл и запустите данную обработку повторно!" ) ;
КонецПопытки ;
FileOfReports. Visible = 0 ;
Иначе
FileOfReports. Visible = 0 ;
КонецЕсли ;
чОтчетов = ТаблицаОтчетов. Количество( ) ;
ЭлементыФормы. ИндикаторЗагрузки. МинимальноеЗначение = 0 ;
ЭлементыФормы. ИндикаторЗагрузки. МаксимальноеЗначение = чОтчетов;
ЭлементыФормы. Logo. Заголовок = "Выгружаю документы" ;
лСчетчикИндикатора = 0 ;
ВыгрузитьЗаголовокТаблицы( 26 ) ;
фСтарт= истина ;
чОт= 2 ;
Пока чОтчетов > = 1 Цикл
чОтчетов = чОтчетов - 1 ;
СтрокаОтчетов = ТаблицаОтчетов. Получить( чОтчетов) ;
Если ( СтрокаОтчетов. ДатаВыпуска= ДатаВыпускаПред)
И ( СтрокаОтчетов. Принадлежность= ПринадлежностьПред)
И ( СтрокаОтчетов. Типоразмер= ТипоразмерПред)
И ( СтрокаОтчетов. ТипОсновы= ТипОсновыПред)
Тогда
Иначе
ДатаВыпускаПред= СтрокаОтчетов. ДатаВыпуска;
ПринадлежностьПред= СтрокаОтчетов. Принадлежность;
ТипоразмерПред= СтрокаОтчетов. Типоразмер;
ТипОсновыПред= СтрокаОтчетов. ТипОсновы;
Если фСтарт Тогда
фСтарт = ложь ;
Иначе
чДо= глСчетчикСтрок;
ВыгрузитьСтрокуИтог( чОт, чДо, 26 ) ;
КонецЕсли ;
чОт= глСчетчикСтрок;
КонецЕсли ;
ВыгрузитьСтрокуОтчетовВФайл( СтрокаОтчетов, 26 ) ;
лСчетчикИндикатора = лСчетчикИндикатора + 1 ;
ЭлементыФормы. ИндикаторЗагрузки. Значение = лСчетчикИндикатора;
ОбработкаПрерыванияПользователя( ) ;
КонецЦикла ;
чДо= глСчетчикСтрок;
ВыгрузитьСтрокуИтог( чОт, чДо, 26 ) ;
Состояние( "Данные файла выгружены" ) ;
libСообщитьНК1 ( "ИНФО: ШАГ 1 ВЫПОЛНЕН. Данные файла Отчеты.DBF успешно считаны" , 1 ) ;
ЭлементыФормы. Logo. Заголовок = "Создание сводных таблиц" ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "наим" , "Дата" , "Наим" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "ЮВ" , "Дата" , "Наим,Каркас,Вид" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "В пр(2)" , "Дата" , "Наим,Каркас,Основа" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "В пр" , "Дата" , "Каркас,Основа" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "Основа" , "Дата" , "Основа" , "" , "кг основы" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "Напыление" , "" , "Напылен" , "" , "кг напылен" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "Клей" , "" , "Дата" , "" , "кг клея" ) ;
КонецПроцедуры
Процедура СоздатьТаблицуЛист(стрДанные,стрСводнаяТаблица,стрПоле1,стрПоле2,стрПоле3,стрПоле4) ;
лПоля. Очистить( ) ;
стрПоля= стрПоле2 ;
i= 1 ;
Пока Найти( стрПоля, "," ) < > 0 Цикл
n= Найти( стрПоля, "," ) ;
лПоля. Добавить( Сред( стрПоля, 1 , n- 1 ) ) ;
стрПоля= Сред( стрПоля, n+ 1 ) ;
i= i+ 1 ;
КонецЦикла ;
лПоля. Добавить( стрПоля) ;
FirstSheet. Activate( ) ;
дДиапазонДанных= FirstSheet. UsedRange. Address;
ДиапазонДанных= FirstSheet. Name+ "!" + Строка( дДиапазонДанных) ;
SourceType = xlDatabase;
SourceData = ДиапазонДанных;
Cache = MyBook. PivotCaches( ) . Add( SourceType, SourceData) ;
TableDestination= "" ;
TableName= стрСводнаяТаблица;
Cache. CreatePivotTable( TableDestination, TableName) ;
Если СокрЛП( стрПоле1 ) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( стрПоле1 ) . Orientation = 3 ;
КонецЕсли ;
чНомер= 0 ;
Пока чНомер< i Цикл
Если СокрЛП( лПоля[чНомер]. Значение) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( лПоля[чНомер]. Значение) . Orientation = 1 ;
КонецЕсли ;
чНомер = чНомер + 1 ;
КонецЦикла ;
Если СокрЛП( стрПоле3 ) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( стрПоле3 ) . Orientation = 2 ;
КонецЕсли ;
Если СокрЛП( стрПоле4 ) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( стрПоле4 ) . Orientation = 4 ;
КонецЕсли ;
чНомер= 0 ;
Пока чНомер< i Цикл
Если СокрЛП( лПоля[чНомер]. Значение) < > "" Тогда
Если IfPivotItemExists( TableName, лПоля[чНомер]. Значение, "(пусто)" ) Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( лПоля[чНомер]. Значение) . PivotItems( "(пусто)" ) . Visible = False;
КонецЕсли ;
КонецЕсли ;
чНомер = чНомер + 1 ;
КонецЦикла ;
MyBook. ShowPivotTableFieldList = False;
FileOfReports. CommandBars( "PivotTable" ) . Visible = False;
MyBook. ActiveSheet. Name = стрСводнаяТаблица;
MyBook. Save( ) ;
КонецПроцедуры
Функция IfPivotItemExists(strTableName,strFieldName,strItemName)
nItems = MyBook. ActiveSheet. PivotTables( strTableName) . PivotFields( strFieldName) . PivotItems( ) . Count;
i = 1 ;
Пока i < = nItems Цикл
Если strItemName= MyBook. ActiveSheet. PivotTables( strTableName) . PivotFields( strFieldName) . PivotItems( i) . Name Тогда
Возврат True;
КонецЕсли ;
i= i+ 1 ;
КонецЦикла ;
Возврат False;
КонецФункции
Код 1C v 7.x РабочаяКнига = СоздатьОбъект( "Excel.Application" ) ;
РабочаяКнига. SheetsInNewWorkbook = 1 ;
РабочаяКнига. Caption = "Отчет по договорам отгрузки" ;
NewBook = РабочаяКнига. Workbooks;
List = NewBook. Add;
СписокСтолбцов = СоздатьОбъект( "СписокЗначений" ) ;
СписокСтолбцов. ДобавитьЗначение( "Модель" ) ;
СписокСтолбцов. ДобавитьЗначение( "Разнорядка" ) ;
СписокСтолбцов. ДобавитьЗначение( "По договору" ) ;
СписокСтолбцов. ДобавитьЗначение( "Отгрузили" ) ;
СписокСтолбцов. ДобавитьЗначение( "Осталось" ) ;
Для Столбец = 1 По СписокСтолбцов. РазмерСписка( ) Цикл
Ячейка = РабочаяКнига. Cells( 1 , Столбец) ;
Ячейка. Value = СписокСтолбцов. ПолучитьЗначение( Столбец) ;
КонецЦикла ;
Запрос = СоздатьОбъект( "Запрос" ) ;
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНач по ДатаКон;
|Разнорядка = Регистр.УчетДоговоров.Разнорядка;
|Модель = Регистр.УчетДоговоров.Модель.Группа;
|Колво = Регистр.УчетДоговоров.Количество;
|Функция КолвоПриход = Приход(Колво);
|Функция КолвоРасход = Расход(Колво);
|Функция КолвоОст = КонОст(Колво);
|Группировка Разнорядка;
|Группировка Модель;
|"
;
Если Запрос. Выполнить( ТекстЗапроса) = 0 Тогда
Возврат ;
КонецЕсли ;
НомерСтроки = 1 ;
Пока Запрос. Группировка( "Разнорядка" ) = 1 Цикл
Пока Запрос. Группировка( "Модель" ) = 1 Цикл
Модель = Запрос. Модель;
Разнорядка = Запрос. Разнорядка;
КолПоДоговору = Запрос. КолвоПриход;
КолОтгрузили = Запрос. КолвоРасход;
КолОсталось = Запрос. КолвоОст;
НомерСтроки = НомерСтроки + 1 ;
Для Ст = 1 По СписокСтолбцов. РазмерСписка( ) Цикл
Ячейка = РабочаяКнига. Cells( НомерСтроки, Ст) ;
Если Ст = 1 Тогда
Ячейка. Value = Модель;
ИначеЕсли Ст = 2 Тогда
Ячейка. Value = Строка( Разнорядка) ;
ИначеЕсли Ст = 3 Тогда
Ячейка. Value = КолПоДоговору;
ИначеЕсли Ст = 4 Тогда
Ячейка. Value = КолОтгрузили;
ИначеЕсли Ст = 5 Тогда
Ячейка. Value = КолОсталось;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
СводнаяТаблица = РабочаяКнига. ActiveSheet. PivotTableWizard;
СводнаяТаблица. SmallGrid = 0 ;
СводнаяТаблица. PivotFields( 1 ) . Orientation = 1 ;
СводнаяТаблица. PivotFields( 2 ) . Orientation = 3 ;
СводнаяТаблица. PivotFields( 3 ) . Orientation = 4 ;
СводнаяТаблица. PivotFields( 4 ) . Orientation = 4 ;
СводнаяТаблица. PivotFields( 5 ) . Orientation = 4 ;
СводнаяТаблица. Format( 1 ) ;
РабочаяКнига. CommandBars( "PivotTable" ) . Visible = 0 ;
РабочаяКнига. Visible = 1 ;
Категория:
Работа с Microsoft Office и OpenOffice Загрузка списка номенклатуры в ТЗ из Excel Код 1C v 8.х
Попытка
XLSОбъектОсновной = Новый COMОбъект( "Excel.Application" ) ;
Исключение
Предупреждение( "Невозможно загрузить MS EXCEL !!!" + Символы. ПС + ОписаниеОшибки( ) , 10 , "Ошибка" ) ;
Возврат ;
КонецПопытки ;
XLSОбъектКниги = XLSОбъектОсновной. WorkBooks;
Попытка
XLSОбъект = XLSОбъектКниги. Open( элементыформы. пвИмяФайла. Значение) ;
Исключение
Предупреждение( "Невозможно открыть файл " + элементыформы. пвИмяФайла. Значение + " !!!" + Символы. ПС + ОписаниеОшибки( ) , 10 , "Ошибка" ) ;
Возврат ;
КонецПопытки ;
XLSОбъект. Application. Caption = "Открыто из 1С" ;
Если НомерСтрокиСДанными = 0 Тогда
НомерСтрокиСДанными = 1 ;
КонецЕсли ;
Если НомерСтраницы = 0 Тогда
НомерСтраницы = 1 ;
КонецЕсли ;
Лист = XLSОбъект. Sheets( НомерСтраницы) ;
Если КолВоКолонок = 0 Тогда
КолВоКолонок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Column;
КонецЕсли ;
Если КолВоСтрок = 0 Тогда
КолВоСтрок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Row;
КонецЕсли ;
ТЗДанных. Очистить( ) ;
Лист = XLSОбъект. Sheets( НомерСтраницы) ;
Для чС = ( НомерСтрокиСДанными + 1 ) По КолВоСтрок Цикл
Состояние( "Загружаем строки:" + чС) ;
ностр= ТЗДанных. Добавить( ) ;
попытка
Ячейка = Лист. Cells( чС, 1 ) ;
ностр. НоменклатураЕксел = Ячейка. Value;
исключение
сообщить( "Номенклатура - строка - " + чс + Символы. ПС + ОписаниеОшибки( ) ) ;
конецпопытки ;
попытка
Ячейка = Лист. Cells( чС, 2 ) ;
ностр. Количество = Ячейка. Value;
исключение
сообщить( "Количество - строка - " + чс + Символы. ПС + ОписаниеОшибки( ) ) ;
конецпопытки ;
попытка
Ячейка = Лист. Cells( чС, 3 ) ;
ностр. Сумма = Ячейка. Value;
исключение
сообщить( "Сумма - строка - " + чс + Символы. ПС + ОписаниеОшибки( ) ) ;
конецпопытки ;
попытка
Ячейка = Лист. Cells( чС, 4 ) ;
ностр. ЕдИзмеренияЕксел = Ячейка. Value;
исключение
сообщить( "Ед. измерения - строка - " + чс + Символы. ПС + ОписаниеОшибки( ) ) ;
конецпопытки ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Категория:
Работа с Microsoft Office и OpenOffice Подключение к EXCEL и чтение данных из листа Excel Код 1C v 8.х Ex = Новый COMObject( "Excel.Application" ) ;
Ex. Workbooks. Open( Путь) ;
Ex. Visible = 1 ;
ТекЛист= Ex. WorkSheets( 1 ) ;
Для Ячейка = 1 по 400 цикл
Если НЕ ТекЛист. Cells( Ячейка, 1 ) . Value = Неопределено тогда
Сообщить( Строка( ТекЛист. Cells( Ячейка, 1 ) . Value) ) ;
Карта = Справочники. Номенклатура. НайтиПоКоду( ИзЧислаВСтроку( ТекЛист. Cells( Ячейка, 1 ) . Value) ) ;
Если Карта. Пустая( ) тогда
Сообщить( " Пустой элемент " + ТекЛист. Cells( Ячейка, 1 ) ) ;
иначе
Объект = Карта. ПолучитьОбъект( ) ;
Объект. ОсновнойПоставщик = ОсновнойКлиент;
Объект. Записать( ) ;
конецесли ;
конецесли ;
конеццикла ;
Примеры процедур для чтения данных из EXCEL
Код 1C v 8.х
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт
#Если Клиент Тогда
Состояние( "Установка соединения с Excel" ) ;
#КонецЕсли
ЗаголовкиВСтроке1 = "HDR=NO;" ;
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП( пФайл) + " ;Extended Properties="" Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;"" " ;
Connection = Новый COMОбъект( "ADODB.Connection" ) ;
Connection. ConnectionString = СтрокаСоединения;
Попытка
Connection. Open( ) ;
Исключение
Сообщить ( "Проблемы с подключением к Excel" ) ;
Возврат Неопределено ;
КонецПопытки ;
RS = Новый COMОбъект( "ADODB.Recordset" ) ;
ТекстЗапроса =
"S_elect
| Лист.*
|FROM
| [" + пЛист + "$] as Лист" ;
Попытка
RS. Open( ТекстЗапроса, Connection) ;
Исключение
Сообщить ( "Проблемы с выполнением запроса" ) ;
Возврат Неопределено ;
КонецПопытки ;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS. Fields. Count Цикл
Поле = RS. Fields. Item( Счетчик - 1 ) ;
Колонка = Таблица. Колонки. Добавить( "К" + Счетчик, , Поле. Name) ;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица. Колонки. Добавить( КлючИЗначение. Ключ) ;
КонецЦикла ;
КонецЕсли ;
НомерСтроки = 0 ;
КолвоСтрок = RS. RecordCount;
Пока RS. EOF( ) = 0 Цикл
НомерСтроки = НомерСтроки + 1 ;
#Если Клиент Тогда
Состояние( "Чтение файла: " + Формат( НомерСтроки) + " из " + Формат( КолвоСтрок) ) ;
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
Если НомерСтроки < НачСтрока Тогда
RS. MoveNext( ) ;
Продолжить;
КонецЕсли ;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать ;
КонецЕсли ;
НоваяСтрока = Таблица. Добавить( ) ;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS. Fields. Count Цикл
Поле = RS. Fields. Item( Счетчик - 1 ) ;
НоваяСтрока["К" + Счетчик] = Поле. Value;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = RS. Fields. Item( КлючИЗначение. Значение - 1 ) ;
НоваяСтрока[КлючИЗначение. Ключ] = Поле. Value;
КонецЦикла ;
КонецЕсли ;
RS. MoveNext( ) ;
КонецЦикла ;
RS. Close( ) ;
Connection. Close( ) ;
Возврат Таблица;
КонецФункции
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние( "Открытие Excel" ) ;
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект( "Excel.Application" ) ;
XLSОбъект. Visible = Ложь ;
XLSОбъект. DisplayAlerts = Ложь ;
КонецЕсли ;
Попытка
Book = XLSОбъект. Workbooks. Open( пФайл, , Истина ) ;
Исключение
Сообщить ( "Проблемы с подключением к Excel" ) ;
Возврат Неопределено ;
КонецПопытки ;
Лист = Book. Sheets( 1 ) ;
КолвоКолонок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Column;
КолвоСтрок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица. Колонки. Добавить( "К" + Счетчик) ;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица. Колонки. Добавить( КлючИЗначение. Ключ) ;
КонецЦикла ;
КонецЕсли ;
НачСтрока = ? ( НачСтрока = 0 , 1 , НачСтрока) ;
КонСтрока = ? ( КонСтрока = 0 , КолвоСтрок, КонСтрока) ;
КонСтрока = Мин( КонСтрока, КолвоСтрок) ;
Для НомерСтроки = НачСтрока По КонСтрока Цикл
#Если Клиент Тогда
Состояние( "Чтение файла: " + Формат( НомерСтроки) + " из " + Формат( КонСтрока) ) ;
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
НоваяСтрока = Таблица. Добавить( ) ;
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
Поле = Лист. Cells( НомерСтроки, НомерКолонки) ;
НоваяСтрока["К" + Формат( НомерКолонки, "ЧГ=0" ) ] = Поле. Value;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = Лист. Cells( НомерСтроки, КлючИЗначение. Значение) ;
НоваяСтрока[КлючИЗначение. Ключ] = Поле. Value;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Возврат Таблица;
КонецФункции
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние( "Открытие Excel" ) ;
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект( "Excel.Application" ) ;
XLSОбъект. Visible = Ложь ;
XLSОбъект. DisplayAlerts = Ложь ;
КонецЕсли ;
Попытка
Book = XLSОбъект. Workbooks. Open( пФайл, , Истина ) ;
Исключение
Сообщить ( "Проблемы с подключением к Excel" ) ;
Возврат Неопределено ;
КонецПопытки ;
Лист = Book. Sheets( 1 ) ;
КолвоКолонок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Column;
КолвоСтрок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица. Колонки. Добавить( "К" + Счетчик) ;
КонецЦикла ;
Иначе
МаксимальныйНомерКолонки = 0 ;
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица. Колонки. Добавить( КлючИЗначение. Ключ) ;
МаксимальныйНомерКолонки = Макс( МаксимальныйНомерКолонки, КлючИЗначение. Значение) ;
КонецЦикла ;
КолвоКолонок = Мин( КолвоКолонок, МаксимальныйНомерКолонки) ;
КонецЕсли ;
НачСтрока = ? ( НачСтрока = 0 , 1 , НачСтрока) ;
КонСтрока = ? ( КонСтрока = 0 , КолвоСтрок, КонСтрока) ;
КонСтрока = Мин( КонСтрока, КолвоСтрок) ;
Массив = Лист. Range( Лист. Cells( НачСтрока, 1 ) , Лист. Cells( КонСтрока, КолвоКолонок) ) . Value;
КолвоСтрок = Массив. GetUpperBound( 1 ) ;
Для НомерСтроки = 1 По КолвоСтрок Цикл
#Если Клиент Тогда
Состояние( "Чтение файла: " + Формат( НомерСтроки) + " из " + Формат( КолвоСтрок) ) ;
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
НоваяСтрока = Таблица. Добавить( ) ;
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
НоваяСтрока["К" + Формат( НомерКолонки, "ЧГ=0" ) ] = Массив. GetValue( НомерКолонки, НомерСтроки) ;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
НоваяСтрока[КлючИЗначение. Ключ] = Массив. GetValue( КлючИЗначение. Значение, НомерСтроки) ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Возврат Таблица;
КонецФункции
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект( "Excel.Application" ) ;
XLSОбъект. Visible = Ложь ;
XLSОбъект. DisplayAlerts = Ложь ;
КонецЕсли ;
Попытка
Book = XLSОбъект. Workbooks. Open( пФайл, , Истина ) ;
Исключение
Возврат Новый СписокЗначений;
КонецПопытки ;
СписокЛистов = Новый СписокЗначений;
Для каждого Лист Из XLSОбъект. Sheets Цикл
СписокЛистов. Добавить( Лист. Name) ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Возврат СписокЛистов;
КонецФункции
Код 1C v 7.x Попытка
Excel = СоздатьОбъект( "Excel.Application" ) ;
Исключение
Сообщить( ОписаниеОшибки( ) + "; программа Excel не установлена на данном компьютере!" ) ;
Возврат ;
КонецПопытки ;
РабочиеКниги= Excel. WorkBooks;
Попытка
Отчет= РабочиеКниги. Open( Каталог+ ИмяФайла) ;
Исключение
Сообщить( ОписаниеОшибки( ) + "; фаил с макросом не найден!" ) ;
Возврат ;
КонецПопытки ;
Лист = Отчет. Worksheets( 1 ) ;
Для Ном= 1 По 20 Цикл
Ячейка = Лист . Cells( ном, 1 ) ; Ячейка. Value;
Сообщить( Ячейка ) ;
КонецЦикла ;
Excel. Visible= 1 ;
Попытка
Отчет. Save( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) + "; не могу сохранить отчет!" ) ;
Возврат ;
КонецПопытки ;
Категория:
Работа с Microsoft Office и OpenOffice