Для работы с текстовыми документами существуют три типа данных –
ТекстовыйДокумент, ЗаписьТекста и ЧтениеТекста . Разница двух подходов состоит в способе загрузки документа:
ТекстовыйДокумент загружает файл целиком и далее построчно обрабатывает его;
ЗаписьТекста и ЧтениеТекста загружают файл построчно.
ПРИМЕР 1:
Запись данных справочника в текстовый файл:
Код 1C v 8.х Текст = Новый ТекстовыйДокумент;
// перебор элементов справочника
Выборка = Справочники.Клиенты.Выбрать();
Пока Выборка.Следующий() Цикл
// выводим в файл код и наименование, разделенные
// каким-либо разделителем, например, ‘;’
Текст.ДобавитьСтроку(""+Выборка.Код+";"+Выборка.Наименование);
КонецЦикла;
// запись в текстовый файл
Текст.Записать("C://1.txt");
С помощью типа ЗаписьТекста этот код будет таким:
Код 1C v 8.х // файл в формате Unicode
Текст = Новый ЗаписьТекста("C://1.txt", КодировкаТекста.UTF8);
// перебор элементов справочника
Выборка = Справочники.Клиенты.Выбрать();
Пока Выборка.Следующий() Цикл
// выводим в файл код и наименование, разделенные
// каким-либо разделителем, например, ‘;’
Текст.ЗаписатьСтроку(""+Выборка.Код+";"+Выборка.Наименование);
КонецЦикла;
// запись в текстовый файл
Текст.Закрыть();
Чтение данных из текстового файла в справочник:
Код 1C v 8.х Текст = Новый ТекстовыйДокумент;
// открытие файла
Текст.Прочитать("C://1.txt");
// перебор строк текстового документа
Для НомерСтроки=1 по Текст.КоличествоСтрок() Цикл
// получить строку файла с указанным номером
Стр = Текст.ПолучитьСтроку(НомерСтроки);
// «распарсивание» строки
// ищем позицию символа-разделителя
Позиция = Найти (Стр, ‘;’);
// создаем новый элемент справочника
Спр=Справочники.Клиенты.СоздатьЭлемент();
// в код записывается подстрока от первого символа до позиции
// символа-разделителя
Спр.Код = Сред(Стр,1,Позиция-1);
// за символом-резделителем – наименование клиента
Спр.Наименование = Сред (Стр, Позиция+1);
Спр.Записать();
КонецЦикла;
С помощью типа ЗаписьТекста этот код будет таким:
Код 1C v 8.х // файл в формате Unicode
Текст = Новый ЧтениеТекста("C://1.txt", КодировкаТекста.UTF8);
// перебор элементов справочника
Стр="";
// пока строки в файле остались
Пока Стр<>Неопределено Цикл
// получить очередную строку файла
Стр = Текст.ПрочитатьСтроку();
// «распарсивание» строки
// ищем позицию символа-разделителя
Позиция = Найти (Стр, ‘;’);
// создаем новый элемент справочника
Спр=Справочники.Клиенты.СоздатьЭлемент();
// в код записывается подстрока от первого символа до позиции
// символа-разделителя
Спр.Код = Число(Сред(Стр,1,Позиция-1));
// за символом-резделителем – наименование клиента
Спр.Наименование = Сред (Стр, Позиция+1);
Спр.Записать();
КонецЦикла;
ПРИМЕР 2:
В строке текста значения реквизитов справочника разделяются символом кавычка. Его можно получить, например, используя функцию Символ(34).
В случае если символ разделителя (в данном случае – кавычка) может встречаться в выгружаемых данных,
перед помещением в строку меняем этот символ на заранее определенную комбинацию символов.
В нашем случае это %
квч %.
Код 1C v 8.х // Выгрузка данных в текстовый файл
Текст = Новый ТекстовыйДокумент;
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Стр = СтрЗаменить(Выборка.Наименование, Символ(34), "%квч %");
Код = Строка(Выборка.Код) + Символ(34);
Текст.ДобавитьСтроку(Код + Стр);
КонецЦикла;
Текст.Записать("c:\temp\text.txt");
//Загрузка данных из текстового файла. При загрузке ориентируемся на используемый разделитель значений (это кавычка).
//После получения значения делаем обратное преобразование для разделителя (при выгрузке
//данных кавычку, встречающуюся в выгружаемых строках, заменяли комбинацией символов %квч %)
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("c:\temp\text.txt");
Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл
Стр = Текст.ПолучитьСтроку(НомерСтроки);
Позиция = Найти(Стр, Символ(34));
Код = Сред(Стр, 1, Позиция-1);
прНаименование = Сред(Стр, Позиция + 1);
Наименование = СтрЗаменить(прНаименование, "%квч %", Символ(34));
Сообщить(Код + "–" + Наименование);
КонецЦикла;
"В предыдущем примере файл ЗАГРУЖАЛСЯ ПОЛНОСТЬЮ, а в следующем примере ЗАГРУЖАЕТСЯ ПОСТРОЧНО."
"Это позволяет при работе с файлами больших размеров значительно уменьшить время выполнения задачи."
//Запись данных в файл построчно
Путь = "c:\temp\text.txt";
Текст = Новый ЗаписьТекста(Путь, КодировкаТекста.UTF8);
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Текст.ЗаписатьСтроку(Выборка.Наименование);
КонецЦикла;
Текст.Закрыть();
//Чтение данных из файла построчно
Путь = "c:\temp\text.txt";
Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8);
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
Стр = Текст.ПрочитатьСтроку();
Сообщить(Стр);
КонецЦикла;
Код 1C v 7.x //Выгрузка данных в TXT файл
Данные = СоздатьОбъект("Текст");
Данные.КодоваяСтраница(0); // принудительная установка
НачВремя = _GetPerformanceCounter(); // Запоминаем время запуска алгоритма
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Стр = ""+ТЗ.ЭтоГруппа+";"+ТЗ.Уровень+";"+ ТЗ.КодРодителя+";"+ТЗ.Код+";"+ТЗ.Наименование; // Символ - разделитель полей - ";"
Данные.ДобавитьСтроку(Стр);
КонецЦикла;
Данные.Записать("c:\export.txt");
КонВремя = _GetPerformanceCounter(); // Запоминаем время окончания алгоритма
// Рассчитываем продолжительность выполнения алгоритма в секундах
Длительность = Окр((КонВремя-НачВремя)/1000,3);
Сообщить("Время выгрузки в TXT файл: "+Длительность+" с");
//Загрузка, чтение данных из TXT файла:
НачВремя = _GetPerformanceCounter(); // Запоминаем время запуска алгоритма
Данные = СоздатьОбъект("Текст");
Данные.КодоваяСтраница(0); // принудительная установка
Данные.Открыть("c:\export.txt");
КолСтр = Данные.КоличествоСтрок();
Для н=1 по КолСтр Цикл
ТекСтр = Данные.ПолучитьСтроку(н);
Состояние("В файле прочитано строк "+н+" из "+КолСтр);
КонецЦикла;
КонВремя = _GetPerformanceCounter(); // Запоминаем время окончания алгоритма
// Рассчитываем продолжительность выполнения алгоритма в секундах
Длительность = Окр((КонВремя-НачВремя)/1000,3);
Сообщить("Время чтения TXT файла: "+Длительность+" с");