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

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

Как прочитать текстовый документ в 1С

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

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

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

Какие объекты 1С умеют читать текстовые файлы

В платформе 1С:Предприятие 8 есть три основных способа прочитать текстовый документ. Первый — объект ЧтениеТекста, современный потоковый инструмент с поддержкой кодировок, разделителей и чтения больших файлов без полной загрузки в память. Именно его рекомендуется использовать в новом коде.

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

Третий вариант — чтение через потоки (ЧтениеДанных, ФайловыйПоток), которое применяется для бинарных данных или нестандартной обработки, но для обычного текста избыточно. В таблице ниже сопоставлены основные варианты.

СпособКогда подходитОграничения
ЧтениеТекстаПострочный разбор, большие файлы, CSV, выгрузкиПоследовательный доступ, нет перехода к строке по номеру
ТекстовыйДокумент.Прочитать()Небольшие файлы, доступ к строкам по индексуВесь файл в памяти, слабый контроль кодировки
ЧтениеДанных + потокиБинарные данные, нестандартные форматыСложнее код, требуется ручная работа с буфером

Как прочитать файл построчно через ЧтениеТекста

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

Типовой фрагмент кода выглядит так:

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

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

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

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

// обработка строки

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

КонецЦикла;

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

Второй параметр метода Открыть() задаёт кодировку. Если её не указать, платформа попытается определить кодировку автоматически, что не всегда даёт корректный результат для файлов без BOM-метки. Явное указание КодировкаТекста.UTF8, ANSI или OEM — простой способ избежать «кракозябр».

Как прочитать файл целиком и по разделителю

Если структура файла не важна и нужен весь текст одной строкой, используйте метод Прочитать() без параметров. Он вернёт всё содержимое от текущей позиции до конца файла. Такой подход удобен для чтения JSON или XML из текстового файла с последующей передачей в соответствующий парсер.

Для файлов с нестандартной структурой есть метод ПрочитатьДоРазделителя() — он читает данные до указанного символа или строки-разделителя. Это полезно, когда записи в файле отделены не переводом строки, а, например, точкой с запятой или специальным маркером.

Чтение = Новый ЧтениеТекста("C:\Обмен\config.txt", КодировкаТекста.UTF8);

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

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

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

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

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

Для Номер = 1 По Док.КоличествоСтрок() Цикл

Строка = Док.ПолучитьСтроку(Номер);

КонецЦикла;

Как задать кодировку и не получить «кракозябры»

Кодировка — самая частая причина проблем при чтении текстовых файлов в 1С. Файлы, сформированные сторонними системами, могут быть в UTF-8 (с BOM или без), Windows-1251 (ANSI), DOS-866 (OEM) или UTF-16. Если кодировка указана неверно, кириллица превращается в нечитаемые символы.

Системное перечисление КодировкаТекста поддерживает значения UTF8, UTF16, ANSI, OEM и ряд других. Практическое правило: файлы из современных веб-систем чаще всего в UTF-8, выгрузки старых Windows-программ — в ANSI, а файлы из DOS-утилит — в OEM. Если кодировка неизвестна, сначала откройте файл в редакторе, который показывает кодировку, и зафиксируйте её в коде явно.

Маршрут решения

Как выбрать кодировку

Русский текст отображается как Русские буквы заменены на знаки вопроса или квадратикиФайл в ANSI (Windows-1251), укажите КодировкаТекста.ANSI
Кириллица читается как последовательность латинских букв с диакритикойФайл в UTF-8, прочитан как ANSI — укажите КодировкаТекста.UTF8
Текст выглядит как случайные символы псевдографикиВероятно OEM (DOS-866) — укажите КодировкаТекста.OEM
Кодировка неизвестна и файл без BOMПроверьте файл в редакторе с определением кодировки и зафиксируйте её в коде

Чтение файла на сервере и на клиенте: в чём разница

В клиент-серверном режиме 1С код с директивой &НаСервере выполняется на сервере, и путь к файлу интерпретируется относительно файловой системы сервера, а не компьютера пользователя. Файл, лежащий на диске C пользователя, серверный код не увидит. Это одна из самых частых ошибок при переносе обработок из файлового режима в клиент-серверный.

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

Порядок чтения файла от пользователя в клиент-серверном режиме
  1. 1
    На клиенте вызовите НачатьПомещениеФайлаНаСервер и дождитесь получения адреса временного хранилища
  2. 2
    Передайте адрес в серверную процедуру
  3. 3
    На сервере получите двоичные данные через ПолучитьИзВременногоХранилища
  4. 4
    Запишите данные во временный файл методом ПолучитьИмяВременногоФайла и Записать
  5. 5
    Откройте временный файл через ЧтениеТекста и обработайте
  6. 6
    Удалите временный файл и освободите хранилище

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

Обработка ошибок и проверка результата

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

Минимальный набор защиты — проверка существования файла перед открытием и обёртка чтения в Попытка/Исключение с гарантированным закрытием:

Файл = Новый Файл(ИмяФайла);

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

ВызватьИсключение "Файл не найден: " + ИмяФайла;

КонецЕсли;

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

Попытка

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

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

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

// обработка

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

КонецЦикла;

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

Исключение

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

ВызватьИсключение ОписаниеОшибки();

КонецПопытки;

Типичные ошибки
01
Не указана кодировка — кириллица превращается в нечитаемые символы при чтении файлов без BOM
02
Нет вызова Закрыть() — файл остаётся заблокированным, повторная обработка падает с ошибкой доступа
03
Серверный код ищет файл по клиентскому пути — файл не найден, хотя пользователь его видит
04
Чтение огромного файла через ТекстовыйДокумент — избыточное потребление памяти вместо потокового ЧтениеТекста
05
Пустые строки в конце файла обрабатываются как данные — лишние записи или ошибки преобразования типов

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

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

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

Содержимое прочитанных строк
Норма

Кириллица и спецсимволы отображаются корректно

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

Знаки вопроса, квадратики или латиница с диакритикой — неверная кодировка

Завершение цикла чтения
Норма

ПрочитатьСтроку() вернул Неопределено после последней строки

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

Цикл завершился исключением — файл повреждён или занят

Доступность файла после обработки
Норма

Файл можно переименовать или удалить

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

Ошибка доступа — файл не был закрыт

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

Чем ЧтениеТекста отличается от ТекстовыйДокумент?

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

Как прочитать CSV-файл в 1С?

Откройте файл через ЧтениеТекста, читайте построчно и разбивайте каждую строку функцией СтрРазделить() по символу-разделителю (обычно точка с запятой или запятая). Учтите, что значения могут содержать разделитель внутри кавычек — тогда простого разбиения недостаточно и нужен посимвольный разбор.

Почему метод ПрочитатьСтроку() возвращает пустые строки?

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

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

Если не указать кодировку в Открыть(), платформа попытается определить её по BOM-метке, а при её отсутствии использует системную кодировку по умолчанию. Надёжнее выяснить кодировку заранее — открыть файл в редакторе с автоопределением или уточнить формат у поставщика данных — и указать её явно.

Можно ли читать файл с клиента в веб-клиенте?

Да, но только через диалог выбора файла и помещение данных на сервер: прямой доступ к произвольным путям файловой системы в веб-клиенте запрещён. Используйте НачатьПомещениеФайлаНаСервер с последующей обработкой данных из временного хранилища в серверной процедуре.

Что делать, если файл занят другой программой?

Метод Открыть() вызовет исключение. Перехватите его через Попытка/Исключение, сообщите пользователю о блокировке и предложите повторить позже. Если файл формируется внешней системой, полезно дождаться признака завершения записи — например, появления отдельного файла-флага.

Итог

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

Основной инструмент чтения текстовых файлов в 1С — объект ЧтениеТекста: открывайте файл с явным указанием кодировки, читайте построчно до значения Неопределено и всегда закрывайте. В клиент-серверном режиме помещайте файл на сервер через временное хранилище, а ошибки доступа и отсутствия файла обрабатывайте через Попытка/Исключение.