Примеры работы с текстовым документом

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

Создание текстового документа и добавление строк

// Создание текстового документа, добавление строк и получение содержимого
Процедура СозданиеТекстовогоДокумента()

    // Создаем новый текстовый документ
    Текст = Новый ТекстовыйДокумент;
    
    // Добавляем строки
    Текст.ДобавитьСтроку("Первая строка");
    Текст.ДобавитьСтроку("Вторая строка");
    Текст.ДобавитьСтроку("Третья строка");
    
    // Добавляем строку в начало
    Текст.ВставитьСтроку("Строка в начале", 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. При форматировании текста учитывайте, что разные операционные системы могут использовать разные разделители строк

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