К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как прочитать текст из файла в 1С

Как прочитать текст из файла в 1С: объект ЧтениеТекста, методы ПрочитатьСтроку и Прочитать, работа с кодировками, большие файлы и типовые ошибки.

Чтение текстового файла — одна из базовых задач при обмене данными в 1С: загрузка выписок банка, импорт прайсов, разбор логов и обработка CSV-файлов. Платформа 1С:Предприятие предоставляет несколько встроенных механизмов для этого, и основной из них — объект ЧтениеТекста (в англоязычном синтаксисе TextReader).

Выбор способа зависит от размера файла, его кодировки и того, нужно ли обрабатывать текст построчно или целиком. Для небольших файлов удобно считать всё содержимое одной строкой кода, для больших — читать построчно в цикле, чтобы не перегружать память сервера. Ниже разобраны все рабочие варианты с примерами кода.

Все примеры приведены на встроенном языке 1С и подходят как для толстого клиента, так и для серверного и тонкого клиента (с учётом ограничений на доступ к файловой системе, о которых сказано отдельно).

Объект ЧтениеТекста: базовый принцип работы

Объект ЧтениеТекста предназначен для последовательного чтения текстовых файлов. Он создаётся конструктором Новый ЧтениеТекста либо сразу с указанием имени файла, либо без параметров — тогда файл открывается отдельным методом Открыть.

Типовой шаблон выглядит так: создать объект, открыть файл с нужной кодировкой, прочитать данные, закрыть файл. Пропуск закрытия — распространённая ошибка: файл остаётся занятым процессом, и другие механизмы (например, удаление или перезапись) могут завершиться ошибкой.

Чтение = Новый ЧтениеТекста;

Чтение.Открыть("C:\Данные\import.txt", КодировкаТекста.UTF8);

Текст = Чтение.Прочитать();

Чтение.Закрыть();

Конструктор с параметром объединяет создание и открытие: Новый ЧтениеТекста("C:\Данные\import.txt", КодировкаТекста.UTF8). Это короче, но менее гибко, если параметры открытия нужно вычислять.

Чтение файла целиком и построчно

Метод Прочитать() возвращает всё содержимое файла одной строкой, включая символы переноса. Это удобно для небольших файлов: настроек, шаблонов, коротких CSV. Если нужна только часть текста, методу можно передать количество символов.

Метод ПрочитатьСтроку() возвращает очередную строку без символов перевода строки. Когда файл закончился, метод возвращает Неопределено — это признак выхода из цикла.

Чтение = Новый ЧтениеТекста("C:\Данные\import.csv", КодировкаТекста.UTF8);

Строка = Чтение.ПрочитатьСтроку();

Пока Строка <> Неопределено Цикл

// разбор строки, например по разделителю

Поля = СтрРазделить(Строка, ";");

// ... обработка полей

Строка = Чтение.ПрочитатьСтроку();

КонецЦикла;

Чтение.Закрыть();

Построчный вариант — стандарт для загрузки CSV и выписок: каждую итерацию можно обработать, записать в базу и освободить. При обработке больших файлов имеет смысл периодически фиксировать транзакцию, чтобы не накапливать гигантскую транзакцию на всю загрузку.

Порядок чтения файла построчно
  1. 1
    Создайте объект: Новый ЧтениеТекста с именем файла и кодировкой
  2. 2
    Прочитайте первую строку методом ПрочитатьСтроку
  3. 3
    Организуйте цикл Пока Строка <> Неопределено
  4. 4
    Внутри цикла обработайте строку и прочитайте следующую
  5. 5
    После цикла вызовите Закрыть
  6. 6
    Проверьте, что обработано ожидаемое количество строк

Указание кодировки файла

Кодировка — самый частый источник проблем. Если открыть файл в неправильной кодировке, кириллица превратится в «кракозябры», а разбор данных сломается. Кодировка задаётся вторым параметром конструктора или метода Открыть через системное перечисление КодировкаТекста.

  • КодировкаТекста.UTF8 — стандарт для современных выгрузок, файлов из Linux и веб-сервисов;
  • КодировкаТекста.ANSI — соответствует Windows-1251, типична для старых выгрузок из Windows-программ;
  • КодировкаТекста.UTF16 — файлы, сохранённые как «Unicode» в Блокноте;
  • КодировкаТекста.OEM — DOS-кодировка (CP866), встречается в старых обменах;
  • КодировкаТекста.Системная — кодировка операционной системы по умолчанию.

Если кодировка файла заранее неизвестна, её можно определить внешними средствами (например, открыть файл в Notepad++ и посмотреть в строке состояния) либо перебрать типовые варианты и проверить читаемость кириллицы. Некоторые файлы UTF-8 содержат метку BOM — ЧтениеТекста корректно обрабатывает её автоматически.

Типичные ошибки с кодировкой
01
Открытие файла без указания кодировки — берётся системная, и на другом компьютере результат может отличаться
02
Чтение UTF-8 как ANSI — кириллица превращается в нечитаемые символы, поиск подстрок перестаёт работать
03
Игнорирование первой строки-заголовка в CSV — шапка колонок попадает в данные

Проверка существования файла и обработка ошибок

Перед открытием стоит убедиться, что файл существует и доступен. Для этого используется объект Файл и его метод Существует(). Без проверки попытка открыть несуществующий файл вызовет исключение.

ФайлНаДиске = Новый Файл(ИмяФайла);

Если Не ФайлНаДиске.Существует() Тогда

Сообщить("Файл не найден: " + ИмяФайла);

Возврат;

КонецЕсли;

Дополнительно полезно обернуть чтение в конструкцию Попытка ... Исключение ... КонецПопытки. В блоке исключения файл нужно закрыть (если он был открыт), а пользователю — выдать понятное сообщение с текстом ошибки из ОписаниеОшибки(). Это защищает от ситуаций «файл занят другой программой» или «нет прав на чтение».

Чтение файла на клиенте и на сервере

В клиент-серверном режиме важно понимать, где физически находится файл. Код, выполняемый на сервере (директива &НаСервере), видит только файловую систему сервера — файл с диска пользователя ему недоступен. Поэтому типовая схема в управляемых формах такая: пользователь выбирает файл через диалог, файл помещается во временное хранилище, а на сервере извлекается и читается.

Для передачи файла с клиента на сервер используются методы НачатьПомещениеФайла (асинхронный вариант) или помещение через Новый ДвоичныеДанные(ИмяФайла) и ПоместитьВоВременноеХранилище. На сервере двоичные данные записывают во временный файл методом ПолучитьИмяВременногоФайла("txt") и уже его открывают через ЧтениеТекста.

// На сервере

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);

ДвоичныеДанные.Записать(ИмяВременногоФайла);

Чтение = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);

// ... чтение и обработка

Чтение.Закрыть();

УдалитьФайлы(ИмяВременногоФайла);

В тонком и веб-клиенте прямой доступ к файловой системе ограничен: работа с файлами выполняется через асинхронные методы (НачатьПомещениеФайла, НачатьПолучениеФайлов) и требует расширения работы с файлами в браузере. Синхронные вызовы вроде Файл.Существует() на клиенте могут быть недоступны — учитывайте это при разработке.

Альтернативные способы чтения текста

Помимо ЧтениеТекста, в платформе есть ещё несколько инструментов, которые подходят для отдельных сценариев.

  • ТекстовыйДокумент с методом Прочитать(ИмяФайла, КодировкаТекста.UTF8) — загружает файл целиком и позволяет обращаться к строкам по номеру через ПолучитьСтроку(Номер) и узнать их количество через КоличествоСтрок(). Удобен, когда нужен произвольный доступ к строкам.
  • ЧтениеДанных — низкоуровневый объект для двоичного чтения; подходит, когда нужен контроль на уровне байтов, но для обычного текста избыточен.
  • ЧтениеXML и ЧтениеJSON — правильный выбор, если файл имеет структурированный формат: разбирать XML или JSON текстовыми методами не нужно.
  • Для табличных файлов формата Excel (xlsx) текстовое чтение не подходит — используется ТабличныйДокумент.Прочитать() или COM/внешние компоненты.

Сравнение способов чтения

ЧтениеТекста

Универсальный потоковый вариант: построчно или целиком, экономен по памяти. Нет произвольного доступа к строкам.

ТекстовыйДокумент

Файл целиком в памяти, доступ к любой строке по номеру. Не подходит для очень больших файлов.

ЧтениеXML / ЧтениеJSON

Для структурированных форматов. Не применимы к произвольному тексту.

Частые ошибки и как их избежать

Первая группа ошибок связана с путями. Путь, заданный относительно, интерпретируется от рабочего каталога процесса, что на сервере непредсказуемо — всегда используйте полные пути. Обратные слеши в строках 1С экранировать не нужно, но путь лучше получать из параметров обработки, а не зашивать в код.

Вторая группа — разделители и пустые строки. В CSV-файлах последняя строка часто пустая, а поля могут содержать разделитель внутри кавычек. Простой СтрРазделить(Строка, ";") в таких случаях даёт неверный результат — для сложных CSV нужен разбор с учётом кавычек или готовые механизмы обмена.

Третья группа — производительность. Чтение файла по одному символу или конкатенация огромных строк в цикле (Текст = Текст + Строка) работает очень медленно. Для склейки большого количества строк используйте массив и СтрСоединить, а для разбора — читайте построчно.

Контрольные точки

Как проверить результат чтения

Содержимое первой строки
Норма

Текст читаем, кириллица отображается корректно

Тревожный признак

Кракозябры — неверная кодировка

Количество прочитанных строк
Норма

Совпадает с количеством строк в файле

Тревожный признак

Меньше — файл оборвался или неверный цикл

Файл после обработки
Норма

Закрыт, доступен для удаления и переименования

Тревожный признак

Занят процессом — не вызван метод Закрыть

Частые вопросы

Как прочитать файл, если неизвестна его кодировка?

Откройте файл в редакторе, который показывает кодировку (например, Notepad++ отображает её в строке состояния). Программно можно последовательно пробовать UTF8 и ANSI и проверять читаемость кириллических фрагментов. Файлы UTF-8 с BOM платформа распознаёт автоматически.

Чем отличается Прочитать от ПрочитатьСтроку?

Прочитать без параметров возвращает весь оставшийся текст файла одной строкой, включая символы переноса. ПрочитатьСтроку возвращает одну строку без символов переноса, а по достижении конца файла — Неопределено, что используется как условие выхода из цикла.

Как прочитать файл, выбранный пользователем, в управляемой форме?

На клиенте вызовите диалог выбора файла и поместите файл во временное хранилище (НачатьПомещениеФайла). Передайте адрес хранилища в серверную процедуру, там получите двоичные данные, запишите их во временный файл и прочитайте через ЧтениеТекста. После обработки удалите временный файл.

Можно ли читать файл, не загружая его целиком в память?

Да, именно для этого предназначено построчное чтение через ПрочитатьСтроку: в памяти одновременно находится только текущая строка. Это стандартный подход для файлов размером в сотни мегабайт.

Почему после чтения файл нельзя удалить или перезаписать?

Файл остаётся открытым, потому что не вызван метод Закрыть объекта ЧтениеТекста. Добавьте Закрыть после окончания чтения, а при использовании Попытка/Исключение — также в ветке обработки ошибки.

Как прочитать CSV, где поля содержат точку с запятой внутри текста?

Простое разделение через СтрРазделить даст ошибку. Нужно разбирать строку посимвольно с учётом кавычек: текст внутри кавычек не разделяется, а удвоенные кавычки означают один символ кавычки. Либо используйте готовые библиотеки разбора CSV.

Итог

Что важно запомнить

Основной инструмент — объект ЧтениеТекста: открыть с правильной кодировкой, читать построчно или целиком, обязательно закрыть. Проверяйте существование файла, используйте полные пути, а в клиент-серверном режиме передавайте файл на сервер через временное хранилище.