Читайте дальше...
Запись текстового файла с разными кодировками
// Запись текстового файла с использованием различных кодировок
Процедура ЗаписьТекстовогоФайла()
Текст = "Строка 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-файлов учитывайте возможное наличие кавычек и экранированных разделителей








