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

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

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

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

Задача получить содержимое файла в виде строки возникает в 1С постоянно: загрузка выписок банка, обмен с веб-сервисами, чтение JSON-настроек, отправка вложений по HTTP, импорт данных из CSV. Встроенный язык предлагает несколько инструментов, и выбор зависит от типа файла — текстовый он или двоичный — и от того, что вы планируете делать со строкой дальше.

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

Важный нюанс: клиент-серверная архитектура 1С накладывает ограничения. Файл, который лежит на компьютере пользователя, недоступен серверному коду напрямую — его нужно сначала передать на сервер через временное хранилище. Этот сценарий также рассмотрен отдельным разделом.

Чтение текстового файла в строку через ЧтениеТекста

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

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

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

Второй параметр конструктора — кодировка. Если её не указать, 1С попытается определить кодировку автоматически, что нередко приводит к «кракозябрам» при файлах в UTF-8 без BOM или в ANSI. Явно указывайте КодировкаТекста.UTF8, КодировкаТекста.ANSI или КодировкаТекста.UTF16 в зависимости от источника файла.

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

bsl
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
    // обработка строки
    СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
ЧтениеТекста.Закрыть();

Получение двоичного файла в виде строки Base64

Картинки, PDF, архивы и другие двоичные файлы нельзя корректно прочитать как текст — данные будут испорчены. Стандартный приём: прочитать файл как ДвоичныеДанные и закодировать в строку Base64. Такая строка безопасно передаётся через JSON, XML и HTTP.

bsl
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Данные\отчет.pdf");
СтрокаBase64 = Base64Строка(ДвоичныеДанные);

// Обратное преобразование:
ВосстановленныеДанные = Base64Значение(СтрокаBase64);
ВосстановленныеДанные.Записать("C:\Данные\копия.pdf");

Учтите, что Base64 увеличивает объём данных примерно на треть. Для файла в 30 МБ строка займёт около 40 МБ в памяти, а в управляемых формах это дополнительно гоняется между клиентом и сервером. Для больших файлов рассмотрите передачу двоичных данных напрямую через временное хранилище или потоки, минуя строковое представление.

Чтение файла на клиенте: временное хранилище

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

Порядок действий
  1. 1
    Вызовите НачатьПомещениеФайла с описанием оповещения о завершении
  2. 2
    В обработчике получите Адрес временного хранилища
  3. 3
    Передайте адрес в серверную процедуру
  4. 4
    На сервере вызовите ПолучитьИзВременногоХранилища(Адрес) — получите ДвоичныеДанные
  5. 5
    Запишите данные во временный файл или преобразуйте в строку Base64
  6. 6
    После обработки очистите хранилище через УдалитьИзВременногоХранилища
bsl
&НаСервере
Функция ФайлКакСтрокаНаСервере(АдресХранилища)
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
    Результат = ЧтениеТекста.Прочитать();
    ЧтениеТекста.Закрыть();
    УдалитьФайлы(ИмяВременногоФайла);
    Возврат Результат;
КонецФункции

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

Чтение JSON и XML сразу в структуру данных

Если файл содержит JSON, получать его просто строкой обычно не нужно — удобнее сразу распарсить через ЧтениеJSON. Тогда вместо строки вы получите готовую структуру или соответствие.

bsl
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\Данные\данные.json");
Данные = ПрочитатьJSON(ЧтениеJSON); // Структура или Соответствие
ЧтениеJSON.Закрыть();

Для XML аналогично работают ЧтениеXML и ЧтениеXML.ОткрытьФайл(). Эти объекты читают файл потоково, поэтому подходят и для крупных документов, где загрузка всей строки в память нерациональна.

Выбор способа под конкретную задачу

Сравнение вариантов

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

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

ЧтениеТекста.ПрочитатьСтроку() в цикле

Большие текстовые файлы и CSV, обработка порциями без загрузки всего в память.

ДвоичныеДанные + Base64Строка

Картинки, PDF, архивы — когда строка нужна для передачи по HTTP или в JSON. Увеличивает объём примерно на треть.

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

Структурированные файлы, когда строка не нужна, а нужны сразу данные.

ПолучитьИзВременногоХранилища

Файлы, выбранные пользователем на клиенте в управляемом приложении.

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

Кодировки и частые ошибки

Самая распространённая проблема — неверная кодировка. Признаки: вопросительные знаки, «кракозябры» вместо кириллицы, ошибки парсинга JSON. Файлы из Windows-программ чаще всего в ANSI (Windows-1251), из Linux и веб-сервисов — в UTF-8. Если не уверены, проверьте наличие BOM в начале файла или попробуйте обе кодировки и сравните результат.

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

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

Проверка результата

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

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

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

СтрДлина() возвращает значение больше нуля и соответствует ожидаемому размеру файла

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

Строка пустая при непустом файле — неверный путь или проблема с правами доступа

Кириллица в содержимом
Норма

Русские буквы отображаются корректно

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

Вопросительные знаки или кракозябры — неверная кодировка

Обратное преобразование Base64
Норма

Base64Значение() восстанавливает файл, который открывается без ошибок

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

Файл повреждён — возможно, строка была изменена при передаче (переносы строк, обрезка)

Блокировка файла
Норма

После Закрыть() файл доступен для записи и удаления

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

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

Для отладки удобно вывести первые 100–200 символов строки через Лев(СодержимоеСтрокой, 200) — этого достаточно, чтобы увидеть кодировку, формат и начало данных, не засоряя журнал.

Итог

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

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

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

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

Используйте ЧтениеТекста с явным путём к файлу — диалог не нужен. В тонком клиенте для доступа к файловой системе может потребоваться вызов НачатьПодключениеРасширенияРаботыСФайлами() и режим БезопасныйРежим может блокировать операцию на сервере.

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

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

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

Создайте Новый ДвоичныеДанные(ПутьКФайлу) и примените функцию Base64Строка(). Полученную строку вставьте в JSON-тело запроса. На приёмной стороне файл восстанавливается функцией Base64Значение().

Почему при чтении файла появляются кракозябры?

Кодировка файла не совпадает с указанной в конструкторе ЧтениеТекста. Попробуйте КодировкаТекста.UTF8 и КодировкаТекста.ANSI. Также проверьте, не является ли файл на самом деле двоичным — тогда читать его как текст нельзя вовсе.

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

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

Как безопасно прочитать файл, которого может не существовать?

Перед чтением проверьте существование: Файл = Новый Файл(Путь); Если Файл.Существует() Тогда .... Дополнительно оберните чтение в Попытка...Исключение, чтобы корректно обработать ошибки доступа и блокировок.