Читайте дальше...
Создание текстового документа и добавление строк
// Создание текстового документа, добавление строк и получение содержимого
Процедура СозданиеТекстовогоДокумента()
// Создаем новый текстовый документ
Текст = Новый ТекстовыйДокумент;
// Добавляем строки
Текст.ДобавитьСтроку("Первая строка");
Текст.ДобавитьСтроку("Вторая строка");
Текст.ДобавитьСтроку("Третья строка");
// Добавляем строку в начало
Текст.ВставитьСтроку("Строка в начале", 0);
// Добавляем строку в конец
Текст.ВставитьСтроку("Строка в конце", Текст.КоличествоСтрок());
// Создаем текстовый документ с инициализацией
ДругойТекст = Новый ТекстовыйДокумент;
ДругойТекст.УстановитьТекст("Строка 1" + Символы.ПС + "Строка 2" + Символы.ПС + "Строка 3");
// Выводим содержимое
Сообщить("Количество строк: " + Текст.КоличествоСтрок());
Сообщить("Весь текст:");
Сообщить(Текст.ПолучитьТекст());
// Получаем отдельную строку
Сообщить("Строка с индексом 1: " + Текст.ПолучитьСтроку(1));
КонецПроцедуры
Чтение и запись текстового файла
// Сохранение текстового документа в файл и загрузка из файла
Процедура РаботаСТекстовымиФайлами()
// Создаем текстовый документ
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Заголовок отчета");
Текст.ДобавитьСтроку("-------------------");
Текст.ДобавитьСтроку("Данные: " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"));
Текст.ДобавитьСтроку("Пользователь: " + Пользователи.ТекущийПользователь().Имя);
// Сохраняем в файл
ИмяФайла = "C:\Temp\report.txt";
Попытка
Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);
Сообщить("Файл успешно сохранен: " + ИмяФайла);
Исключение
Сообщить("Ошибка записи файла: " + ОписаниеОшибки());
КонецПопытки;
// Читаем файл обратно
ПрочитанныйТекст = Новый ТекстовыйДокумент;
Попытка
ПрочитанныйТекст.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
Сообщить("Файл успешно прочитан. Строк: " + ПрочитанныйТекст.КоличествоСтрок());
Сообщить("Содержимое:");
Сообщить(ПрочитанныйТекст.ПолучитьТекст());
Исключение
Сообщить("Ошибка чтения файла: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Редактирование текстового документа (замена, вставка, удаление)
// Операции редактирования текстового документа
Процедура РедактированиеТекста()
// Создаем исходный текст
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Строка 1: Начало");
Текст.ДобавитьСтроку("Строка 2: Середина");
Текст.ДобавитьСтроку("Строка 3: Конец");
Сообщить("Исходный текст:");
ВывестиТекст(Текст);
// Замена строки по индексу
Текст.ЗаменитьСтроку(1, "Строка 2: Измененная середина");
// Вставка строки
Текст.ВставитьСтроку("Строка 1.5: Вставленная строка", 2);
// Удаление строки
Текст.УдалитьСтроку(Текст.КоличествоСтрок() - 1);
Сообщить("После редактирования:");
ВывестиТекст(Текст);
// Очистка документа
Текст.Очистить();
Сообщить("После очистки: строк - " + Текст.КоличествоСтрок());
КонецПроцедуры
Процедура ВывестиТекст(Текст)
Для НомерСтроки = 0 По Текст.КоличествоСтрок() - 1 Цикл
Сообщить(Текст.ПолучитьСтроку(НомерСтроки));
КонецЦикла;
КонецПроцедуры
Поиск и замена в текстовом документе
// Поиск подстроки и замена во всем документе
Процедура ПоискИЗаменаВТексте()
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Клиент: ООО Ромашка");
Текст.ДобавитьСтроку("Товар: Ноутбук");
Текст.ДобавитьСтроку("Количество: 10");
Текст.ДобавитьСтроку("Клиент: ООО Лютик");
Текст.ДобавитьСтроку("Товар: Монитор");
Сообщить("Исходный текст:");
ВывестиТекст(Текст);
// Поиск строк, содержащих подстроку
РезультатыПоиска = Текст.НайтиТекст("Клиент");
Сообщить("Найдено строк с 'Клиент': " + РезультатыПоиска.Количество());
// Замена во всем документе
Текст.ЗаменитьТекст("ООО", "ЗАО");
Сообщить("После замены 'ООО' на 'ЗАО':");
ВывестиТекст(Текст);
// Поиск с учетом регистра
РезультатыСРегистром = Текст.НайтиТекст("клиент", Истина); // Истина - учитывать регистр
Сообщить("Найдено строк с 'клиент' (с учетом регистра): " + РезультатыСРегистром.Количество());
// Замена с использованием индексов строк
Текст.ВставитьСтроку("Итого: 2 клиента", Текст.КоличествоСтрок());
КонецПроцедуры
Форматирование текста (выравнивание, отступы)
// Создание форматированного текста (таблицы, отчеты)
Процедура ФорматированиеТекста()
Текст = Новый ТекстовыйДокумент;
// Заголовок с рамкой
Текст.ДобавитьСтроку("+" + Строка("=", 60) + "+");
Текст.ДобавитьСтроку("|" + Центрировать("ОТЧЕТ О ПРОДАЖАХ", 60) + "|");
Текст.ДобавитьСтроку("+" + Строка("=", 60) + "+");
Текст.ДобавитьСтроку("");
// Шапка таблицы
Текст.ДобавитьСтроку("| " + Выровнять("Товар", 20) +
" | " + Выровнять("Количество", 15) +
" | " + Выровнять("Цена", 10) +
" | " + Выровнять("Сумма", 10) + " |");
Текст.ДобавитьСтроку("|" + Строка("-", 62) + "|");
// Данные
Данные = Новый ТаблицаЗначений;
Данные.Колонки.Добавить("Товар");
Данные.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Данные.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Данные.Добавить().Товар = "Ноутбук"; Данные[0].Количество = 10; Данные[0].Цена = 50000;
Данные.Добавить().Товар = "Монитор"; Данные[1].Количество = 5; Данные[1].Цена = 15000;
Данные.Добавить().Товар = "Клавиатура"; Данные[2].Количество = 20; Данные[2].Цена = 2000;
ОбщаяСумма = 0;
Для Каждого СтрокаДанных Из Данные Цикл
Сумма = СтрокаДанных.Количество * СтрокаДанных.Цена;
ОбщаяСумма = ОбщаяСумма + Сумма;
СтрокаТаблицы = "| " + Выровнять(СтрокаДанных.Товар, 20) +
" | " + Выровнять(Строка(СтрокаДанных.Количество), 15, "right") +
" | " + Выровнять(Формат(СтрокаДанных.Цена, "ЧДЦ=0"), 10, "right") +
" | " + Выровнять(Формат(Сумма, "ЧДЦ=0"), 10, "right") + " |";
Текст.ДобавитьСтроку(СтрокаТаблицы);
КонецЦикла;
// Итог
Текст.ДобавитьСтроку("|" + Строка("-", 62) + "|");
СтрокаИтога = "| " + Выровнять("ИТОГО:", 36) +
" | " + Выровнять("", 15) +
" | " + Выровнять(Формат(ОбщаяСумма, "ЧДЦ=0"), 35, "right") + " |";
Текст.ДобавитьСтроку(СтрокаИтога);
Текст.ДобавитьСтроку("+" + Строка("=", 62) + "+");
// Выводим результат
ВывестиТекст(Текст);
КонецПроцедуры
Функция Строка(Символ, Длина)
Результат = "";
Для Инд = 1 По Длина Цикл
Результат = Результат + Символ;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция Выровнять(Текст, Ширина, Выравнивание = "left")
ТекущаяДлина = СтрДлина(Текст);
Если ТекущаяДлина >= Ширина Тогда
Возврат Лев(Текст, Ширина);
КонецЕсли;
Пробелов = Ширина - ТекущаяДлина;
Если Выравнивание = "left" Тогда
Возврат Текст + Строка(" ", Пробелов);
ИначеЕсли Выравнивание = "right" Тогда
Возврат Строка(" ", Пробелов) + Текст;
Иначе
Левых = Цел(Пробелов / 2);
Правых = Пробелов - Левых;
Возврат Строка(" ", Левых) + Текст + Строка(" ", Правых);
КонецЕсли;
КонецФункции
Функция Центрировать(Текст, Ширина)
Возврат Выровнять(Текст, Ширина, "center");
КонецФункции
Работа с большими текстами (построчная обработка)
// Эффективная обработка больших текстовых документов
Процедура ОбработкаБольшогоТекста()
// Создаем большой текстовый документ (эмуляция)
Текст = Новый ТекстовыйДокумент;
Для Инд = 1 По 10000 Цикл
Текст.ДобавитьСтроку("Строка " + Строка(Инд) + ": некоторые данные");
КонецЦикла;
Сообщить("Размер документа: " + Текст.КоличествоСтрок() + " строк");
// Построчная обработка без загрузки всего текста в память
Счетчик = 0;
Для НомерСтроки = 0 По Текст.КоличествоСтрок() - 1 Цикл
Строка = Текст.ПолучитьСтроку(НомерСтроки);
Если СтрНайти(Строка, "данные") > 0 Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Найдено строк со словом 'данные': " + Счетчик);
// Поиск с остановкой при первом совпадении
НужнаяСтрока = "Строка 5000";
Для НомерСтроки = 0 По Текст.КоличествоСтрок() - 1 Цикл
Если Текст.ПолучитьСтроку(НомерСтроки) = НужнаяСтрока Тогда
Сообщить("Строка найдена на позиции: " + НомерСтроки);
Прервать;
КонецЕсли;
КонецЦикла;
// Эффективное добавление большого количества строк
НовыйТекст = Новый ТекстовыйДокумент;
Буфер = Новый Массив;
Для Инд = 1 По 5000 Цикл
Буфер.Добавить("Строка " + Строка(Инд));
Если Буфер.Количество() = 1000 Тогда
НовыйТекст.ДобавитьСтроку(СтрСоединить(Буфер, Символы.ПС));
Буфер.Очистить();
КонецЕсли;
КонецЦикла;
Если Буфер.Количество() > 0 Тогда
НовыйТекст.ДобавитьСтроку(СтрСоединить(Буфер, Символы.ПС));
КонецЕсли;
Сообщить("Создан новый документ: " + НовыйТекст.КоличествоСтрок() + " строк");
КонецПроцедуры
Генерация HTML из текстового документа
// Преобразование текстового документа в HTML-формат
Процедура ТекстВHTML()
// Создаем текстовый документ с содержимым
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Отчет по продажам");
Текст.ДобавитьСтроку("Дата: " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"));
Текст.ДобавитьСтроку("--------------------------------------------------");
Текст.ДобавитьСтроку("Ноутбук | 10 | 50000 | 500000");
Текст.ДобавитьСтроку("Монитор | 5 | 15000 | 75000");
Текст.ДобавитьСтроку("Клавиатура | 20 | 2000 | 40000");
Текст.ДобавитьСтроку("--------------------------------------------------");
Текст.ДобавитьСтроку("Итого: 615000");
// Конвертируем в HTML
HTML = Новый ТекстовыйДокумент;
HTML.ДобавитьСтроку("<!DOCTYPE html>");
HTML.ДобавитьСтроку("<html>");
HTML.ДобавитьСтроку("<head>");
HTML.ДобавитьСтроку("<meta charset='UTF-8'>");
HTML.ДобавитьСтроку("<title>Отчет</title>");
HTML.ДобавитьСтроку("<style>");
HTML.ДобавитьСтроку("body { font-family: Arial; margin: 20px; }");
HTML.ДобавитьСтроку("h1 { color: #333; }");
HTML.ДобавитьСтроку("table { border-collapse: collapse; width: 100%; }");
HTML.ДобавитьСтроку("th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }");
HTML.ДобавитьСтроку("th { background-color: #4CAF50; color: white; }");
HTML.ДобавитьСтроку(".total { font-weight: bold; background-color: #f2f2f2; }");
HTML.ДобавитьСтроку("</style>");
HTML.ДобавитьСтроку("</head>");
HTML.ДобавитьСтроку("<body>");
// Парсим текстовый документ и преобразуем в HTML
ВТаблице = Ложь;
Для Ном = 0 По Текст.КоличествоСтрок() - 1 Цикл
СтрокаТекст = Текст.ПолучитьСтроку(Ном);
Если Ном = 0 Тогда
HTML.ДобавитьСтроку("<h1>" + СтрокаТекст + "</h1>");
ИначеЕсли СтрокаТекст = "--------------------------------------------------" Тогда
Если Не ВТаблице Тогда
HTML.ДобавитьСтроку("<table>");
HTML.ДобавитьСтроку("<tr><th>Товар</th><th>Количество</th><th>Цена</th><th>Сумма</th></tr>");
ВТаблице = Истина;
Иначе
HTML.ДобавитьСтроку("</table>");
ВТаблице = Ложь;
КонецЕсли;
ИначеЕсли ВТаблице И Найти(СтрокаТекст, "Итого:") = 0 Тогда
Части = СтрРазделить(СтрокаТекст, "|");
HTML.ДобавитьСтроку("<tr>");
Для Каждого Часть Из Части Цикл
HTML.ДобавитьСтроку("<td>" + СокрЛП(Часть) + "</td>");
КонецЦикла;
HTML.ДобавитьСтроку("</tr>");
ИначеЕсли Найти(СтрокаТекст, "Итого:") > 0 Тогда
ЧислоСтрока = СтрЗаменить(СтрокаТекст, "Итого: ", "");
HTML.ДобавитьСтроку("<p class='total'><strong>Итого: </strong>" + ЧислоСтрока + "</p>");
Иначе
HTML.ДобавитьСтроку("<p>" + СтрокаТекст + "</p>");
КонецЕсли;
КонецЦикла;
HTML.ДобавитьСтроку("</body>");
HTML.ДобавитьСтроку("</html>");
// Сохраняем HTML-файл
HTML.Записать("C:\Temp\report.html", КодировкаТекста.UTF8);
Сообщить("HTML-отчет сохранен: C:\Temp\report.html");
КонецПроцедуры
Импорт и экспорт данных из текстовых документов
// Импорт данных из CSV-подобного текстового документа и экспорт в текст
Процедура ИмпортЭкспортДанных()
// Создаем текстовый документ с CSV-подобными данными
Исходный = Новый ТекстовыйДокумент;
Исходный.ДобавитьСтроку("Иванов;Иван;25;50000");
Исходный.ДобавитьСтроку("Петров;Петр;30;60000");
Исходный.ДобавитьСтроку("Сидоров;Сидор;28;55000");
// Импортируем данные в таблицу значений
Таблица = ИмпортироватьТекстВТаблицу(Исходный, ";");
Сообщить("Импортированные данные:");
ВывестиТаблицу(Таблица);
// Модифицируем данные
Для Каждого СтрокаТ Из Таблица Цикл
СтрокаТ.Зарплата = СтрокаТ.Зарплата * 1.1; // Повышаем зарплату на 10%
КонецЦикла;
// Экспортируем обратно в текстовый документ
Результат = ЭкспортироватьТаблицуВТекст(Таблица, ";");
Сообщить("Экспортированные данные:");
ВывестиТекст(Результат);
// Сохраняем в файл
Результат.Записать("C:\Temp\employees.txt", КодировкаТекста.UTF8);
КонецПроцедуры
Функция ИмпортироватьТекстВТаблицу(Текст, Разделитель)
Таблица = Новый ТаблицаЗначений;
Для Ном = 0 По Текст.КоличествоСтрок() - 1 Цикл
СтрокаТекста = Текст.ПолучитьСтроку(Ном);
Если ПустаяСтрока(СтрокаТекста) Тогда
Продолжить;
КонецЕсли;
Части = СтрРазделить(СтрокаТекста, Разделитель);
Если Ном = 0 Тогда
// Первая строка - заголовки
Для Каждого Часть Из Части Цикл
Таблица.Колонки.Добавить(СокрЛП(Часть));
КонецЦикла;
Иначе
// Данные
НоваяСтрока = Таблица.Добавить();
Для Инд = 0 По Части.Количество() - 1 Цикл
ИмяКолонки = Таблица.Колонки[Инд].Имя;
НоваяСтрока[ИмяКолонки] = СокрЛП(Части[Инд]);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Таблица;
КонецФункции
Функция ЭкспортироватьТаблицуВТекст(Таблица, Разделитель)
Результат = Новый ТекстовыйДокумент;
// Заголовки
СтрокаЗаголовков = "";
Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
Если Инд > 0 Тогда
СтрокаЗаголовков = СтрокаЗаголовков + Разделитель;
КонецЕсли;
СтрокаЗаголовков = СтрокаЗаголовков + Таблица.Колонки[Инд].Имя;
КонецЦикла;
Результат.ДобавитьСтроку(СтрокаЗаголовков);
// Данные
Для Каждого СтрокаТ Из Таблица Цикл
СтрокаДанных = "";
Для Инд = 0 По Таблица.Колонки.Количество() - 1 Цикл
Если Инд > 0 Тогда
СтрокаДанных = СтрокаДанных + Разделитель;
КонецЕсли;
Значение = СтрокаТ[Таблица.Колонки[Инд].Имя];
СтрокаДанных = СтрокаДанных + Строка(Значение);
КонецЦикла;
Результат.ДобавитьСтроку(СтрокаДанных);
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура ВывестиТаблицу(Таблица)
Для Каждого СтрокаТ Из Таблица Цикл
СтрокаВывода = "";
Для Каждого Колонка Из Таблица.Колонки Цикл
СтрокаВывода = СтрокаВывода + Колонка.Имя + ":" + Строка(СтрокаТ[Колонка.Имя]) + " ";
КонецЦикла;
Сообщить(СтрокаВывода);
КонецЦикла;
КонецПроцедуры
Работа с кодировками текста
// Конвертация между различными кодировками
Процедура РаботаСКодировками()
// Создаем текст в разных кодировках
ИсходныйТекст = "Привет, мир! Hello, world! 123";
// Сохраняем в разных кодировках
ИмяФайлаANSI = "C:\Temp\ansi.txt";
ИмяФайлаUTF8 = "C:\Temp\utf8.txt";
ИмяФайлаUTF16 = "C:\Temp\utf16.txt";
// ANSI (текущая системная кодировка)
ТекстANSI = Новый ТекстовыйДокумент;
ТекстANSI.УстановитьТекст(ИсходныйТекст);
ТекстANSI.Записать(ИмяФайлаANSI, КодировкаТекста.ANSI);
// UTF-8
ТекстUTF8 = Новый ТекстовыйДокумент;
ТекстUTF8.УстановитьТекст(ИсходныйТекст);
ТекстUTF8.Записать(ИмяФайлаUTF8, КодировкаТекста.UTF8);
// UTF-16 (Unicode)
ТекстUTF16 = Новый ТекстовыйДокумент;
ТекстUTF16.УстановитьТекст(ИсходныйТекст);
ТекстUTF16.Записать(ИмяФайлаUTF16, КодировкаТекста.UTF16);
// Читаем обратно с указанием кодировки
ПрочитанныйANSI = Новый ТекстовыйДокумент;
ПрочитанныйANSI.Прочитать(ИмяФайлаANSI, КодировкаТекста.ANSI);
ПрочитанныйUTF8 = Новый ТекстовыйДокумент;
ПрочитанныйUTF8.Прочитать(ИмяФайлаUTF8, КодировкаТекста.UTF8);
// Определяем кодировку файла автоматически (упрощенный метод)
Функция ОпределитьКодировкуФайла(ИмяФайла)
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
ПервыеБайты = ДвоичныеДанные.ВМассив();
Если ПервыеБайты.Количество() >= 3 И
ПервыеБайты[0] = 239 И ПервыеБайты[1] = 187 И ПервыеБайты[2] = 191 Тогда
Возврат "UTF-8";
ИначеЕсли ПервыеБайты.Количество() >= 2 И
ПервыеБайты[0] = 255 И ПервыеБайты[1] = 254 Тогда
Возврат "UTF-16LE";
ИначеЕсли ПервыеБайты.Количество() >= 2 И
ПервыеБайты[0] = 254 И ПервыеБайты[1] = 255 Тогда
Возврат "UTF-16BE";
КонецЕсли;
Возврат "ANSI";
КонецФункции
Кодировка = ОпределитьКодировкуФайла(ИмяФайлаUTF8);
Сообщить("Определена кодировка: " + Кодировка);
Сообщить("Содержимое UTF-8 файла: " + ПрочитанныйUTF8.ПолучитьТекст());
КонецПроцедуры
Примечания
// Важные особенности работы с текстовым документом:
// 1. Нумерация строк начинается с 0 (ноль)
// 2. Метод ДобавитьСтроку() добавляет строку в конец документа
// 3. Метод ВставитьСтроку(Строка, Индекс) вставляет строку по указанной позиции
// 4. При удалении строки индексы последующих строк сдвигаются
// 5. Для работы с файлами используйте методы Прочитать() и Записать()
// 6. Доступные кодировки: ANSI, UTF8, UTF16, UTF16LE, UTF16BE
// 7. Метод НайтиТекст() возвращает массив индексов найденных строк
// 8. ЗаменитьТекст() производит замену во всем документе
// 9. Для построчной обработки больших файлов используйте цикл по индексам
// 10. Текстовый документ хранит весь текст в памяти - для очень больших файлов используйте построчное чтение
// 11. Символы перевода строки: Символы.ПС
// 12. При форматировании текста учитывайте, что разные операционные системы могут использовать разные разделители строк








