Функции сохранения таблицы значений в файл и чтения из файла В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:
П орядок программных действий при выгрузке в файл выглядит так:
Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки); Конвертируем таблицу значений в табличный документ; Сохраняем табличный документ в MXL. При загрузке таблицы порядок действий такой:
Читаем из файла табличный документ; Конвертируем табличный документ в таблицу значений; Используем эту таблицу значений в своих целях (загружаем в табличную часть). Соответственно файл для хранения данных таблицы имеет расширение *.mxl.
Основные функции для реализации поставленной задачи следующие:
ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.
Код 1C v 8.3 // Преобразовать табличный документ в таблицу значений.
//
// Параметры:
// ТабДок - <ТабличныйДокумент> - Исходный табличный документ;
// СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// КонецСтрока - <Число> - Строка конца области;
// КонецСтолбец - <Число> - Столбец конца области.
//
// Возвращаемое значение:
// <ТаблицаЗначений> - Полученная таблица значений.
//
Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт
// Определение габаритов таблицы
Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда
НачалоСтрока = 1;
НачалоСтолбец = 1;
КонецЕсли;
Если НачалоСтрока = Неопределено Тогда
НачалоСтрока = 1;
Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение
И НачалоСтрока < ТабДок.ВысотаТаблицы
Цикл
НачалоСтрока = НачалоСтрока + 1;
КонецЦикла;
ИначеЕсли НачалоСтолбец = Неопределено Тогда
НачалоСтолбец = 1;
Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение
И НачалоСтолбец < ТабДок.ШиринаТаблицы
Цикл
НачалоСтолбец = НачалоСтолбец + 1;
КонецЦикла;
КонецЕсли;
КонецСтрока = ?(КонецСтрока = Неопределено, ТабДок.ВысотаТаблицы, КонецСтрока);
КонецСтолбец = ?(КонецСтолбец = Неопределено, ТабДок.ШиринаТаблицы, КонецСтолбец);
// Преобразование
ЭтоТаблица = (ТипЗнч(СтруктураКолонок) = Тип("ТаблицаЗначений"));
ТабЗначений = ПолучитьТаблицуВывода(СтруктураКолонок);
Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл
СтрокаТЗ = ТабЗначений.Добавить();
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из СтруктураКолонок Цикл
НаименованиеКолонки = ?(ЭтоТаблица, Колонка.Наименование, Колонка.Ключ);
пИндексКолонки = ?(ЭтоТаблица, Колонка.СтолбецОтчёт, ИндексКолонки);
Если ТабДок.Область(ИндексСтроки, пИндексКолонки).СодержитЗначение Тогда
СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Значение;
Иначе
СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Текст;
КонецЕсли;
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
КонецЦикла;
Возврат ТабЗначений;
КонецФункции;
// Преобразовать таблицу значений в табличный документ.
//
// Параметры:
// ТабЗначений - <ТаблицаЗначений> - Исходная таблица значений;
// ТабДок - <ТабличныйДокумент> - Полученный табличный документ. Если параметр не задан,
// то документ создаётся заново и возвращается функцией;
// НачалоСтрока - <Число> - Строка начала области;
// НачалоСтолбец - <Число> - Столбец начала области;
// ВыводитьЗаголовки - <Булево> - Определяет выводить ли имена колонок или нет.
//
// Возвращаемое значение:
// <ТабличныйДокумент> - Полученный табличный документ (возвращает параметр "ТабДок").
//
Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт
Если ТабДок = Неопределено Тогда
ТабДок = Новый ТабличныйДокумент;
КонецЕсли;
// Определение габаритов таблицы
НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока);
НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец);
// Преобразование
ИндексСтроки = НачалоСтрока;
Если ВыводитьЗаголовки Тогда
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок);
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЕсли;
Для Каждого Элемент Из ТабЗначений Цикл
ИндексКолонки = НачалоСтолбец;
Для Каждого Колонка Из ТабЗначений.Колонки Цикл
ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина;
ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения);
ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя];
ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
Возврат ТабДок;
КонецФункции;
// Читает табличный документ из файла MXL и преобразует его в таблицу значений.
//
// Параметры:
// ИмяФайла - <Строка> - Путь к файлу MXL;
// СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок. Если этот параметр
// не задан, то структура колонок формируется из самого табличного документа;
// ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет.
//
// Возвращаемое значение:
// <ТаблицаЗначений> - Полученная таблица значений.
//
Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла);
Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Обл1 = ТабДок.Область(1, ИндексКолонки);
Обл2 = ТабДок.Область(2, ИндексКолонки);
ИмяКолонки = СокрЛП(Обл1.Текст);
ИмяКолонки = ?(Найти(ИмяКолонки, " ") > 0, СтрЗаменить(ТРег(ИмяКолонки), " ", ""), ИмяКолонки);
СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов));
КонецЦикла;
ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда
СтруктураКолонок = Новый Структура;
Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл
Обл2 = ТабДок.Область(1, ИндексКолонки);
ИмяКолонки = "К" + Формат(ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0");
СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов));
КонецЦикла;
КонецЕсли;
Таблица = ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, ?(ЕстьЗаголовок, 2, 1), 1);
Возврат Таблица;
КонецФункции;
// Сохраняет таблицу значений в файле в виде табличного документа.
//
// Параметры:
// ИмяФайла - <Строка> - Путь к файлу MXL;
// ТабЗначений - <ТаблицаЗначений> - Сохраняемая таблица значений;
// ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет.
//
Процедура ЗаписатьТЗВ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);
// цикл по колонкам таблицы
// РезультатЗапроса.Колонки.Количество() // - количество колонок
Для каждого полеТЗ из ЗаписьТЗ цикл
// значения ячейки в Excel
типПоляТЗ = ТипЗнч(полеТЗ);
если типПоляТЗ = Тип("Число") тогда
полеТЗ=Строка(полеТЗ);
полеТЗ=СтрЗаменить(полеТЗ,Символ160,"");
полеТЗ=СтрЗаменить(полеТЗ,",",".");
иначеесли типПоляТЗ = Тип("Строка") тогда
иначе
полеТЗ = строка(полеТЗ);
КонецЕсли;
имяОбласти = "R" + номерСтроки + "C" + НомерКолонки;
имяОбласти = СтрЗаменить(имяОбласти,Символ(160),"");
Ячейка = ТабличныйДокумент.Область(имяОбласти);
Ячейка.Текст = полеТЗ;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецФункции
// Заполнить наименованиями колонок таблицу
Функция НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент)
// массКолонки = новый массив();
номерСтроки=1;
номКолонки=1;
ТабличныйДокумент = новый ТабличныйДокумент;
// цикл по коллекции колонок
Для НомКол=0 по ТаблицаЗначений.Колонки.Количество() - 1 Цикл
//Сообщить(Колонка.Имя + "(" + Колонка.ТипЗначения + ")" );
имяКолонки=ТаблицаЗначений.Колонки[НомКол].Имя;
//ТабличныйДокумент.Область(
имяОбласти = "R" + номерСтроки + "C" + номКолонки;
имяОбласти = СтрЗаменить(имяОбласти,Символ(160),"");
Ячейка = ТабличныйДокумент.Область(имяОбласти);
//значениеЯчейки = СтрЗаменить(имяОбласти,Символ(160),"");
Ячейка.Текст = имяКолонки;
// на основе текущего шрифта сделаем Жирный
ЖирныйШрифт = ?(ЖирныйШрифт = Неопределено,Новый Шрифт(Ячейка.Шрифт,,,Истина),ЖирныйШрифт);
Ячейка.Шрифт = ЖирныйШрифт;
номКолонки = номКолонки + 1;
КонецЦикла;
КонецФункции
// Заполнить построчно табличный документ
Функция Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент)
//Выборка = РезультатЗапроса.Выбрать();
НомСтр=1; // заполняем данными начиная со 2-й строки
// цикл по строкам таблицы
Для каждого записьТЗ из ТаблицаЗначений Цикл
НомСтр = НомСтр + 1;
// цикл по колонкам таблицы
ЗаписьТЗ2ТабДок(записьТЗ,НомСтр,ТабличныйДокумент);
КонецЦикла;
КонецФункции
// Таблица значений в табличный документ
Функция ТаблицаЗначений2Mxl(ТаблицаЗначений,ФайлMxl)
ТабличныйДокумент = новый ТабличныйДокумент;
// вывести колонки
НаимКолонок2Mxl(ТаблицаЗначений,ТабличныйДокумент);
// вывести содержимое таблицы
Таблица2Mxl(ТаблицаЗначений,ТабличныйДокумент);
ТабличныйДокумент.Записать(ФайлMxl,ТипФайлаТабличногоДокумента.MXL);
ТабличныйДокумент.Показать(ФайлMxl,ФайлMxl);
Возврат 0;
КонецФункции
Функция Тест_ВыгрузитьТЗвMxl();
файл_мТЗИсходныеДанные = "мТЗИсходныеДанные.dat";
ТЗ = ЗагрузитьТЗизФайла(файл_мТЗИсходныеДанные);
ФайлMxl = КаталогВременныхФайлов() + СтрЗаменить(файл_мТЗИсходныеДанные,".dat",".mxl");
ТаблицаЗначений2Mxl(ТЗ,ФайлMxl);
КонецФункции
Тест_ВыгрузитьТЗвMxl();
Пример выгруженной таблицы значений в файл:
Категория:
Работа с Таблицей Значений Импорт/экспорт CSV в ТЗ Код 1C v 8.х //ПреобразоватьТекстCSVвТЗ () импортирует данные в ТЗ из текста формата CSV
//Параметры:
//ТекстCSV - Строка, содержащая текст в формате csv
//Разделитель - Для формата CSV разделителем является ',', но т.к.
// Excel берет разделитель из региональных стандартов, то
// используется ';', поддерживает многострочные поля
//
&НаСервереБезКонтекста
Функция ПреобразоватьТекст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
//Параметры:
//ТЗ - Таблица значений данные которые сохраняются в файл
//флЭкспортироватьИменаКолонок - Первой строкой выводить имена колонок
//Разделитель - Для формата CSV разделителем является ',', но т.к.
// Excel берет разделитель из региональных стандартов, то
// используется ';'
//
&НаСервереБезКонтекста
Функция ПреобразоватьТЗвТекстCSV(ТЗ, Разделитель = ";", флЭкспортироватьИменаКолонок = Ложь) Экспорт
ТекстCSV = "";
Если флЭкспортироватьИменаКолонок Тогда
//Если нужно выгружать наименование колонок Выгружаем
ПодготовленнаяСтрока = "";
Для Каждого Колонка Из ТЗ.Колонки Цикл
ПодготовленнаяСтрока = ПодготовленнаяСтрока + Колонка.Имя + Разделитель;
КонецЦикла;
ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1);
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС;
КонецЕсли;
Для Каждого Строка Из ТЗ Цикл
ПодготовленнаяСтрока = "";
Для Каждого Колонка Из ТЗ.Колонки Цикл
ПреобразованноеПоле = Строка[Колонка.Имя];
//по правилам CSV если поле содержит двойные ковычки они должны повторятся дважды
Если Найти(ПреобразованноеПоле,"""") Тогда
ПреобразованноеПоле = СтрЗаменить(ПреобразованноеПоле,"""","""""");
КонецЕсли;
//по правилам CSV если поле содержит перенос строки или запятую оно должно заключатся в двойные кавычки
Если Найти(ПреобразованноеПоле,Разделитель) ИЛИ Найти(ПреобразованноеПоле,Символы.ПС) ИЛИ Найти(ПреобразованноеПоле,"""") Тогда
ПреобразованноеПоле = """" + ПреобразованноеПоле + """";
КонецЕсли;
ПодготовленнаяСтрока = ПодготовленнаяСтрока + ПреобразованноеПоле + Разделитель;
КонецЦикла;
ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1);
ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС;
КонецЦикла;
Возврат ТекстCSV;
КонецФункции
Источник
Категория:
Работа с Таблицей Значений Загрузка данных в документ из табличного документа (в ТД скопировано из Excel) Частенько пользователи просят упростить ввод данных в программу используя копирование таблиц из Excel. Ниже я приведу пример как загрузить данные скопированные из Excel:
Создаем форму для загрузки данных:
внутри пишем код:
Код 1C v 8.х // Функция ПолучитьТЗИзМакета(ТабДок, КолонкаИндекса = 1)
ТаблицаДанных = Новый ТаблицаЗначений;
НомерКолонки = 0;
Пока Истина Цикл
НомерКолонки = НомерКолонки + 1;
ИмяКолонки = ТабДок.Область(1, НомерКолонки).Текст;
Если ПустаяСтрока(ИмяКолонки) Тогда
Прервать;
КонецЕсли;
ТаблицаДанных.Колонки.Добавить("К"+Строка(НомерКолонки));
КонецЦикла;
СчетчикКолонок = НомерКолонки - 1;
НомерСтроки = 1; ФлагПрерывания = Ложь;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
Стр = ТаблицаДанных.Добавить();
Для А = 1 ПО СчетчикКолонок Цикл
ТекстКолонки = ТабДок.Область(НомерСтроки, А).Текст;
Если ПустаяСтрока(ТекстКолонки) Тогда
Если А = КолонкаИндекса Тогда
Флагпрерывания = Истина;
ТаблицаДанных.Удалить(Стр);
КонецЕсли;
Иначе
Стр[А - 1] = ТекстКолонки
КонецЕсли;
Если Флагпрерывания Тогда
Прервать
КонецЕсли;
КонецЦикла;
Если Флагпрерывания Тогда
Прервать
КонецЕсли;
КонецЦикла;
Возврат ТаблицаДанных
КонецФункции
Процедура ОсновныеДействияФормыЗагрузить(Кнопка)
тзДанных=ПолучитьТЗИзМакета(ЭлементыФормы.ПолеТД);
Закрыть(тзДанных);
КонецПроцедуры
В документ добавлена кнопка - Загрузка из Excel ее код:
Код 1C v 8.х //Функция преобразует строку вида 31.01.2015 в дату
Функция РазобратьДату(ИзмДата);
Возврат Дата(Сред(ИзмДата,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 - путь до Excel файла
// НомерСтраницы - Номер страницы в Excel
// ПерСтрокаЗаголовок - первая строка Excel содержит имена столбцов
// ФормаИндикатора - Стандартная форма прогресса работы
Функция Из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.ConnectionTimeout=0;
//Conn.CursorLocation=3;
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.х Процедура ВыгрузитьТаблицуВФайл()
//1. Open Excel-file
Если 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;
//FileOfReports.Visible = 1;
КонецЕсли;
//2.=========================================================================
//Состояние("Анализ структуры файла...");
чОтчетов = ТаблицаОтчетов.Количество();
ЭлементыФормы.ИндикаторЗагрузки.МинимальноеЗначение = 0;
ЭлементыФормы.ИндикаторЗагрузки.МаксимальноеЗначение = чОтчетов;
ЭлементыФормы.Logo.Заголовок = "Выгружаю документы";
лСчетчикИндикатора = 0;
ВыгрузитьЗаголовокТаблицы(26);
//ВЫГРУЖАЮ ТАБЛИЦУ В ФАЙЛ ПО СТРОКАМ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
фСтарт=истина; //флаг первого прохода
чОт=2; //номер первой строки с данными
Пока чОтчетов >= 1 Цикл //Цикл по строкам Таблицы отчетов
чОтчетов = чОтчетов -1;
СтрокаОтчетов = ТаблицаОтчетов.Получить(чОтчетов);
Если (СтрокаОтчетов.ДатаВыпуска=ДатаВыпускаПред)
И (СтрокаОтчетов.Принадлежность=ПринадлежностьПред)
И (СтрокаОтчетов.Типоразмер=ТипоразмерПред)
И (СтрокаОтчетов.ТипОсновы=ТипОсновыПред)
Тогда
Иначе
ДатаВыпускаПред=СтрокаОтчетов.ДатаВыпуска;
ПринадлежностьПред=СтрокаОтчетов.Принадлежность;
ТипоразмерПред=СтрокаОтчетов.Типоразмер;
ТипОсновыПред=СтрокаОтчетов.ТипОсновы;
Если фСтарт Тогда
фСтарт = ложь; //Уже не первый проход
Иначе
чДо=глСчетчикСтрок;
ВыгрузитьСтрокуИтог(чОт,чДо,26);
КонецЕсли;
чОт=глСчетчикСтрок;
КонецЕсли;
ВыгрузитьСтрокуОтчетовВФайл(СтрокаОтчетов,26);
лСчетчикИндикатора = лСчетчикИндикатора + 1;
ЭлементыФормы.ИндикаторЗагрузки.Значение = лСчетчикИндикатора;
ОбработкаПрерыванияПользователя();
КонецЦикла;
чДо=глСчетчикСтрок;
ВыгрузитьСтрокуИтог(чОт,чДо,26);
//КОНЕЦ ВЫГРУЗКИ СТРОК В ФАЙЛ
Состояние("Данные файла выгружены");
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libСообщитьНК1("ИНФО: ШАГ 1 ВЫПОЛНЕН. Данные файла Отчеты.DBF успешно считаны",1);
//Состояние("Создание сводных таблиц");
ЭлементыФормы.Logo.Заголовок = "Создание сводных таблиц";
//РазделитьОбласти();
//Range("A2").S_elect
//ActiveWindow.FreezePanes = True
СоздатьТаблицуЛист(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);
//Создает сводную таблицу стрСводнаяТаблица с полями (стрПоле4 - поле реквизита)
//и размещает ее на одноименном листе
//Заполняет сводную таблицу данными, взятыми с листа стрДанные
//Поле стрПоле2 может быть полем списка через запятую
//0. Вспомогательный разбор списка значений в стрПоле2 и определение числа значений
лПоля.Очистить(); //сбросим все значения, если таковые весели в памяти
стрПоля=стрПоле2;
i=1;//число значений в списке
Пока Найти(стрПоля,",")<>0 Цикл
n=Найти(стрПоля,",");
лПоля.Добавить(Сред(стрПоля,1,n-1));
стрПоля=Сред(стрПоля,n+1);
i=i+1;
КонецЦикла;
лПоля.Добавить(стрПоля);
//1. Установить диапазон выборки данных
FirstSheet.Activate();
дДиапазонДанных=FirstSheet.UsedRange.Address;
ДиапазонДанных=FirstSheet.Name+"!"+Строка(дДиапазонДанных);
//2. Создать кэш под сводную таблицу
// аргументы не переменные, а текст с именем переменных (crazy)
SourceType = xlDatabase;
SourceData = ДиапазонДанных;
Cache = MyBook.PivotCaches().Add(SourceType, SourceData);
//для отладки: FileOfReports.Visible = 1;
//3. Породить из кэша сводную таблицу с именем стрСводнаяТаблица
TableDestination="";
TableName=стрСводнаяТаблица;
Cache.CreatePivotTable(TableDestination,TableName);
//4. Определить представление данных в сводной таблице
//стрПоле1
Если СокрЛП(стрПоле1)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле1).Orientation = 3; //xlRowField=1 то, что указывается справа у таблицы
КонецЕсли;
//стрПоле2
чНомер=0;
Пока чНомер<i Цикл
Если СокрЛП(лПоля[чНомер].Значение)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(лПоля[чНомер].Значение).Orientation = 1;
КонецЕсли;
чНомер = чНомер + 1;
КонецЦикла;
//стрПоле3
Если СокрЛП(стрПоле3)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле3).Orientation = 2; //xlColumnField=2 то, что указывается в вепрхней части таблицы
КонецЕсли;
//стрПоле4
Если СокрЛП(стрПоле4)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле4).Orientation = 4; //xlCount=4 data
КонецЕсли;
//5. Скрыть пустые строки в стрПоле2, предварительно проверив, что таковые СУЩЕСТВУЮТ!!!!
//стрПоле2
чНомер=0;
Пока чНомер<i Цикл
Если СокрЛП(лПоля[чНомер].Значение)<>"" Тогда
Если IfPivotItemExists(TableName,лПоля[чНомер].Значение,"(пусто)")Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(лПоля[чНомер].Значение).PivotItems("(пусто)").Visible = False;
КонецЕсли;
КонецЕсли;
чНомер = чНомер + 1;
КонецЦикла;
//6. Закрыть вспомогательные панели
MyBook.ShowPivotTableFieldList = False;
FileOfReports.CommandBars("PivotTable").Visible = False;
//7. Присвоить активному листу имя, заданное в параметрах процедуры
MyBook.ActiveSheet.Name = стрСводнаяТаблица;
//8. Сохранить файл
MyBook.Save();
КонецПроцедуры
Функция IfPivotItemExists(strTableName,strFieldName,strItemName)
//Проверяет существование позиции поля сводной таблицы со значением strItemName
nItems = MyBook.ActiveSheet.PivotTables(strTableName).PivotFields(strFieldName).PivotItems().Count;
i = 1;
Пока i <= nItems Цикл
Если strItemName=MyBook.ActiveSheet.PivotTables(strTableName).PivotFields(strFieldName).PivotItems(i).Name Тогда
//Искомая позиция strItemName существует:
//Сообщить("Позиция "+strItemName+" найдена");
Возврат True;
КонецЕсли;
i=i+1;
КонецЦикла;
//Сообщить("Позиция "+strItemName+" не найдена");
Возврат False;
КонецФункции
Код 1C v 7.x РабочаяКнига = СоздатьОбъект("Excel.Application");
РабочаяКнига.SheetsInNewWorkbook = 1;
РабочаяКнига.Caption = "Отчет по договорам отгрузки";
NewBook = РабочаяКнига.Workbooks;
List = NewBook.Add;
СписокСтолбцов = СоздатьОбъект("СписокЗначений");
СписокСтолбцов.ДобавитьЗначение("Модель");
СписокСтолбцов.ДобавитьЗначение("Разнорядка");
СписокСтолбцов.ДобавитьЗначение("По договору");
СписокСтолбцов.ДобавитьЗначение("Отгрузили");
СписокСтолбцов.ДобавитьЗначение("Осталось");
//Заполним наименование столбцов: Модель, Разнорядка, Количество
Для Столбец = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(1,Столбец);
Ячейка.Value = СписокСтолбцов.ПолучитьЗначение(Столбец);
КонецЦикла;
//Формируем запрос по регистру
// //Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНач по ДатаКон;
|Разнорядка = Регистр.УчетДоговоров.Разнорядка;
|Модель = Регистр.УчетДоговоров.Модель.Группа;
|Колво = Регистр.УчетДоговоров.Количество;
|Функция КолвоПриход = Приход(Колво);
|Функция КолвоРасход = Расход(Колво);
|Функция КолвоОст = КонОст(Колво);
|Группировка Разнорядка;
|Группировка Модель;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
НомерСтроки = 1;
Пока Запрос.Группировка("Разнорядка") = 1 Цикл
Пока Запрос.Группировка("Модель") = 1 Цикл
Модель = Запрос.Модель;
Разнорядка = Запрос.Разнорядка;
КолПоДоговору = Запрос.КолвоПриход;
КолОтгрузили = Запрос.КолвоРасход;
КолОсталось = Запрос.КолвоОст;
НомерСтроки = НомерСтроки + 1;
//Организум заполнение ячеек Excel
Для Ст = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(НомерСтроки,Ст);
Если Ст = 1 Тогда
Ячейка.Value = Модель;
ИначеЕсли Ст = 2 Тогда
Ячейка.Value = Строка(Разнорядка);
ИначеЕсли Ст = 3 Тогда
Ячейка.Value = КолПоДоговору;
ИначеЕсли Ст = 4 Тогда
Ячейка.Value = КолОтгрузили;
ИначеЕсли Ст = 5 Тогда
Ячейка.Value = КолОсталось;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СводнаяТаблица = РабочаяКнига.ActiveSheet.PivotTableWizard;
//Метод СводнаяТаблица.Name возвращает имя сводной таблицы
//Можно задать имя таблицы СводнаяТаблица.Name = "МояТаблица"
СводнаяТаблица.SmallGrid = 0;
//Разворачивает макет сводной таблицы
//Обращение к ячейкам сводной таблицы возможно по номеру
//Например, СводнаяТаблица.PivotFields(1).Value
//возвращает значение "Модель"
//Попробуем с другого конца
//1 - Row
//2 - Column
//3 - Page
//4 - Data
СводнаяТаблица.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
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт
#Если Клиент Тогда
Состояние("Установка соединения с Excel");
#КонецЕсли
//ЗаголовкиВСтроке1 = "HDR=YES;"
ЗаголовкиВСтроке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
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция 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
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция 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, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);
// Массив типа COMSafeArray
Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
КолвоСтрок = Массив.GetUpperBound(1);
Для НомерСтроки = 1 По КолвоСтрок Цикл
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает список листов Excel
//
// Параметры:
// пФайл - Имя файла
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// СписокЗначений
//
Функция 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