Ошибка формата потока в 1С:Предприятие 8.3: причины и решения
«Ошибка формата потока» возникает в 1С:Предприятие 8.3, когда платформа пытается прочитать данные в формате, не совпадающем с фактическим содержимым: текстовые методы применяются к бинарному файлу, HTTP-ответ разбирается без учёта Content-Type, поток закрывается раньше окончания чтения.
Что такое ошибка формата потока
Ошибка возникает при несоответствии между методом чтения и реальным типом данных. Три наиболее частых случая:
- Чтение ZIP, PDF или другого бинарного файла методом
ЧтениеТекста - Разбор HTTP-ответа без проверки Content-Type
- Запись в закрытый или уже освобождённый поток
Пример: бинарный файл, прочитанный как текст
// Неправильно — ZIP-архив содержит бинарные данные,
// ЧтениеТекста выбросит «Ошибка формата потока»
ЧтТекст = Новый ЧтениеТекста("C:\exchange.zip", КодировкаТекста.UTF8);
Попытка
Содержимое = ЧтТекст.Прочитать();
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
ЧтТекст.Закрыть();
Правильно: для ZIP, PDF и любых бинарных форматов используйте
ЧтениеФайла или ДвоичныеДанные.
// Правильно — читаем как двоичные данные
ЧтениеФайла = Новый ЧтениеФайла("C:\exchange.zip");
ДвоичныеДанные = ЧтениеФайла.Прочитать();
ЧтениеФайла.Закрыть();
Типичные сценарии
1. HTTP-запросы и JSON
Корректный способ выполнить HTTP GET и разобрать ответ в зависимости от Content-Type:
Соединение = Новый HTTPСоединение("api.example.com");
Запрос = Новый HTTPЗапрос("/data");
Ответ = Соединение.Получить(Запрос);
КонтентТип = Ответ.Заголовки.Получить("Content-Type");
Если КонтентТип = "application/octet-stream" Тогда
// Бинарный ответ — сохраняем напрямую
ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
ДвоичныеДанные.Записать("C:\file.bin");
ИначеЕсли СтрНайти(КонтентТип, "application/json") > 0 Тогда
// JSON — используем ЧтениеJSON
ЧтJSON = Новый ЧтениеJSON;
ЧтJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтJSON);
ЧтJSON.Закрыть();
КонецЕсли;
Важно: глобальная функция
ПрочитатьJSON() принимает объект ЧтениеJSON, а не строку. Передача строки напрямую вызовет ошибку несоответствия типов.
2. Работа с потоком в памяти
// Запись данных в поток и обратное чтение
Поток = Новый ПотокВПамяти();
ЗаписьФайла = Новый ЗаписьДанных(Поток);
ЗаписьФайла.ЗаписатьСимволы("Тестовые данные");
ЗаписьФайла.Закрыть(); // Обязательно закрыть перед чтением!
Поток.Перейти(0, ПозицияВПотоке.Начало);
ЧтениеДанных = Новый ЧтениеДанных(Поток);
Результат = ЧтениеДанных.ПрочитатьСимволы();
ЧтениеДанных.Закрыть();
Поток.Закрыть();
Сравнение методов чтения данных
| Метод / объект | Когда применять | Нельзя использовать для |
|---|---|---|
ЧтениеТекста | TXT, CSV, XML, JSON (файл) | ZIP, PDF, изображения, архивы |
ЧтениеФайла / ДвоичныеДанные | Любые бинарные форматы | — |
ПолучитьТелоКакСтроку() | HTTP-ответы: JSON, HTML, XML | Бинарные HTTP-ответы |
ПолучитьТелоКакДвоичныеДанные() | HTTP-ответы: файлы, изображения | — |
ЧтениеJSON + ПрочитатьJSON() | Разбор JSON из строки или файла | Прямой вызов с строкой |
Типичные ошибки и решения
Ошибка 1: объект «Файл» используется для чтения содержимого
Объект Файл в 1С предназначен только для работы с атрибутами файловой системы (существование, размер, дата изменения). Он не имеет методов для чтения содержимого.
// Неправильно — Файл не предназначен для чтения содержимого
ФС = Новый Файл("C:\data.xml");
// ФС.ПолучитьТекст() — такого метода не существует!
// Правильно
ЧтТекст = Новый ЧтениеТекста("C:\data.xml", КодировкаТекста.UTF8);
Текст = ЧтТекст.Прочитать();
ЧтТекст.Закрыть();
Ошибка 2: чтение из закрытого потока
// Поток закрыт до завершения чтения
Поток = Новый ПотокВПамяти();
Поток.Записать(ДвоичныеДанные);
Поток.Закрыть(); // Слишком рано!
ЧтениеДанных = Новый ЧтениеДанных(Поток); // Ошибка формата потока
// Правильно: закрывайте поток после завершения всех операций
Чек-лист: предотвращение ошибок формата потока
- Явно указывайте кодировку при создании
ЧтениеТекста(например,КодировкаТекста.UTF8) - Проверяйте Content-Type HTTP-ответа перед выбором метода разбора
- Для
ПрочитатьJSON()всегда передавайте объектЧтениеJSON, а не строку - Закрывайте потоки и объекты чтения/записи только после завершения всех операций с данными
- Перед повторным чтением потока сбрасывайте позицию:
Поток.Перейти(0, ПозицияВПотоке.Начало)
Профессиональные решения для 1С и интеграций с маркетплейсами — каталог отчётов и инструментов на витрине НОПи.
Перейти в каталог решений →
Перейти в каталог решений →