Как получить данные из SQLite в 1С 7.7 и почему ADO может возвращать пустые значения

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции 1С 7.7 со сторонними базами данных, такими как SQLite, разработчики часто сталкиваются с классической проблемой: соединение устанавливается успешно, запрос выполняется, количество строк в выборке определяется верно, но при попытке получить значения полей через RecordSet.Fields(i).Value возвращаются пустые строки или неопределенные значения. В этой статье мы подробно разберем, почему стандартный механизм ADO/ODBC может давать сбои и как профессионально решить эту задачу с помощью специализированных инструментов.

Почему стандартный ODBC и ADODB выдает пустые значения

Рассмотрим ситуацию, когда при выполнении запроса SELECT * FROM account через ADODB.Recordset мы видим количество записей, но не видим самих данных. Проанализируем основные технические причины такого поведения:

  1. Конфликт кодировок: SQLite по умолчанию хранит строковые данные в формате UTF-8. Платформа 1С:Предприятие 7.7 является «однобайтовой» и работает в кодировке ANSI (Windows-1251). Если используемый драйвер ODBC (например, драйвер GM) не настроен на автоматическую трансляцию кодировок или делает это некорректно, 1С просто не может интерпретировать полученный поток байтов как строку, в результате чего мы видим пустоту.
  2. Тип курсора (CursorLocation): Для корректной работы SQLite в связке с ADO крайне важно явно указывать местоположение курсора. По умолчанию ADO часто использует серверный курсор, который плохо поддерживается многими драйверами SQLite. Выясним причину: SQLite — это встраиваемая база данных, работающая в адресном пространстве процесса, и понятие «серверного курсора» для неё эфемерно.
  3. Специфика драйвера: Драйверы сторонних разработчиков (такие как GM ODBC) могут иметь внутренние ограничения при работе с типами данных TEXT или BLOB, которые 1С 7.7 воспринимает через COM-интерфейс с ошибками.

Решение проблемы с помощью компоненты 1csqlite

Вместо того чтобы бороться с ограничениями ODBC, опытные разработчики рекомендуют использовать специализированную компоненту 1csqlite. Это решение, разработанное Олегом Орефковым, работает напрямую с библиотекой sqlite3.dll, минуя лишние прослойки в виде системных DSN и менеджера драйверов ODBC.

Рассмотрим подробнее, как реализовать подключение к базе данных SQLite с помощью этой компоненты. Прежде всего, нам необходимо создать объект и открыть файл базы данных. Посмотрим на пример кода:


БазаДанныхSQLite = СоздатьОбъект("SQLiteBase");
ПутьКБазе = "C:\Data\external_db.sqlite";
Если БазаДанныхSQLite.Открыть(ПутьКБазе) = 0 Тогда
    Сообщить("Ошибка открытия базы данных!");
    Возврат;
КонецЕсли;

После того как база открыта, мы можем выполнять запросы и получать данные напрямую. Преимущество 1csqlite заключается в том, что она изначально проектировалась для работы в среде 1С 7.7 и корректно обрабатывает преобразование типов и кодировок.

Разбор по шагам: выполнение запроса и обход данных

Проанализируем процесс получения данных из таблицы. В отличие от ADODB, работа с объектами 1csqlite более прозрачна и эффективна. Разберем типичный алгоритм:


Запрос = БазаДанныхSQLite.НовыйЗапрос();
ТекстЗапроса = "SELECT id, name, balance FROM account";
ТЗ_Результат = Запрос.ВыполнитьЭкспорт(ТекстЗапроса);

// Теперь данные находятся в обычной Таблице Значений 1С
ТЗ_Результат.ВыбратьСтроки();
Пока ТЗ_Результат.ПолучитьСтроку() = 1 Цикл
    Сообщить("Аккаунт: " + ТЗ_Результат.name + " Баланс: " + ТЗ_Результат.balance);
КонецЦикла;

Как мы видим, использование метода ВыполнитьЭкспорт() позволяет сразу выгрузить результат SQL-запроса в объект ТаблицаЗначений. Это избавляет нас от необходимости вручную перебирать RecordSet и проверять условия EOF().

Важные нюансы типизации и хранения дат

При работе с SQLite важно помнить, что эта СУБД имеет динамическую типизацию. Особое внимание стоит уделить датам. Выясним, как правильно обрабатывать временные метки:


// Преобразование строковой даты в формат, удобный для 1С
ТекстЗапроса = "SELECT name, date(created_at) as ДатаСоздания FROM account";

Важный момент: Если вы используете 1csqlite, она автоматически старается привести типы к наиболее подходящим в 1С, но явное форматирование в SQL-запросе гарантирует отсутствие ошибок.

Преимущества использования 1csqlite перед ODBC

Почему этот подход считается предпочтительным для программиста 1С? Разберем ключевые выгоды:

  1. Отсутствие настроек на стороне ОС: Вам не нужно заходить в "Администрирование -> Источники данных ODBC" и создавать системные DSN на каждом компьютере, где будет работать программа. Достаточно наличия DLL рядом с базой или в каталоге платформы.
  2. Виртуальные таблицы: Компонента позволяет подключать таблицы .dbf самой 1С как внешние таблицы для SQLite. Это дает возможность выполнять JOIN-запросы между данными вашей текущей базы 1С и внешним файлом SQLite.
  3. Производительность: Работа через Native API SQLite происходит значительно быстрее, чем через тяжеловесный слой COM/ADO. Особенно это заметно при больших выборках.
  4. Поддержка памяти: Вы можете создавать временные базы данных прямо в оперативной памяти (используя путь :memory:), что идеально подходит для ускорения формирования сложных отчетов.

Перспективы: SQLite в 1С 8.x

Если в будущем планируется перенос решения на платформу 1С 8.3, стоит знать, что принципы остаются схожими. Хотя в "восьмерке" есть механизм Внешних источников данных, работа с SQLite через них также требует установленного ODBC драйвера. Альтернативой является использование проекта v8sqlite (NativeAPI), который позволяет работать с SQLite так же бесшовно, как и в 7.7, обеспечивая кроссплатформенность (включая работу на серверах под управлением Linux).

Заключение

Подводя итог, можно сказать: если вы столкнулись с проблемой пустых данных при использовании ADODB в 1С 7.7, не тратьте время на отладку параметров ODBC-драйвера. Оптимальным путем будет использование компоненты 1csqlite. Это обеспечит стабильность кодировок, высокую скорость работы и простоту поддержки кода. Мы рассмотрели основные методы подключения и выполнения запросов, которые помогут вам эффективно интегрировать SQLite в ваши проекты на базе 1С.

← На главную