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

Примеры чтения и записи текстовых файлов на языке программирования 1С:Предприятие. Примеры позволяют быстро разобраться в вопросе и использовать код в своих разработках

Запись текстового файла с разными кодировками

// Запись текстового файла с использованием различных кодировок
Процедура ЗаписьТекстовогоФайла()

    Текст = "Строка 1" + Символы.ПС +
            "Строка 2" + Символы.ПС +
            "Строка 3";
    
    // Запись в ANSI (системная кодировка по умолчанию)
    ФайлANSI = Новый ЗаписьТекста("C:\Temp\file_ansi.txt", КодировкаТекста.ANSI);
    ФайлANSI.Записать(Текст);
    ФайлANSI.Закрыть();
    
    // Запись в UTF-8 (без BOM)
    ФайлUTF8 = Новый ЗаписьТекста("C:\Temp\file_utf8.txt", КодировкаТекста.UTF8);
    ФайлUTF8.ЗаписатьСтроку("Первая строка в UTF-8");
    ФайлUTF8.ЗаписатьСтроку("Вторая строка в UTF-8");
    ФайлUTF8.Закрыть();
    
    // Запись в UTF-8 с BOM (метаданными)
    ФайлUTF8BOM = Новый ЗаписьТекста("C:\Temp\file_utf8_bom.txt", КодировкаТекста.UTF8, Истина);
    ФайлUTF8BOM.Записать("Текст с BOM");
    ФайлUTF8BOM.Закрыть();
    
    // Запись в UTF-16
    ФайлUTF16 = Новый ЗаписьТекста("C:\Temp\file_utf16.txt", КодировкаТекста.UTF16);
    ФайлUTF16.ЗаписатьСтроку("Строка в UTF-16");
    ФайлUTF16.Закрыть();
    
    Сообщить("Файлы успешно созданы в C:\Temp\");
    
КонецПроцедуры

Чтение текстового файла целиком

// Чтение всего содержимого текстового файла
Процедура ЧтениеФайлаЦеликом()

    ИмяФайла = "C:\Temp\file_utf8.txt";
    
    Попытка
        // Способ 1: через ЧтениеТекста
        Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
        ВесьТекст = Чтение.Прочитать();
        Чтение.Закрыть();
        
        Сообщить("Прочитано через ЧтениеТекста:");
        Сообщить(ВесьТекст);
        
        // Способ 2: через ТекстовыйДокумент
        Документ = Новый ТекстовыйДокумент;
        Документ.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
        
        Сообщить("Количество строк: " + Документ.КоличествоСтрок());
        Сообщить("Содержимое:");
        Для Ном = 0 По Документ.КоличествоСтрок() - 1 Цикл
            Сообщить(Документ.ПолучитьСтроку(Ном));
        КонецЦикла;
        
    Исключение
        Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Построчное чтение текстового файла

// Чтение файла построчно для экономии памяти (особенно для больших файлов)
Процедура ПострочноеЧтениеФайла()

    ИмяФайла = "C:\Temp\large_file.txt";
    
    // Сначала создадим тестовый файл
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Для Инд = 1 По 100 Цикл
        Запись.ЗаписатьСтроку("Строка " + Строка(Инд) + ": Пример данных для чтения");
    КонецЦикла;
    Запись.Закрыть();
    
    // Построчное чтение
    Попытка
        Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
        
        НомерСтроки = 0;
        Пока Чтение.КонтрольнаяСумма() = 0 Или Чтение.Прочитать() Цикл
            // Прочитать() возвращает строку и перемещает указатель
            Строка = Чтение.Прочитать();
            НомерСтроки = НомерСтроки + 1;
            
            // Обрабатываем строку
            Если НомерСтроки = 1 Тогда
                Сообщить("Первая строка: " + Строка);
            КонецЕсли;
            
            Если НомерСтроки % 10 = 0 Тогда
                Сообщить("Прочитано строк: " + НомерСтроки);
            КонецЕсли;
        КонецЦикла;
        
        Чтение.Закрыть();
        Сообщить("Всего прочитано строк: " + НомерСтроки);
        
    Исключение
        Сообщить("Ошибка: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Дозапись в существующий текстовый файл

// Добавление данных в конец существующего файла
Процедура ДозаписьВФайл()

    ИмяФайла = "C:\Temp\log.txt";
    
    // Первоначальная запись
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку("=== Начало лога ===");
    Запись.Закрыть();
    
    // Дозапись (режим добавления)
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, Истина); // Истина - дозапись
    Запись.ЗаписатьСтроку("Событие 1: " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy HH:MM:SS"));
    Запись.ЗаписатьСтроку("Событие 2: " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy HH:MM:SS"));
    Запись.Закрыть();
    
    // Читаем результат
    Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
    Сообщить("Содержимое файла:");
    Пока Чтение.Прочитать() Цикл
        Сообщить(Чтение.ПрочитаннаяСтрока);
    КонецЦикла;
    Чтение.Закрыть();
    
КонецПроцедуры

Копирование и перемещение текстовых файлов

// Операции копирования, перемещения и удаления текстовых файлов
Процедура КопированиеПеремещениеФайлов()

    ИсходныйФайл = "C:\Temp\source.txt";
    ЦелевойФайл = "C:\Temp\destination.txt";
    НовыйФайл = "C:\Temp\new_location.txt";
    
    // Создаем исходный файл
    Запись = Новый ЗаписьТекста(ИсходныйФайл, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку("Исходное содержимое файла");
    Запись.Закрыть();
    
    // Копирование файла
    Попытка
        КопироватьФайл(ИсходныйФайл, ЦелевойФайл);
        Сообщить("Файл скопирован: " + ЦелевойФайл);
    Исключение
        Сообщить("Ошибка копирования: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Перемещение (переименование) файла
    Попытка
        ПереместитьФайл(ЦелевойФайл, НовыйФайл);
        Сообщить("Файл перемещен: " + НовыйФайл);
    Исключение
        Сообщить("Ошибка перемещения: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Проверка существования
    Если ФайлСуществует(НовыйФайл) Тогда
        Сообщить("Файл существует");
        
        // Получение информации о файле
        Инфо = Новый ИнформацияОФайле(НовыйФайл);
        Сообщить("Размер: " + Инфо.Размер + " байт");
        Сообщить("Создан: " + Формат(Инфо.ДатаСоздания, "ДФ=dd.MM.yyyy HH:MM:SS"));
        Сообщить("Изменен: " + Формат(Инфо.ДатаИзменения, "ДФ=dd.MM.yyyy HH:MM:SS"));
        
        // Удаление файла
        УдалитьФайлы(НовыйФайл);
        Сообщить("Файл удален");
    КонецЕсли;
    
КонецПроцедуры

Чтение CSV-файла с парсингом

// Чтение CSV-файла с разбором по колонкам
Процедура ЧтениеCSVФайла()

    ИмяCSV = "C:\Temp\data.csv";
    
    // Создаем CSV-файл
    ЗаписьCSV = Новый ЗаписьТекста(ИмяCSV, КодировкаТекста.UTF8);
    ЗаписьCSV.ЗаписатьСтроку("Имя;Возраст;Город");
    ЗаписьCSV.ЗаписатьСтроку("Иванов;25;Москва");
    ЗаписьCSV.ЗаписатьСтроку("Петров;30;СПб");
    ЗаписьCSV.ЗаписатьСтроку("Сидоров;28;Казань");
    ЗаписьCSV.Закрыть();
    
    // Чтение CSV с парсингом
    Чтение = Новый ЧтениеТекста(ИмяCSV, КодировкаТекста.UTF8);
    
    ЗаголовкиПрочитаны = Ложь;
    МассивЗаголовков = Новый Массив;
    Таблица = Новый ТаблицаЗначений;
    
    Пока Чтение.Прочитать() Цикл
        Строка = Чтение.ПрочитаннаяСтрока;
        Если ПустаяСтрока(Строка) Тогда
            Продолжить;
        КонецЕсли;
        
        // Разбиваем строку на колонки
        Колонки = СтрРазделить(Строка, ";");
        
        Если Не ЗаголовкиПрочитаны Тогда
            // Первая строка - заголовки
            Для Каждого Заголовок Из Колонки Цикл
                МассивЗаголовков.Добавить(СокрЛП(Заголовок));
                Таблица.Колонки.Добавить(СокрЛП(Заголовок));
            КонецЦикла;
            ЗаголовкиПрочитаны = Истина;
        Иначе
            // Строка данных
            НоваяСтрока = Таблица.Добавить();
            Для Инд = 0 По Колонки.Количество() - 1 Цикл
                Если Инд < МассивЗаголовков.Количество() Тогда
                    ИмяКолонки = МассивЗаголовков[Инд];
                    НоваяСтрока[ИмяКолонки] = СокрЛП(Колонки[Инд]);
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    Чтение.Закрыть();
    
    // Вывод результата
    Сообщить("Прочитано строк: " + Таблица.Количество());
    Для Каждого СтрокаТаблицы Из Таблица Цикл
        Сообщить(СтрокаТаблицы.Имя + " | " + СтрокаТаблицы.Возраст + " | " + СтрокаТаблицы.Город);
    КонецЦикла;
    
КонецПроцедуры

Запись таблицы значений в текстовый файл

// Экспорт таблицы значений в текстовый файл с форматированием
Процедура ЗаписьТаблицыВТекстовыйФайл()

    // Создаем тестовую таблицу
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Товар");
    Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Товар = "Ноутбук"; Таблица[0].Количество = 10; Таблица[0].Цена = 50000; Таблица[0].Сумма = 500000;
    Таблица.Добавить().Товар = "Монитор"; Таблица[1].Количество = 5; Таблица[1].Цена = 15000; Таблица[1].Сумма = 75000;
    Таблица.Добавить().Товар = "Клавиатура"; Таблица[2].Количество = 20; Таблица[2].Цена = 2000; Таблица[2].Сумма = 40000;
    
    // Запись в CSV-формате
    ИмяCSV = "C:\Temp\export.csv";
    ЗаписьCSV = Новый ЗаписьТекста(ИмяCSV, КодировкаТекста.UTF8);
    
    // Заголовки
    СтрокаЗаголовков = "";
    Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
        Если Инд > 0 Тогда СтрокаЗаголовков = СтрокаЗаголовков + ";" КонецЕсли;
        СтрокаЗаголовков = СтрокаЗаголовков + Таблица.Колонки[Инд].Имя;
    КонецЦикла;
    ЗаписьCSV.ЗаписатьСтроку(СтрокаЗаголовков);
    
    // Данные
    Для Каждого СтрокаТ Из Таблица Цикл
        СтрокаДанных = "";
        Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
            Если Инд > 0 Тогда СтрокаДанных = СтрокаДанных + ";" КонецЕсли;
            Значение = СтрокаТ[Таблица.Колонки[Инд].Имя];
            СтрокаДанных = СтрокаДанных + Строка(Значение);
        КонецЦикла;
        ЗаписьCSV.ЗаписатьСтроку(СтрокаДанных);
    КонецЦикла;
    
    ЗаписьCSV.Закрыть();
    Сообщить("Таблица экспортирована в " + ИмяCSV);
    
    // Запись в форматированном виде (с выравниванием)
    ИмяTXT = "C:\Temp\report.txt";
    ЗаписьTXT = Новый ЗаписьТекста(ИмяTXT, КодировкаТекста.UTF8);
    
    // Определяем ширину колонок
    Ширины = Новый Массив;
    Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
        Ширины.Добавить(СтрДлина(Таблица.Колонки[Инд].Имя));
    КонецЦикла;
    
    Для Каждого СтрокаТ Из Таблица Цикл
        Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
            Значение = Строка(СтрокаТ[Таблица.Колонки[Инд].Имя]);
            Ширины[Инд] = Макс(Ширины[Инд], СтрДлина(Значение));
        КонецЦикла;
    КонецЦикла;
    
    // Рамка
    СтрокаРамки = "+";
    Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
        СтрокаРамки = СтрокаРамки + Строка("=", Ширины[Инд] + 2) + "+";
    КонецЦикла;
    
    ЗаписьTXT.ЗаписатьСтроку(СтрокаРамки);
    
    // Заголовки
    СтрокаЗаголовка = "|";
    Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
        СтрокаЗаголовка = СтрокаЗаголовка + " " + Выровнять(Таблица.Колонки[Инд].Имя, Ширины[Инд]) + " |";
    КонецЦикла;
    ЗаписьTXT.ЗаписатьСтроку(СтрокаЗаголовка);
    ЗаписьTXT.ЗаписатьСтроку(СтрокаРамки);
    
    // Данные
    Для Каждого СтрокаТ Из Таблица Цикл
        СтрокаДанных = "|";
        Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
            Значение = СтрокаТ[Таблица.Колонки[Инд].Имя];
            СтрокаДанных = СтрокаДанных + " " + Выровнять(Строка(Значение), Ширины[Инд]) + " |";
        КонецЦикла;
        ЗаписьTXT.ЗаписатьСтроку(СтрокаДанных);
    КонецЦикла;
    
    ЗаписьTXT.ЗаписатьСтроку(СтрокаРамки);
    ЗаписьTXT.Закрыть();
    
    Сообщить("Форматированный отчет сохранен в " + ИмяTXT);
    
КонецПроцедуры

Функция Выровнять(Текст, Ширина)
    Пробелов = Ширина - СтрДлина(Текст);
    Если Пробелов <= 0 Тогда
        Возврат Лев(Текст, Ширина);
    КонецЕсли;
    Возврат Текст + Строка(" ", Пробелов);
КонецФункции

Функция Строка(Символ, Длина)
    Результат = "";
    Для Инд = 1 По Длина Цикл
        Результат = Результат + Символ;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Обработка больших файлов с контролем памяти

// Эффективная обработка больших текстовых файлов без загрузки всего в память
Процедура ОбработкаБольшогоФайла()

    ИмяФайла = "C:\Temp\large_input.txt";
    ИмяРезультата = "C:\Temp\filtered_output.txt";
    
    // Создаем тестовый большой файл
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Для Инд = 1 По 10000 Цикл
        Запись.ЗаписатьСтроку("Строка " + Строка(Инд) + ": некоторые данные с ключевым словом");
    КонецЦикла;
    Запись.Закрыть();
    
    // Обработка файла с фильтрацией
    Попытка
        ВходнойФайл = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
        ВыходнойФайл = Новый ЗаписьТекста(ИмяРезультата, КодировкаТекста.UTF8);
        
        СчетчикСтрок = 0;
        СчетчикСовпадений = 0;
        
        Пока ВходнойФайл.Прочитать() Цикл
            ТекущаяСтрока = ВходнойФайл.ПрочитаннаяСтрока;
            СчетчикСтрок = СчетчикСтрок + 1;
            
            // Фильтрация: оставляем только строки с "данные"
            Если СтрНайти(ТекущаяСтрока, "данные") > 0 Тогда
                ВыходнойФайл.ЗаписатьСтроку(ТекущаяСтрока);
                СчетчикСовпадений = СчетчикСовпадений + 1;
            КонецЕсли;
            
            // Прогресс каждые 1000 строк
            Если СчетчикСтрок % 1000 = 0 Тогда
                Сообщить("Обработано строк: " + СчетчикСтрок + 
                         ", отфильтровано: " + СчетчикСовпадений);
            КонецЕсли;
        КонецЦикла;
        
        ВходнойФайл.Закрыть();
        ВыходнойФайл.Закрыть();
        
        Сообщить("Обработка завершена. Всего строк: " + СчетчикСтрок + 
                 ", сохранено: " + СчетчикСовпадений);
        
    Исключение
        Сообщить("Ошибка: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Чтение файла с определением кодировки

// Автоматическое определение кодировки текстового файла
Процедура ЧтениеСОпределениемКодировки()

    ИмяФайла = "C:\Temp\unknown_encoding.txt";
    
    // Создаем файлы в разных кодировках для теста
    Функция СоздатьТестовыйФайл(Имя, Кодировка, Текст)
        Запись = Новый ЗаписьТекста(Имя, Кодировка);
        Запись.Записать(Текст);
        Запись.Закрыть();
    КонецФункции
    
    СоздатьТестовыйФайл("C:\Temp\ansi.txt", КодировкаТекста.ANSI, "Текст в ANSI кодировке");
    СоздатьТестовыйФайл("C:\Temp\utf8.txt", КодировкаТекста.UTF8, "Текст в UTF-8 кодировке");
    
    // Функция определения кодировки по BOM и содержимому
    Функция ОпределитьКодировкуФайла(ИмяФайла)
        Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.System, , Ложь);
        Чтение.Открыть();
        
        // Читаем BOM
        БайтПорядка = Чтение.БайтПорядка;
        Чтение.Закрыть();
        
        Если БайтПорядка = БайтПорядкаMark.UTF8 Тогда
            Возврат КодировкаТекста.UTF8;
        ИначеЕсли БайтПорядка = БайтПорядкаMark.UTF16LE Тогда
            Возврат КодировкаТекста.UTF16LE;
        ИначеЕсли БайтПорядка = БайтПорядкаMark.UTF16BE Тогда
            Возврат КодировкаТекста.UTF16BE;
        КонецЕсли;
        
        // Если BOM нет, пробуем прочитать как UTF-8
        Попытка
            Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
            Чтение.Прочитать();
            Чтение.Закрыть();
            Возврат КодировкаТекста.UTF8;
        Исключение
            Возврат КодировкаТекста.ANSI;
        КонецПопытки;
    КонецФункции
    
    // Чтение файлов с автоматическим определением кодировки
    Процедура ПрочитатьСАвтоКодировкой(ИмяФайла)
        Кодировка = ОпределитьКодировкуФайла(ИмяФайла);
        
        Сообщить("Файл: " + ИмяФайла);
        Сообщить("Определенная кодировка: " + Кодировка);
        
        Чтение = Новый ЧтениеТекста(ИмяФайла, Кодировка);
        Содержимое = Чтение.Прочитать();
        Чтение.Закрыть();
        
        Сообщить("Содержимое: " + Содержимое);
    КонецПроцедуры
    
    ПрочитатьСАвтоКодировкой("C:\Temp\ansi.txt");
    ПрочитатьСАвтоКодировкой("C:\Temp\utf8.txt");
    
КонецПроцедуры

Примечания

// Важные особенности чтения и записи текстовых файлов:
// 1. Всегда закрывайте файлы методом Закрыть() для освобождения ресурсов
// 2. При дозаписи в файл используйте параметр Добавлять = Истина в ЗаписьТекста
// 3. Для больших файлов используйте построчное чтение (ЧтениеТекста), а не ТекстовыйДокумент
// 4. КодировкаТекста.System - системная кодировка (обычно ANSI для Windows)
// 5. КодировкаТекста.UTF8 с BOM включает сигнатуру байт порядка (EF BB BF)
// 6. Метод Прочитать() читает весь файл, ПрочитатьСтроку() - одну строку
// 7. При построчном чтении удобно использовать цикл Пока Чтение.Прочитать() Цикл
// 8. Для проверки существования файла используйте ФайлСуществует(ИмяФайла)
// 9. Исключения при работе с файлами обрабатывайте конструкцией Попытка...Исключение
// 10. При копировании/перемещении больших файлов возможна задержка, учитывайте это
// 11. Разделитель строк в файле зависит от ОС: Windows - Символы.ПС (CR+LF), Linux/Mac - Символы.ВК (LF)
// 12. Для CSV-файлов учитывайте возможное наличие кавычек и экранированных разделителей

Поделиться с друзьями
Smirnov code
Добавить комментарий