helpf.pro
Регистрация
 +4 
Распечатать

Функции сохранения таблицы значений в файл и чтения из файла

В данном примере хочу привести несколько универсальных функций по выгрузке таблицы значений в файл и дальнейшего чтения из файла:

Порядок программных действий при выгрузке в файл выглядит так:

  • Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки);
  • Конвертируем таблицу значений в табличный документ;
  • Сохраняем табличный документ в 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();   

Пример выгруженной таблицы значений в файл:

Разместил:   Версии: | 8.2 УП | 8.3 |  Дата:   Прочитано: 47198
 +4 
Распечатать
Возможно, вас также заинтересует
10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1Cv8.1CD - Файл данных достиг максимального размера! 9
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!