При интеграции 1С с внешними системами часто возникает задача быстрой загрузки больших текстовых файлов (CSV, TXT). Использование технологии OLEDB оправдано высокой скоростью обработки данных по сравнению со стандартным объектом ЧтениеТекста. Однако разработчики часто сталкиваются с неприятной особенностью: если в поле текстового файла встречается двойная кавычка, драйвер может прервать чтение строки или вернуть некорректные данные. В этой статье мы подробно разберем, почему это происходит и как настроить систему для корректной обработки таких файлов.
Разберем ситуацию: по умолчанию драйверы Microsoft.Jet.OleDb или Microsoft.ACE.OLEDB воспринимают двойную кавычку (") как ограничитель текстового поля (Text Delimiter). Если драйвер встречает кавычку внутри данных, он начинает искать парную закрывающую кавычку. Если она не найдена до следующего разделителя или конца строки, логика парсинга нарушается. В итоге мы получаем либо пустые значения, либо «обрезанные» строки. Проанализируем, как можно заставить драйвер игнорировать кавычки и воспринимать их просто как часть текстовой строки.
Самый надежный и правильный способ управления поведением OLEDB-драйвера при работе с текстовыми файлами — это создание файла schema.ini. Этот файл должен располагаться в той же папке, что и считываемый текстовый документ. Рассмотрим подробнее, как его настроить.
Для того чтобы драйвер перестал интерпретировать кавычки как спецсимволы, нам необходимо явно указать параметр TextDelimiter=none. Разберем пример структуры такого файла:
[ИмяВашегоФайла.csv]
Format=Delimited(;)
ColNameHeader=True
CharacterSet=65001
TextDelimiter=none
Разберем по шагам ключевые параметры этого файла:
1251.При использовании 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. Он переводит драйвер в режим импорта, что заставляет его интерпретировать смешанные типы данных как текст. Это помогает избежать ошибок, когда в колонке с числами внезапно встречается строка с кавычками.
Если по каким-то причинам вы не можете использовать schema.ini, рассмотрим вариант с программной обработкой файла перед его загрузкой через OLEDB. Суть заключается в том, чтобы заменить «проблемные» символы на те, которые гарантированно не встретятся в данных.
Выполним это с помощью объекта 1С ЧтениеТекста и ЗаписьТекста:
// Читаем исходный файл
Текст = Новый ЧтениеТекста(ПолныйПутьКФайлу);
Содержимое = Текст.Прочитать();
Текст.Закрыть();
// Заменяем кавычки на временный уникальный набор символов
Содержимое = СтрЗаменить(Содержимое, """", "##QUOTE##");
// Записываем во временный файл для OLEDB
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("txt");
Запись = Новый ЗаписьТекста(ПутьКВременномуФайлу);
Запись.Записать(Содержимое);
Запись.Закрыть();
После загрузки данных через OLEDB в таблицу значений или массив, вам останется лишь выполнить обратную замену ##QUOTE## на символ кавычки внутри 1С. Этот метод менее производителен на очень больших файлах, но крайне надежен.
Если 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С.
Проанализируем еще несколько факторов, которые могут влиять на результат:
Microsoft Access Database Engine. В противном случае COM-объект не будет создан.schema.ini) можно настроить параметр MaxScanRows. По умолчанию драйвер анализирует только первые 8–25 строк для определения типов колонок. Если кавычки появляются только в середине файла, драйвер может не успеть подстроиться под текстовый формат. Установка MaxScanRows=0 заставит его сканировать файл полностью.Подводя итог, использование schema.ini с параметром TextDelimiter=none является наиболее элегантным решением, которое сохраняет преимущества скорости OLEDB и решает проблему с «битыми» строками из-за кавычек.