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

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

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

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

Задача прочитать содержимое файла целиком в одну строковую переменную возникает в 1С постоянно: загрузка XML- и JSON-ответов, обработка выгрузок из банков, чтение макетов, разбор CSV и логов. Во встроенном языке платформы для этого есть несколько инструментов, и выбор между ними влияет на скорость, корректность кодировки и объём потребляемой памяти.

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

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

Чтение файла через ЧтениеТекста — основной способ

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

Чтобы получить весь файл одной строкой, достаточно открыть файл и вызвать метод Прочитать() без параметров. После работы объект нужно закрыть, чтобы освободить файловый дескриптор.

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

СодержимоеСтрокой = ЧтениеТекста.Прочитать();

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

// Теперь вся строка доступна для обработки

ДлинаСтроки = СтрДлина(СодержимоеСтрокой);

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

bsl
ЧтениеТекста = Новый ЧтениеТекста("D:\Data\import.xml", КодировкаТекста.UTF8);
СодержимоеСтрокой = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();

Конструктор объекта принимает имя файла, кодировку, разделитель строк и ряд других параметров. Если кодировку не указать, платформа попытается определить её автоматически по маркеру BOM, а при его отсутствии использует системную кодировку по умолчанию — это частый источник ошибок.

Чтение через ТекстовыйДокумент

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

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

Текст.Прочитать("D:\Data\import.txt", КодировкаТекста.UTF8);

СодержимоеСтрокой = Текст.ПолучитьТекст();

Результат полностью аналогичен: в переменной оказывается весь файл одной строкой с сохранением переносов. Разница в деталях: ТекстовыйДокумент дополнительно предоставляет доступ к строкам по индексу (ПолучитьСтроку, КоличествоСтрок), что удобно, если после чтения нужно обращаться к отдельным строкам без дополнительного разбора.

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

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

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

Гибкая настройка кодировки и разделителей, чтение целиком или частями. Рекомендуется для нового кода.

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

Простой синтаксис, доступ к строкам по индексу. Всегда читает файл целиком, меньше настроек.

ЧтениеДанных

Для двоичных файлов и точного контроля над байтами. Требует ручного преобразования в строку.

Управление кодировкой: почему строка превращается в «кракозябры»

Самая частая проблема при чтении файла как строки — неверная кодировка. Файл сохранён в UTF-8, а читается как ANSI (windows-1251), и вместо кириллицы в строке появляются нечитаемые символы. Обратная ситуация встречается так же часто: старые выгрузки банков и обменные файлы нередко сохранены в windows-1251 или OEM-866.

Кодировка задаётся вторым параметром конструктора через системное перечисление КодировкаТекста: UTF8, ANSI, OEM, UTF16 и другие значения. Для файлов без BOM маркера платформа не может угадать кодировку надёжно, поэтому её лучше указывать явно, исходя из источника файла.

// Файл выгружен из старой DOS-программы

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

// Банковская выписка в ANSI

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

// Современный JSON или XML

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

Если кодировка файла заранее неизвестна, практичный приём — прочитать файл как UTF-8 и проверить результат на наличие символа замены или характерных «битых» последовательностей. При сомнениях стоит попробовать альтернативную кодировку и сравнить читаемость результата.

Типичные ошибки
01
Не указана кодировка — кириллица читается как нечитаемые символы, потому что платформа применила системную кодировку по умолчанию.
02
Объект чтения не закрыт — файл остаётся заблокированным, и следующая попытка записи или удаления завершается ошибкой.
03
Чтение несуществующего файла без проверки — код падает с исключением вместо понятного сообщения пользователю.
04
Вся строка помещается в реквизит с ограниченной длиной — содержимое молча обрезается при сохранении.

Большие файлы: память и построчное чтение

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

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

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

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

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

// обработка одной строки

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

КонецЦикла;

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

Ещё одно ограничение связано не с чтением, а с дальнейшим использованием строки. Реквизиты объектов и поля форм могут иметь ограничение длины строки. Если результат чтения нужно сохранить в базу, используйте реквизиты типа «Строка неограниченной длины» или хранилище значения, иначе данные будут обрезаны без предупреждения.

Проверка файла перед чтением и обработка ошибок

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

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

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

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

КонецЕсли;

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

Порядок действий
  1. 1
    Проверьте существование файла через объект Файл и метод Существует().
  2. 2
    Определите кодировку источника и укажите её явно в конструкторе ЧтениеТекста.
  3. 3
    Вызовите Прочитать() для получения всей строки или ПрочитатьСтроку() в цикле для больших файлов.
  4. 4
    Закройте объект чтения методом Закрыть(), включая ветку исключения.
  5. 5
    Проверьте результат: длину строки, отсутствие битых символов, корректность структуры данных.

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

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

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

Длина строки
Норма

СтрДлина возвращает значение, сопоставимое с размером файла

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

Строка пустая при ненулевом размере файла

Кириллица
Норма

Русский текст отображается читаемо

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

Нечитаемые символы — неверная кодировка

Структура
Норма

Строка начинается с ожидаемого содержимого (тег, скобка, заголовок)

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

Набор байтов — файл двоичный, нужен другой способ чтения

Двоичные файлы и объект ЧтениеДанных

Если файл не текстовый (архив, картинка, PDF) либо требуется точный контроль над байтами, текстовые объекты не подойдут. Для таких случаев платформа предоставляет ЧтениеДанных, который читает файл как поток байтов, и ДвоичныеДанные, получаемые напрямую из файла.

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

// Преобразование в строку Base64 при необходимости

СтрокаBase64 = Base64Строка(ДвоичныеДанные);

Если двоичный файл на самом деле содержит текст, но с нестандартной структурой, можно прочитать байты через ЧтениеДанных и преобразовать их в строку методами работы с буферами двоичных данных, явно указав кодировку. Это более сложный путь, и применять его стоит только когда обычное текстовое чтение не справляется.

Клиент-серверный режим и асинхронные методы

В файловом режиме путь к файлу одинаково доступен из любого кода. В клиент-серверном режиме код, выполняемый на сервере, видит только файловую систему сервера: путь вида C:\Users\... с клиентской машины там не существует. Это одна из самых частых причин «невидимых» ошибок при переносе обработки с файловой базы на серверную.

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

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

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

Как выбрать действие

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

Ответы на частые вопросы

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

Кодировку можно опустить — тогда платформа использует маркер BOM, а при его отсутствии системную кодировку. Для файлов UTF-8 с BOM это сработает, но для файлов без маркера результат непредсказуем. Надёжнее всегда указывать кодировку явно.

Почему Прочитать() вернул пустую строку, хотя файл не пустой?

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

Как удалить переносы строк из прочитанного текста?

Используйте функцию СтрЗаменить, заменяя символы перевода строки (Символы.ПС, Символы.ВК) на пустую строку или пробел, в зависимости от требуемого результата.

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

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

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

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

Как узнать кодировку файла программно?

Надёжного универсального способа нет: платформа определяет кодировку только по BOM-маркеру. На практике кодировку задают исходя из источника файла либо перебирают варианты (UTF-8, ANSI, OEM) и проверяют читаемость результата.

Итог

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

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