Как в 1С открыть текстовый файл на чтение и запись без конвертации разделителей строк?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в 1С часто возникает задача прочитать файл «как есть», не внося изменений в служебные символы. Например, необходимо получить строкой файл со смешанными переносами строк или попытаться отредактировать бинарно-текстовый файл вроде PDF. Разберем ситуацию: стандартные методы 1С (такие как ЧтениеТекста и ТекстовыйДокумент) при чтении автоматически преобразуют разделители строк разных типов (CR, LF, CRLF) в платформенный стандарт — Символы.ПС. Проанализируем причины такого поведения и рассмотрим рабочие способы обхода этой особенности.

Причины проблемы и ограничения платформы

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

Способ 1: Использование двоичных данных и XML-записи (устаревший, но рабочий обходной путь)

Рассмотрим вариант решения, предложенный на форуме. Суть заключается в преобразовании текста в двоичные данные без искажений через объект ЗаписьXML с использованием метода ЗаписатьБезОбработки и кодировки ISO-8859-1.

Посмотрим на пример кода для записи и чтения массива полезных байт:


// ТекстФайла -> ДД
ИмяВремФайла = ПолучитьИмяВременногоФайла(".rpb");
ТекстПостроитель = Новый ЗаписьXML;
ТекстПостроитель.ОткрытьФайл(ИмяВремФайла, "ISO-8859-1");
ТекстПостроитель.ЗаписатьБезОбработки(ТекстФайла); // Сохраняет оригинальные переносы
ТекстПостроитель.Закрыть();

ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ИмяВремФайла);
УдалитьФайлы(ИмяВремФайла);
Возврат ДвоичныеДанныеФайла;

Обратное преобразование (Двоичные данные -> Текст файла):


ИмяВремФайла = ПолучитьИмяВременногоФайла(".rpb");
ДвоичныеДанныеФайла.Записать(ИмяВремФайла);
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВремФайла, "ISO-8859-1", "");
ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
УдалитьФайлы(ИмяВремФайла);

Способ 2: Использование потоков и бинарного чтения (современный подход)

Начиная с версии платформы 8.3.9, появился полноценный инструментарий для побайтовой работы с файлами без конвертации. Разберем по шагам, что мы можем использовать:

  1. Файловые потоки и буферы: Использование объектов ФайловыйПоток, БуферДвоичныхДанных, ЧтениеДанных и ЗаписьДанных.
  2. Этот подход позволяет загрузить файл в оперативную память в виде массива байтов. Вы можете искать нужные последовательности символов напрямую в буфере и изменять их.
  3. Платформа при таком побайтовом доступе не будет неявно модифицировать переносы строк, сохраняя файл в первозданном виде.

Способ 3: Использование COM-объекта ADODB.Stream (только для Windows)

Если решение создается исключительно под ОС Windows, мы можем прибегнуть к использованию внешнего COM-объекта. ADODB.Stream позволяет читать и писать файлы без изменения невидимых символов. При инициализации объекта задается свойство Type = 1 (бинарный режим) или Type = 2 (текстовый режим), что дает полный контроль над байтами файла и исключает самовольное преобразование разделителей.

Ограничения и риски при редактировании PDF как текста

Выясним причину, по которой обычная текстовая замена (даже без изменения переносов) может привести к порче PDF-документа. PDF — это бинарно-текстовый формат со строгой внутренней структурой.

В конце PDF-документа располагается таблица перекрестных ссылок (xref table), которая хранит точные смещения в байтах для каждого элемента файла. Если при текстовой замене через 1С новая строка будет отличаться по длине от исходной, итоговое количество байт изменится. В результате все физические смещения объектов съедут. Программы для чтения PDF (например, Adobe Reader) при открытии такого документа сообщат, что файл поврежден (ошибка "Couldn't read xref table").

Альтернативные и безопасные варианты для работы с PDF

Вместо попыток разобрать PDF как текстовый файл встроенными средствами 1С, рассмотрим более надежные инструменты, способные пересчитывать таблицу xref:

  1. Специализированные библиотеки (например, iTextSharp). Подключаются к 1С через COM-соединение. Они позволяют находить текст, заменять его и сохранять документ, автоматически пересчитывая структуру и сохраняя валидность.
  2. Консольные утилиты (PDFtk, QPDF, Ghostscript). Эти программы можно вызывать из 1С с помощью функции ЗапуститьПриложение. Вы передаете необходимые параметры командной строки для извлечения данных, модификации и корректной сборки файла обратно.

Таким образом, для простых текстовых файлов смешанного формата подойдут потоки или объект ЗаписьXML в кодировке ISO, но для редактирования таких сложных форматов, как PDF, настоятельно рекомендуется использовать профильные библиотеки или утилиты.

← На главную