Разработка и Конфигурация · 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. Если кодировка неизвестна, сначала откройте файл в редакторе, который показывает кодировку, и зафиксируйте её в коде явно.
Как выбрать кодировку
Чтение файла на сервере и на клиенте: в чём разница
В клиент-серверном режиме 1С код с директивой &НаСервере выполняется на сервере, и путь к файлу интерпретируется относительно файловой системы сервера, а не компьютера пользователя. Файл, лежащий на диске C пользователя, серверный код не увидит. Это одна из самых частых ошибок при переносе обработок из файлового режима в клиент-серверный.
Для загрузки файла с клиента на сервер используется механизм помещения во временное хранилище: методы НачатьПомещениеФайлаНаСервер (асинхронный) или ПоместитьФайл (устаревший модальный). После помещения данные доступны на сервере по адресу хранилища, откуда их можно извлечь через ПолучитьИзВременногоХранилища, записать во временный файл и прочитать ЧтениеТекста.
- 1На клиенте вызовите НачатьПомещениеФайлаНаСервер и дождитесь получения адреса временного хранилища
- 2Передайте адрес в серверную процедуру
- 3На сервере получите двоичные данные через ПолучитьИзВременногоХранилища
- 4Запишите данные во временный файл методом ПолучитьИмяВременногоФайла и Записать
- 5Откройте временный файл через ЧтениеТекста и обработайте
- 6Удалите временный файл и освободите хранилище
В тонком и веб-клиенте прямой доступ к файловой системе ограничен требованиями безопасности. Для работы с файлами на клиенте может потребоваться расширение работы с файлами, а в веб-клиенте — явное действие пользователя по выбору файла.
Обработка ошибок и проверка результата
Чтение файла — операция, которая регулярно завершается ошибками: файл отсутствует, занят другим процессом, нет прав доступа, путь некорректен. Прятать такие ситуации нельзя: пользователь должен получить понятное сообщение, а не падение обработки.
Минимальный набор защиты — проверка существования файла перед открытием и обёртка чтения в Попытка/Исключение с гарантированным закрытием:
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда
ВызватьИсключение "Файл не найден: " + ИмяФайла;
КонецЕсли;
Чтение = Новый ЧтениеТекста;
Попытка
Чтение.Открыть(ИмяФайла, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
// обработка
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
Признак корректного завершения чтения — метод ПрочитатьСтроку() вернул Неопределено, а количество обработанных строк соответствует ожиданиям. Если файл загружается из внешней системы, полезно сверить контрольные итоги: количество записей, суммы, хеш файла, если он передаётся отправителем.
Как проверить результат
Кириллица и спецсимволы отображаются корректно
Знаки вопроса, квадратики или латиница с диакритикой — неверная кодировка
ПрочитатьСтроку() вернул Неопределено после последней строки
Цикл завершился исключением — файл повреждён или занят
Файл можно переименовать или удалить
Ошибка доступа — файл не был закрыт
Частые вопросы
Чем ЧтениеТекста отличается от ТекстовыйДокумент?
ЧтениеТекста — потоковый объект: он читает файл последовательно и не загружает его целиком в память, что важно для больших файлов. ТекстовыйДокумент загружает всё содержимое сразу и даёт доступ к любой строке по номеру, что удобно для небольших файлов, но расточительно по памяти для больших.
Как прочитать CSV-файл в 1С?
Откройте файл через ЧтениеТекста, читайте построчно и разбивайте каждую строку функцией СтрРазделить() по символу-разделителю (обычно точка с запятой или запятая). Учтите, что значения могут содержать разделитель внутри кавычек — тогда простого разбиения недостаточно и нужен посимвольный разбор.
Почему метод ПрочитатьСтроку() возвращает пустые строки?
Пустая строка — это не конец файла, а реальная пустая строка в данных. Конец файла обозначается только значением Неопределено. Поэтому условие выхода из цикла должно проверять именно Неопределено, а пустые строки при необходимости пропускаются отдельной проверкой.
Как прочитать файл, если неизвестна его кодировка?
Если не указать кодировку в Открыть(), платформа попытается определить её по BOM-метке, а при её отсутствии использует системную кодировку по умолчанию. Надёжнее выяснить кодировку заранее — открыть файл в редакторе с автоопределением или уточнить формат у поставщика данных — и указать её явно.
Можно ли читать файл с клиента в веб-клиенте?
Да, но только через диалог выбора файла и помещение данных на сервер: прямой доступ к произвольным путям файловой системы в веб-клиенте запрещён. Используйте НачатьПомещениеФайлаНаСервер с последующей обработкой данных из временного хранилища в серверной процедуре.
Что делать, если файл занят другой программой?
Метод Открыть() вызовет исключение. Перехватите его через Попытка/Исключение, сообщите пользователю о блокировке и предложите повторить позже. Если файл формируется внешней системой, полезно дождаться признака завершения записи — например, появления отдельного файла-флага.
Что важно запомнить
Основной инструмент чтения текстовых файлов в 1С — объект ЧтениеТекста: открывайте файл с явным указанием кодировки, читайте построчно до значения Неопределено и всегда закрывайте. В клиент-серверном режиме помещайте файл на сервер через временное хранилище, а ошибки доступа и отсутствия файла обрабатывайте через Попытка/Исключение.