Работа с текстовыми файлами — это базовая задача, с которой сталкивается каждый разработчик 1С. Часто возникает необходимость очистить файл от «мусора» в виде пустых строк, которые могут появляться до начала основного текста, между абзацами или в конце документа. Давайте разберем, как реализовать эту задачу максимально эффективно и избежать типичных ошибок при работе с циклами.
Когда мы перебираем строки в коллекции (например, в объекте ТекстовыйДокумент) и удаляем их по порядку (с первой до последней), мы сталкиваемся с изменением структуры данных. После удаления строки с индексом 1, бывшая вторая строка становится первой. Если цикл продолжает движение по индексам, он пропустит часть данных, а при достижении конца файла неизбежно возникнет ошибка выхода за границы массива. Проанализируем эту ситуацию: каждый раз, когда мы удаляем элемент, общее количество строк в объекте уменьшается, а счетчик цикла продолжает считать старые значения.
Наиболее надежный способ удаления элементов из коллекции при итерации — это движение от последнего элемента к первому. В этом случае удаление строки не меняет индексы тех элементов, которые мы еще не успели обработать. Рассмотрим, как это реализовать на практике с помощью объекта ТекстовыйДокумент.
Для корректной проверки на пустоту мы будем использовать встроенную функцию ПустаяСтрока(). Она предпочтительнее простого сравнения Строка == "", так как она учитывает не только строки нулевой длины, но и строки, состоящие из пробелов или символов табуляции.
Разберем готовое решение:
Н = ФайлТХТ.КоличествоСтрок(); // Получаем общее количество строк
Пока Н > 0 Цикл
// Проверяем строку на пустоту, используя функцию ПустаяСтрока
Если ПустаяСтрока(ФайлТХТ.ПолучитьСтроку(Н)) Тогда
// Удаляем строку, если она пустая
ФайлТХТ.УдалитьСтроку(Н);
КонецЕсли;
// Двигаемся к предыдущей строке
Н = Н - 1;
КонецЦикла;
// После цикла сохраняем изменения в файл
ФайлТХТ.Записать(ПутьКФайлу);
Н никак не влияет на нумерацию строк с 1 по Н-1. Это исключает ошибки «Индекс находится вне границ массива».ПустаяСтрока() позволяет очистить файл от «визуально пустых» строк, которые содержат невидимые спецсимволы, что невозможно сделать обычным сравнением.ТекстовыйДокумент, производим все манипуляции в оперативной памяти и один раз записываем результат на диск. Это гораздо быстрее, чем постоянно открывать и закрывать файл в цикле.Если объем вашего файла превышает 500-1000 строк или достигает сотен тысяч, объект ТекстовыйДокумент может стать узким местом, так как он целиком загружает файл в оперативную память. В таких случаях рекомендуем использовать потоковые объекты ЧтениеТекста и ЗаписьТекста.
Работа с потоками позволяет обрабатывать файл построчно: мы открываем исходный файл для чтения и создаем новый файл для записи. Мы считываем строку за строкой, проверяем каждую на пустоту, и, если строка содержит данные, сразу записываем ее во второй файл. Такой метод потребляет минимальное количество оперативной памяти, так как в ней находится только одна обрабатываемая строка в конкретный момент времени. Это решение идеально подходит для обработки больших объемов данных в режиме реального времени.
Для небольших задач, описанных в вашем запросе (около 500 строк), предложенный метод обхода снизу вверх является оптимальным по соотношению сложности написания кода и скорости выполнения. Помните: всегда проверяйте данные на невидимые символы с помощью специализированных функций платформы 1С. Это сэкономит вам массу времени при отладке и избавит от проблем с некорректным отображением данных в дальнейшем.