Разработка и Конфигурация · 11 мин
Как прочитать текст из файла в 1С
Как прочитать текст из файла в 1С: объект ЧтениеТекста, методы ПрочитатьСтроку и Прочитать, работа с кодировками, большие файлы и типовые ошибки.
Чтение текстового файла — одна из базовых задач при обмене данными в 1С: загрузка выписок банка, импорт прайсов, разбор логов и обработка CSV-файлов. Платформа 1С:Предприятие предоставляет несколько встроенных механизмов для этого, и основной из них — объект ЧтениеТекста (в англоязычном синтаксисе TextReader).
Выбор способа зависит от размера файла, его кодировки и того, нужно ли обрабатывать текст построчно или целиком. Для небольших файлов удобно считать всё содержимое одной строкой кода, для больших — читать построчно в цикле, чтобы не перегружать память сервера. Ниже разобраны все рабочие варианты с примерами кода.
Все примеры приведены на встроенном языке 1С и подходят как для толстого клиента, так и для серверного и тонкого клиента (с учётом ограничений на доступ к файловой системе, о которых сказано отдельно).
Объект ЧтениеТекста: базовый принцип работы
Объект ЧтениеТекста предназначен для последовательного чтения текстовых файлов. Он создаётся конструктором Новый ЧтениеТекста либо сразу с указанием имени файла, либо без параметров — тогда файл открывается отдельным методом Открыть.
Типовой шаблон выглядит так: создать объект, открыть файл с нужной кодировкой, прочитать данные, закрыть файл. Пропуск закрытия — распространённая ошибка: файл остаётся занятым процессом, и другие механизмы (например, удаление или перезапись) могут завершиться ошибкой.
Чтение = Новый ЧтениеТекста;
Чтение.Открыть("C:\Данные\import.txt", КодировкаТекста.UTF8);
Текст = Чтение.Прочитать();
Чтение.Закрыть();
Конструктор с параметром объединяет создание и открытие: Новый ЧтениеТекста("C:\Данные\import.txt", КодировкаТекста.UTF8). Это короче, но менее гибко, если параметры открытия нужно вычислять.
Чтение файла целиком и построчно
Метод Прочитать() возвращает всё содержимое файла одной строкой, включая символы переноса. Это удобно для небольших файлов: настроек, шаблонов, коротких CSV. Если нужна только часть текста, методу можно передать количество символов.
Метод ПрочитатьСтроку() возвращает очередную строку без символов перевода строки. Когда файл закончился, метод возвращает Неопределено — это признак выхода из цикла.
Чтение = Новый ЧтениеТекста("C:\Данные\import.csv", КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
// разбор строки, например по разделителю
Поля = СтрРазделить(Строка, ";");
// ... обработка полей
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Построчный вариант — стандарт для загрузки CSV и выписок: каждую итерацию можно обработать, записать в базу и освободить. При обработке больших файлов имеет смысл периодически фиксировать транзакцию, чтобы не накапливать гигантскую транзакцию на всю загрузку.
- 1Создайте объект: Новый ЧтениеТекста с именем файла и кодировкой
- 2Прочитайте первую строку методом ПрочитатьСтроку
- 3Организуйте цикл Пока Строка <> Неопределено
- 4Внутри цикла обработайте строку и прочитайте следующую
- 5После цикла вызовите Закрыть
- 6Проверьте, что обработано ожидаемое количество строк
Указание кодировки файла
Кодировка — самый частый источник проблем. Если открыть файл в неправильной кодировке, кириллица превратится в «кракозябры», а разбор данных сломается. Кодировка задаётся вторым параметром конструктора или метода Открыть через системное перечисление КодировкаТекста.
КодировкаТекста.UTF8— стандарт для современных выгрузок, файлов из Linux и веб-сервисов;КодировкаТекста.ANSI— соответствует Windows-1251, типична для старых выгрузок из Windows-программ;КодировкаТекста.UTF16— файлы, сохранённые как «Unicode» в Блокноте;КодировкаТекста.OEM— DOS-кодировка (CP866), встречается в старых обменах;КодировкаТекста.Системная— кодировка операционной системы по умолчанию.
Если кодировка файла заранее неизвестна, её можно определить внешними средствами (например, открыть файл в Notepad++ и посмотреть в строке состояния) либо перебрать типовые варианты и проверить читаемость кириллицы. Некоторые файлы UTF-8 содержат метку BOM — ЧтениеТекста корректно обрабатывает её автоматически.
Проверка существования файла и обработка ошибок
Перед открытием стоит убедиться, что файл существует и доступен. Для этого используется объект Файл и его метод Существует(). Без проверки попытка открыть несуществующий файл вызовет исключение.
ФайлНаДиске = Новый Файл(ИмяФайла);
Если Не ФайлНаДиске.Существует() Тогда
Сообщить("Файл не найден: " + ИмяФайла);
Возврат;
КонецЕсли;
Дополнительно полезно обернуть чтение в конструкцию Попытка ... Исключение ... КонецПопытки. В блоке исключения файл нужно закрыть (если он был открыт), а пользователю — выдать понятное сообщение с текстом ошибки из ОписаниеОшибки(). Это защищает от ситуаций «файл занят другой программой» или «нет прав на чтение».
Чтение файла на клиенте и на сервере
В клиент-серверном режиме важно понимать, где физически находится файл. Код, выполняемый на сервере (директива &НаСервере), видит только файловую систему сервера — файл с диска пользователя ему недоступен. Поэтому типовая схема в управляемых формах такая: пользователь выбирает файл через диалог, файл помещается во временное хранилище, а на сервере извлекается и читается.
Для передачи файла с клиента на сервер используются методы НачатьПомещениеФайла (асинхронный вариант) или помещение через Новый ДвоичныеДанные(ИмяФайла) и ПоместитьВоВременноеХранилище. На сервере двоичные данные записывают во временный файл методом ПолучитьИмяВременногоФайла("txt") и уже его открывают через ЧтениеТекста.
// На сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Чтение = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
// ... чтение и обработка
Чтение.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
В тонком и веб-клиенте прямой доступ к файловой системе ограничен: работа с файлами выполняется через асинхронные методы (НачатьПомещениеФайла, НачатьПолучениеФайлов) и требует расширения работы с файлами в браузере. Синхронные вызовы вроде Файл.Существует() на клиенте могут быть недоступны — учитывайте это при разработке.
Альтернативные способы чтения текста
Помимо ЧтениеТекста, в платформе есть ещё несколько инструментов, которые подходят для отдельных сценариев.
ТекстовыйДокументс методомПрочитать(ИмяФайла, КодировкаТекста.UTF8)— загружает файл целиком и позволяет обращаться к строкам по номеру черезПолучитьСтроку(Номер)и узнать их количество черезКоличествоСтрок(). Удобен, когда нужен произвольный доступ к строкам.ЧтениеДанных— низкоуровневый объект для двоичного чтения; подходит, когда нужен контроль на уровне байтов, но для обычного текста избыточен.ЧтениеXMLиЧтениеJSON— правильный выбор, если файл имеет структурированный формат: разбирать XML или JSON текстовыми методами не нужно.- Для табличных файлов формата Excel (xlsx) текстовое чтение не подходит — используется
ТабличныйДокумент.Прочитать()или COM/внешние компоненты.
Сравнение способов чтения
Универсальный потоковый вариант: построчно или целиком, экономен по памяти. Нет произвольного доступа к строкам.
Файл целиком в памяти, доступ к любой строке по номеру. Не подходит для очень больших файлов.
Для структурированных форматов. Не применимы к произвольному тексту.
Частые ошибки и как их избежать
Первая группа ошибок связана с путями. Путь, заданный относительно, интерпретируется от рабочего каталога процесса, что на сервере непредсказуемо — всегда используйте полные пути. Обратные слеши в строках 1С экранировать не нужно, но путь лучше получать из параметров обработки, а не зашивать в код.
Вторая группа — разделители и пустые строки. В CSV-файлах последняя строка часто пустая, а поля могут содержать разделитель внутри кавычек. Простой СтрРазделить(Строка, ";") в таких случаях даёт неверный результат — для сложных CSV нужен разбор с учётом кавычек или готовые механизмы обмена.
Третья группа — производительность. Чтение файла по одному символу или конкатенация огромных строк в цикле (Текст = Текст + Строка) работает очень медленно. Для склейки большого количества строк используйте массив и СтрСоединить, а для разбора — читайте построчно.
Как проверить результат чтения
Текст читаем, кириллица отображается корректно
Кракозябры — неверная кодировка
Совпадает с количеством строк в файле
Меньше — файл оборвался или неверный цикл
Закрыт, доступен для удаления и переименования
Занят процессом — не вызван метод Закрыть
Частые вопросы
Как прочитать файл, если неизвестна его кодировка?
Откройте файл в редакторе, который показывает кодировку (например, Notepad++ отображает её в строке состояния). Программно можно последовательно пробовать UTF8 и ANSI и проверять читаемость кириллических фрагментов. Файлы UTF-8 с BOM платформа распознаёт автоматически.
Чем отличается Прочитать от ПрочитатьСтроку?
Прочитать без параметров возвращает весь оставшийся текст файла одной строкой, включая символы переноса. ПрочитатьСтроку возвращает одну строку без символов переноса, а по достижении конца файла — Неопределено, что используется как условие выхода из цикла.
Как прочитать файл, выбранный пользователем, в управляемой форме?
На клиенте вызовите диалог выбора файла и поместите файл во временное хранилище (НачатьПомещениеФайла). Передайте адрес хранилища в серверную процедуру, там получите двоичные данные, запишите их во временный файл и прочитайте через ЧтениеТекста. После обработки удалите временный файл.
Можно ли читать файл, не загружая его целиком в память?
Да, именно для этого предназначено построчное чтение через ПрочитатьСтроку: в памяти одновременно находится только текущая строка. Это стандартный подход для файлов размером в сотни мегабайт.
Почему после чтения файл нельзя удалить или перезаписать?
Файл остаётся открытым, потому что не вызван метод Закрыть объекта ЧтениеТекста. Добавьте Закрыть после окончания чтения, а при использовании Попытка/Исключение — также в ветке обработки ошибки.
Как прочитать CSV, где поля содержат точку с запятой внутри текста?
Простое разделение через СтрРазделить даст ошибку. Нужно разбирать строку посимвольно с учётом кавычек: текст внутри кавычек не разделяется, а удвоенные кавычки означают один символ кавычки. Либо используйте готовые библиотеки разбора CSV.
Что важно запомнить
Основной инструмент — объект ЧтениеТекста: открыть с правильной кодировкой, читать построчно или целиком, обязательно закрыть. Проверяйте существование файла, используйте полные пути, а в клиент-серверном режиме передавайте файл на сервер через временное хранилище.