Как решить проблему с чтением кавычек через OLEDB из текстового файла с разделителями в 1С

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

При интеграции 1С с внешними системами часто возникает задача быстрой загрузки больших текстовых файлов (CSV, TXT). Использование технологии OLEDB оправдано высокой скоростью обработки данных по сравнению со стандартным объектом ЧтениеТекста. Однако разработчики часто сталкиваются с неприятной особенностью: если в поле текстового файла встречается двойная кавычка, драйвер может прервать чтение строки или вернуть некорректные данные. В этой статье мы подробно разберем, почему это происходит и как настроить систему для корректной обработки таких файлов.

Выясняем причину проблемы

Разберем ситуацию: по умолчанию драйверы Microsoft.Jet.OleDb или Microsoft.ACE.OLEDB воспринимают двойную кавычку (") как ограничитель текстового поля (Text Delimiter). Если драйвер встречает кавычку внутри данных, он начинает искать парную закрывающую кавычку. Если она не найдена до следующего разделителя или конца строки, логика парсинга нарушается. В итоге мы получаем либо пустые значения, либо «обрезанные» строки. Проанализируем, как можно заставить драйвер игнорировать кавычки и воспринимать их просто как часть текстовой строки.

Решение №1: Использование файла настроек Schema.ini

Самый надежный и правильный способ управления поведением OLEDB-драйвера при работе с текстовыми файлами — это создание файла schema.ini. Этот файл должен располагаться в той же папке, что и считываемый текстовый документ. Рассмотрим подробнее, как его настроить.

Для того чтобы драйвер перестал интерпретировать кавычки как спецсимволы, нам необходимо явно указать параметр TextDelimiter=none. Разберем пример структуры такого файла:


[ИмяВашегоФайла.csv]
Format=Delimited(;)
ColNameHeader=True
CharacterSet=65001
TextDelimiter=none

Разберем по шагам ключевые параметры этого файла:

  1. [ИмяВашегоФайла.csv] — секция должна точно соответствовать имени файла, который вы открываете.
  2. Format=Delimited(;) — указываем символ-разделитель (в данном случае точка с запятой). Это гарантирует, что драйвер не запутается, если системные настройки разделителя в Windows отличаются.
  3. CharacterSet=65001 — указывает кодировку файла (65001 соответствует UTF-8). Если ваш файл в кодировке Windows-1251, укажите 1251.
  4. TextDelimiter=none — критически важная настройка. Она сообщает драйверу, что в файле нет специальных символов, обрамляющих текст, и любую кавычку нужно считывать как обычный символ.

Решение №2: Настройка строки подключения (Connection String)

При использовании Microsoft.ACE.OLEDB.12.0 в 1С важно правильно сформировать строку подключения. Посмотрим на пример кода, который инициализирует соединение с учетом особенностей обработки текстовых данных:


ПутьКПапке = "C:\DataImport\";
ФайлДанных = "import.csv";
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКПапке + ";Extended Properties=""Text;HDR=YES;IMEX=1;""";

Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрокаПодключения);

ТекстЗапроса = "SELECT * FROM [" + ФайлДанных + "]";
Recordset = Connection.Execute(ТекстЗапроса);

Обратим внимание на параметр IMEX=1. Он переводит драйвер в режим импорта, что заставляет его интерпретировать смешанные типы данных как текст. Это помогает избежать ошибок, когда в колонке с числами внезапно встречается строка с кавычками.

Решение №3: Предварительная обработка файла (Препроцессинг)

Если по каким-то причинам вы не можете использовать schema.ini, рассмотрим вариант с программной обработкой файла перед его загрузкой через OLEDB. Суть заключается в том, чтобы заменить «проблемные» символы на те, которые гарантированно не встретятся в данных.

Выполним это с помощью объекта 1С ЧтениеТекста и ЗаписьТекста:


// Читаем исходный файл
Текст = Новый ЧтениеТекста(ПолныйПутьКФайлу);
Содержимое = Текст.Прочитать();
Текст.Закрыть();

// Заменяем кавычки на временный уникальный набор символов
Содержимое = СтрЗаменить(Содержимое, """", "##QUOTE##");

// Записываем во временный файл для OLEDB
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("txt");
Запись = Новый ЗаписьТекста(ПутьКВременномуФайлу);
Запись.Записать(Содержимое);
Запись.Закрыть();

После загрузки данных через OLEDB в таблицу значений или массив, вам останется лишь выполнить обратную замену ##QUOTE## на символ кавычки внутри 1С. Этот метод менее производителен на очень больших файлах, но крайне надежен.

Альтернативный подход через ADODB.Stream

Если OLEDB продолжает вести себя нестабильно, проанализируем использование ADODB.Stream. Этот метод работает быстрее стандартного чтения 1С и позволяет более гибко управлять потоком данных. Рассмотрим пример чтения:


Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 2; // Text
Stream.Charset = "utf-8";
Stream.Open();
Stream.LoadFromFile(ПолныйПутьКФайлу);

Пока НЕ Stream.EOS Цикл
    Строка = Stream.ReadText(-2); // Чтение строки (-2 - Line separator)
    // Здесь можно выполнить ручной парсинг строки
КонецЦикла;
Stream.Close();

Этот способ позволяет избежать ограничений драйверов баз данных и самостоятельно определять логику обработки кавычек в коде 1С.

Важные технические нюансы

Проанализируем еще несколько факторов, которые могут влиять на результат:

  1. Разрядность драйвера: Помните, что если вы используете 64-битный сервер 1С, вам необходимо установить 64-битную версию Microsoft Access Database Engine. В противном случае COM-объект не будет создан.
  2. Параметр MaxScanRows: В реестре Windows (или в schema.ini) можно настроить параметр MaxScanRows. По умолчанию драйвер анализирует только первые 8–25 строк для определения типов колонок. Если кавычки появляются только в середине файла, драйвер может не успеть подстроиться под текстовый формат. Установка MaxScanRows=0 заставит его сканировать файл полностью.
  3. Блокировка файлов: При открытии файла через OLEDB, он может быть заблокирован для записи другими процессами. Учитывайте это при проектировании регламентных заданий.

Подводя итог, использование schema.ini с параметром TextDelimiter=none является наиболее элегантным решением, которое сохраняет преимущества скорости OLEDB и решает проблему с «битыми» строками из-за кавычек.

← На главную