В процессе разработки на платформе 1С:Предприятие часто возникает задача обработки текстовых данных из внешних источников. Одной из наиболее типичных ситуаций является необходимость прочитать текстовый файл построчно, чтобы выполнить определенные действия в зависимости от содержимого каждой строки (например, первая строка содержит значение реквизита, а вторая — путь к файлу). Рассмотрим основные способы решения этой задачи, проанализируем особенности различных объектов и разберем конкретные примеры кода.
Объект ЧтениеТекста является наиболее производительным инструментом для работы с текстовыми файлами, так как он осуществляет последовательный доступ к данным. Это означает, что 1С не загружает весь файл в оперативную память целиком, а читает его порциями. Это критически важно при работе с файлами большого объема (сотни мегабайт или гигабайты).
Разберем, как реализовать логику получения первой и второй строк по отдельности, используя этот объект. Проанализируем пример кода:
ИмяФайла = "C:\Data\Import.txt";
ДокументДляЧтения = Новый ЧтениеТекста;
// Открываем файл, указывая путь и кодировку (по умолчанию используется UTF-8)
ДокументДляЧтения.Открыть(ИмяФайла, КодировкаТекста.UTF8);
// Читаем первую строку
Переменная1 = ДокументДляЧтения.ПрочитатьСтроку();
Если Переменная1 <> Неопределено Тогда
// Выполняем действия с первой строкой
Сообщить("Первая строка: " + Переменная1);
// После выполнения действий читаем вторую строку
Переменная2 = ДокументДляЧтения.ПрочитатьСтроку();
Если Переменная2 <> Неопределено Тогда
// Выполняем действия со второй строкой
Сообщить("Вторая строка: " + Переменная2);
КонецЕсли;
КонецЕсли;
// Обязательно закрываем файл, чтобы освободить дескриптор в ОС
ДокументДляЧтения.Закрыть();
В данном примере мы используем метод ПрочитатьСтроку(). Важно понимать: после каждого вызова этого метода внутренний указатель «курсор» 1С перемещается к началу следующей строки. Если метод вернул Неопределено, это означает, что файл закончился.
Если файл имеет небольшой размер (как в случае автора темы — около 3-4 Кб), мы можем воспользоваться объектом ТекстовыйДокумент. Его главное отличие в том, что он загружает всё содержимое файла в память. Это позволяет нам обращаться к любой строке напрямую по её индексу (номеру).
Рассмотрим по шагам, как это реализовать:
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("C:\Data\Import.txt");
// Проверяем, что в файле есть хотя бы две строки
Если Текст.КоличествоСтрок() >= 2 Тогда
// Получаем строки по номеру (нумерация начинается с 1)
Строка1 = Текст.ПолучитьСтроку(1);
// Выполняем манипуляции
Строка2 = Текст.ПолучитьСтроку(2);
// Выполняем другие манипуляции
КонецЕсли;
Этот способ удобен своей наглядностью, однако не рекомендуется для использования в высоконагруженных серверных процедурах или при работе с файлами неизвестного объема, так как это может привести к избыточному потреблению памяти сервером 1С.
Проанализируем еще один современный подход, который часто применяется в 1С 8.3. Мы можем прочитать весь текст в одну строковую переменную и разбить её в массив. Это особенно удобно, когда структура файла фиксирована.
Чтение = Новый ЧтениеТекста("C:\Data\Import.txt");
ВесьТекст = Чтение.Прочитать();
Чтение.Закрыть();
// Разбиваем текст в массив по символу переноса строки
МассивСтрок = СтрРазделить(ВесьТекст, Символы.ПС, Ложь);
Если МассивСтрок.Количество() >= 2 Тогда
ЗначениеРеквизита = МассивСтрок[0]; // Индексация массива начинается с 0
ПутьКФайлу = МассивСтрок[1];
// Далее работаем с полученными данными
КонецЕсли;
При работе с текстовыми файлами следует учитывать несколько критических факторов, которые могут повлиять на корректность работы программы:
Windows-1251 (ANSI) или UTF-8 без BOM. Если вы не укажете правильную кодировку в конструкторе Новый ЧтениеТекста, русские символы могут превратиться в нечитаемые знаки.ПрочитатьСтроку() по умолчанию распознает стандартные переводы строк (LF или CRLF). Однако в некоторых системах разделителем может выступать только символ возврата каретки (CR). В таких случаях в параметрах метода можно явно указать разделитель: ПрочитатьСтроку(Символы.ВК).ПрочитатьСтроку() сразу вернет Неопределено. Попытка обращения к методам пустой строки может вызвать ошибку времени выполнения.ЧтениеТекста открыт, файл может быть заблокирован для записи другими программами. Старайтесь всегда вызывать Закрыть() сразу после завершения чтения, чтобы не создавать конфликтов доступа.Выясним причину, по которой автор темы сомневался в использовании цикла. В стандартных примерах из интернета часто приводится цикл Пока Строка <> Неопределено. Однако для задачи, где каждая строка имеет разный смысл (разную бизнес-логику), цикл не обязателен. Достаточно последовательно вызвать ПрочитатьСтроку() нужное количество раз и сохранить результаты в разные переменные, как мы рассмотрели в первом методе.
Подводя итог, для небольших служебных файлов объемом в несколько килобайт наиболее надежным и быстрым в разработке методом будет использование объекта ТекстовыйДокумент или функции СтрРазделить. Для обработки тяжелых логов или реестров данных единственно правильным выбором остается последовательное чтение через ЧтениеТекста.