При разработке в 1С часто возникает задача прочитать файл «как есть», не внося изменений в служебные символы. Например, необходимо получить строкой файл со смешанными переносами строк или попытаться отредактировать бинарно-текстовый файл вроде PDF. Разберем ситуацию: стандартные методы 1С (такие как ЧтениеТекста и ТекстовыйДокумент) при чтении автоматически преобразуют разделители строк разных типов (CR, LF, CRLF) в платформенный стандарт — Символы.ПС. Проанализируем причины такого поведения и рассмотрим рабочие способы обхода этой особенности.
Объекты ТекстовыйДокумент, ЧтениеТекста и ЗаписьТекста по своей архитектуре спроектированы для кроссплатформенной работы с текстом. При чтении они автоматически нормализуют разделители строк, а при записи вставляют разделитель по умолчанию для текущей операционной системы (или указанный явно в параметрах). Отключить эту нормализацию при использовании данных классов невозможно. Поэтому, если нам нужно сохранить оригинальные байты переносов каретки, придется использовать другие механизмы.
Рассмотрим вариант решения, предложенный на форуме. Суть заключается в преобразовании текста в двоичные данные без искажений через объект ЗаписьXML с использованием метода ЗаписатьБезОбработки и кодировки ISO-8859-1.
Посмотрим на пример кода для записи и чтения массива полезных байт:
// ТекстФайла -> ДД
ИмяВремФайла = ПолучитьИмяВременногоФайла(".rpb");
ТекстПостроитель = Новый ЗаписьXML;
ТекстПостроитель.ОткрытьФайл(ИмяВремФайла, "ISO-8859-1");
ТекстПостроитель.ЗаписатьБезОбработки(ТекстФайла); // Сохраняет оригинальные переносы
ТекстПостроитель.Закрыть();
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВремФайла);
УдалитьФайлы(ИмяВремФайла);
Возврат ДвоичныеДанныеФайла;
Обратное преобразование (Двоичные данные -> Текст файла):
ИмяВремФайла = ПолучитьИмяВременногоФайла(".rpb");
ДвоичныеДанныеФайла.Записать(ИмяВремФайла);
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВремФайла, "ISO-8859-1", "");
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
УдалитьФайлы(ИмяВремФайла);
Начиная с версии платформы 8.3.9, появился полноценный инструментарий для побайтовой работы с файлами без конвертации. Разберем по шагам, что мы можем использовать:
ФайловыйПоток, БуферДвоичныхДанных, ЧтениеДанных и ЗаписьДанных.Если решение создается исключительно под ОС Windows, мы можем прибегнуть к использованию внешнего COM-объекта. ADODB.Stream позволяет читать и писать файлы без изменения невидимых символов. При инициализации объекта задается свойство Type = 1 (бинарный режим) или Type = 2 (текстовый режим), что дает полный контроль над байтами файла и исключает самовольное преобразование разделителей.
Выясним причину, по которой обычная текстовая замена (даже без изменения переносов) может привести к порче PDF-документа. PDF — это бинарно-текстовый формат со строгой внутренней структурой.
В конце PDF-документа располагается таблица перекрестных ссылок (xref table), которая хранит точные смещения в байтах для каждого элемента файла. Если при текстовой замене через 1С новая строка будет отличаться по длине от исходной, итоговое количество байт изменится. В результате все физические смещения объектов съедут. Программы для чтения PDF (например, Adobe Reader) при открытии такого документа сообщат, что файл поврежден (ошибка "Couldn't read xref table").
Вместо попыток разобрать PDF как текстовый файл встроенными средствами 1С, рассмотрим более надежные инструменты, способные пересчитывать таблицу xref:
ЗапуститьПриложение. Вы передаете необходимые параметры командной строки для извлечения данных, модификации и корректной сборки файла обратно.Таким образом, для простых текстовых файлов смешанного формата подойдут потоки или объект ЗаписьXML в кодировке ISO, но для редактирования таких сложных форматов, как PDF, настоятельно рекомендуется использовать профильные библиотеки или утилиты.