Разработка и Конфигурация · 10 мин
Как в 1С получить файл как строку
Как в 1С прочитать файл в строку: ЧтениеТекста, чтение JSON и XML, двоичные данные и Base64, кодировки, большие файлы и типичные ошибки.
Задача получить содержимое файла в виде строки возникает в 1С постоянно: загрузка выписок банка, обмен с веб-сервисами, чтение JSON-настроек, отправка вложений по HTTP, импорт данных из CSV. Встроенный язык предлагает несколько инструментов, и выбор зависит от типа файла — текстовый он или двоичный — и от того, что вы планируете делать со строкой дальше.
Для текстовых файлов основной инструмент — объект ЧтениеТекста с методом Прочитать(), который возвращает всё содержимое одной строкой. Для двоичных файлов (картинки, PDF, архивы) строку получают через ДвоичныеДанные и кодирование в Base64. Оба подхода подробно разобраны ниже с готовыми примерами кода.
Важный нюанс: клиент-серверная архитектура 1С накладывает ограничения. Файл, который лежит на компьютере пользователя, недоступен серверному коду напрямую — его нужно сначала передать на сервер через временное хранилище. Этот сценарий также рассмотрен отдельным разделом.
Чтение текстового файла в строку через ЧтениеТекста
Объект ЧтениеТекста — стандартный способ получить содержимое текстового файла. Метод Прочитать() без параметров считывает файл целиком и возвращает одну строку, включая переносы строк. Это удобно для небольших и средних файлов: настроек, JSON-документов, логов.
ЧтениеТекста = Новый ЧтениеТекста("C:\Данные\settings.json", КодировкаТекста.UTF8);
СодержимоеСтрокой = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
Сообщить(СтрДлина(СодержимоеСтрокой));Второй параметр конструктора — кодировка. Если её не указать, 1С попытается определить кодировку автоматически, что нередко приводит к «кракозябрам» при файлах в UTF-8 без BOM или в ANSI. Явно указывайте КодировкаТекста.UTF8, КодировкаТекста.ANSI или КодировкаТекста.UTF16 в зависимости от источника файла.
Если файл нужен не целиком, а построчно (например, большой CSV, который нежелательно загружать в память), используйте метод ПрочитатьСтроку() в цикле. Он возвращает Неопределено, когда файл закончился.
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
Пока СтрокаФайла <> Неопределено Цикл
// обработка строки
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;
ЧтениеТекста.Закрыть();Получение двоичного файла в виде строки Base64
Картинки, PDF, архивы и другие двоичные файлы нельзя корректно прочитать как текст — данные будут испорчены. Стандартный приём: прочитать файл как ДвоичныеДанные и закодировать в строку Base64. Такая строка безопасно передаётся через JSON, XML и HTTP.
ДвоичныеДанные = Новый ДвоичныеДанные("C:\Данные\отчет.pdf");
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
// Обратное преобразование:
ВосстановленныеДанные = Base64Значение(СтрокаBase64);
ВосстановленныеДанные.Записать("C:\Данные\копия.pdf");Учтите, что Base64 увеличивает объём данных примерно на треть. Для файла в 30 МБ строка займёт около 40 МБ в памяти, а в управляемых формах это дополнительно гоняется между клиентом и сервером. Для больших файлов рассмотрите передачу двоичных данных напрямую через временное хранилище или потоки, минуя строковое представление.
Чтение файла на клиенте: временное хранилище
В тонком и веб-клиенте прямой доступ к диску пользователя из серверного кода невозможен, а на клиенте действуют ограничения безопасности. Типовая схема: пользователь выбирает файл, клиент помещает его во временное хранилище, а сервер извлекает данные по адресу хранилища.
- 1Вызовите НачатьПомещениеФайла с описанием оповещения о завершении
- 2В обработчике получите Адрес временного хранилища
- 3Передайте адрес в серверную процедуру
- 4На сервере вызовите ПолучитьИзВременногоХранилища(Адрес) — получите ДвоичныеДанные
- 5Запишите данные во временный файл или преобразуйте в строку Base64
- 6После обработки очистите хранилище через УдалитьИзВременногоХранилища
&НаСервере
Функция ФайлКакСтрокаНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF8);
Результат = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Возврат Результат;
КонецФункцииОбратите внимание: из временного хранилища всегда возвращаются ДвоичныеДанные, даже если исходный файл текстовый. Поэтому на сервере файл либо записывается на диск и читается через ЧтениеТекста, либо кодируется в Base64.
Чтение JSON и XML сразу в структуру данных
Если файл содержит JSON, получать его просто строкой обычно не нужно — удобнее сразу распарсить через ЧтениеJSON. Тогда вместо строки вы получите готовую структуру или соответствие.
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл("C:\Данные\данные.json");
Данные = ПрочитатьJSON(ЧтениеJSON); // Структура или Соответствие
ЧтениеJSON.Закрыть();Для XML аналогично работают ЧтениеXML и ЧтениеXML.ОткрытьФайл(). Эти объекты читают файл потоково, поэтому подходят и для крупных документов, где загрузка всей строки в память нерациональна.
Выбор способа под конкретную задачу
Сравнение вариантов
Текстовые файлы небольшого и среднего размера, когда нужна вся строка целиком. Требует указания кодировки.
Большие текстовые файлы и CSV, обработка порциями без загрузки всего в память.
Картинки, PDF, архивы — когда строка нужна для передачи по HTTP или в JSON. Увеличивает объём примерно на треть.
Структурированные файлы, когда строка не нужна, а нужны сразу данные.
Файлы, выбранные пользователем на клиенте в управляемом приложении.
Простое правило: если дальше строку будут разбирать как текст — используйте ЧтениеТекста; если строка нужна только как транспорт для передачи файла — используйте Base64; если файл структурированный — парсите сразу, минуя строку.
Кодировки и частые ошибки
Самая распространённая проблема — неверная кодировка. Признаки: вопросительные знаки, «кракозябры» вместо кириллицы, ошибки парсинга JSON. Файлы из Windows-программ чаще всего в ANSI (Windows-1251), из Linux и веб-сервисов — в UTF-8. Если не уверены, проверьте наличие BOM в начале файла или попробуйте обе кодировки и сравните результат.
Ещё одна ошибка — забыть удалить временные файлы после серверной обработки. Каталог временных файлов сервера постепенно разрастается. Всегда вызывайте УдалитьФайлы() в блоке, который выполнится даже при ошибке (конструкция Попытка...Исключение с удалением в обоих ветках).
Проверка результата
Как проверить результат
СтрДлина() возвращает значение больше нуля и соответствует ожидаемому размеру файла
Строка пустая при непустом файле — неверный путь или проблема с правами доступа
Русские буквы отображаются корректно
Вопросительные знаки или кракозябры — неверная кодировка
Base64Значение() восстанавливает файл, который открывается без ошибок
Файл повреждён — возможно, строка была изменена при передаче (переносы строк, обрезка)
После Закрыть() файл доступен для записи и удаления
Ошибка доступа к файлу — чтение не закрыто
Для отладки удобно вывести первые 100–200 символов строки через Лев(СодержимоеСтрокой, 200) — этого достаточно, чтобы увидеть кодировку, формат и начало данных, не засоряя журнал.
Что важно запомнить
Текстовый файл читается в строку через ЧтениеТекста.Прочитать() с явным указанием кодировки. Двоичный файл преобразуется в строку через ДвоичныеДанные и Base64Строка(). Файл с клиента сначала помещается во временное хранилище. Всегда закрывайте чтение и удаляйте временные файлы, а большие файлы обрабатывайте порциями.
Частые вопросы
Как прочитать файл в строку без диалога выбора, если путь известен?
Используйте ЧтениеТекста с явным путём к файлу — диалог не нужен. В тонком клиенте для доступа к файловой системе может потребоваться вызов НачатьПодключениеРасширенияРаботыСФайлами() и режим БезопасныйРежим может блокировать операцию на сервере.
Чем отличается Прочитать() от ПрочитатьСтроку()?
Прочитать() возвращает весь файл одной строкой, включая символы переноса. ПрочитатьСтроку() возвращает одну строку без символа переноса и применяется в цикле для послойной обработки больших файлов.
Как получить строку Base64 из картинки для отправки в веб-сервис?
Создайте Новый ДвоичныеДанные(ПутьКФайлу) и примените функцию Base64Строка(). Полученную строку вставьте в JSON-тело запроса. На приёмной стороне файл восстанавливается функцией Base64Значение().
Почему при чтении файла появляются кракозябры?
Кодировка файла не совпадает с указанной в конструкторе ЧтениеТекста. Попробуйте КодировкаТекста.UTF8 и КодировкаТекста.ANSI. Также проверьте, не является ли файл на самом деле двоичным — тогда читать его как текст нельзя вовсе.
Можно ли прочитать файл в строку на мобильном клиенте?
Да, но через асинхронные методы: файл сначала помещается во временное хранилище (НачатьПомещениеФайла), затем данные извлекаются на сервере. Прямой синхронный доступ к файловой системе устройства ограничен платформой.
Как безопасно прочитать файл, которого может не существовать?
Перед чтением проверьте существование: Файл = Новый Файл(Путь); Если Файл.Существует() Тогда .... Дополнительно оберните чтение в Попытка...Исключение, чтобы корректно обработать ошибки доступа и блокировок.