При интеграции 1С 7.7 со сторонними базами данных, такими как SQLite, разработчики часто сталкиваются с классической проблемой: соединение устанавливается успешно, запрос выполняется, количество строк в выборке определяется верно, но при попытке получить значения полей через RecordSet.Fields(i).Value возвращаются пустые строки или неопределенные значения. В этой статье мы подробно разберем, почему стандартный механизм ADO/ODBC может давать сбои и как профессионально решить эту задачу с помощью специализированных инструментов.
Рассмотрим ситуацию, когда при выполнении запроса SELECT * FROM account через ADODB.Recordset мы видим количество записей, но не видим самих данных. Проанализируем основные технические причины такого поведения:
TEXT или BLOB, которые 1С 7.7 воспринимает через COM-интерфейс с ошибками.Вместо того чтобы бороться с ограничениями 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-запросе гарантирует отсутствие ошибок.
Почему этот подход считается предпочтительным для программиста 1С? Разберем ключевые выгоды:
.dbf самой 1С как внешние таблицы для SQLite. Это дает возможность выполнять JOIN-запросы между данными вашей текущей базы 1С и внешним файлом SQLite.:memory:), что идеально подходит для ускорения формирования сложных отчетов.Если в будущем планируется перенос решения на платформу 1С 8.3, стоит знать, что принципы остаются схожими. Хотя в "восьмерке" есть механизм Внешних источников данных, работа с SQLite через них также требует установленного ODBC драйвера. Альтернативой является использование проекта v8sqlite (NativeAPI), который позволяет работать с SQLite так же бесшовно, как и в 7.7, обеспечивая кроссплатформенность (включая работу на серверах под управлением Linux).
Подводя итог, можно сказать: если вы столкнулись с проблемой пустых данных при использовании ADODB в 1С 7.7, не тратьте время на отладку параметров ODBC-драйвера. Оптимальным путем будет использование компоненты 1csqlite. Это обеспечит стабильность кодировок, высокую скорость работы и простоту поддержки кода. Мы рассмотрели основные методы подключения и выполнения запросов, которые помогут вам эффективно интегрировать SQLite в ваши проекты на базе 1С.