При работе с высоконагруженными базами данных на платформе 1С 7.7 стандартные методы выборки данных (через объект Запрос или переборы справочников) часто оказываются слишком медленными. Решением становится использование «прямых запросов» к базе данных. Однако новички часто сталкиваются с ошибками вроде "no such table" или получают пустые таблицы значений. В данной статье мы разберем, как правильно настроить компоненту 1SQLite, как использовать возможности 1C++ и как сделать ваши запросы универсальными для файловых и SQL-версий.
Разберем ситуацию, с которой столкнулся автор темы. При попытке выполнить запрос к таблице $Справочник.Склады система выдает ошибку, так как SQLite «не знает», что такое метаданные 1С. В файловой версии базы данных таблицы хранятся в формате DBF, и SQLite должна создать виртуальную связь с этими файлами.
Проанализируем самый надежный способ решения проблемы — использование движка dbeng. Рассмотрим пример кода, который инициализирует базу в памяти и создает виртуальную таблицу для справочника:
БазаДанных = СоздатьОбъект("SQLiteBase");
БазаДанных.Открыть(":memory:");
Запрос = БазаДанных.НовыйЗапрос();
// Создаем виртуальную таблицу, связывая метаданные 1С с SQLite
Запрос.ВыполнитьЗапрос("create virtual table Склады using dbeng(Справочник.Склады)");
Текст = "SELECT
| code Код,
| id [Склад :Справочник.Склады]
|FROM Склады";
Попытка
ТЗ = Запрос.ВыполнитьЗапрос(Текст);
ТЗ.ВыбратьСтроку();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
В этом примере команда create virtual table сообщает компоненте, что нужно использовать драйвер dbeng для доступа к физическому файлу справочника «Склады». Обратите внимание на конструкцию [Склад :Справочник.Склады] — это механизм типизации. Благодаря ему в колонке таблицы значений будут находиться не просто строки идентификаторов, а полноценные объекты 1С.
Современные версии компоненты 1SQLite позволяют упростить процесс и не прописывать create virtual table для каждого объекта вручную. Разберем, как обратиться к метаданным напрямую через специальные синтаксические конструкции. Выясним, какие варианты написания понимает компонента:
FROM [Справочник.Склады]. В этом случае компонента сама находит нужный DBF-файл и подключает его «на лету».FROM Справочник_Склады. Этот вариант часто используется в автозаменах метаданных.Посмотрим на пример упрощенного запроса:
ТекстЗапроса = "
|SELECT
| Склад.Descr as Наименование
|FROM
| [Справочник.Склады] AS Склад";
ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
Если ваша задача — написать код, который будет одинаково успешно работать как в файловой версии (через SQLite), так и на MS SQL Server, рекомендуем использовать класс ПрямойЗапрос. Это высокоуровневая обертка над 1SQLite и ODBCRecordset. Рассмотрим преимущества этого подхода:
$Справочник.Имя, которую класс сам развернет в физическое имя таблицы (например, SC123).Для использования этого метода необходимо наличие библиотеки 1cpp.dll. Пример инициализации класса (при условии, что класс «ПрямойЗапрос» добавлен в проект):
Запрос = СоздатьОбъект("ПрямойЗапрос");
Текст = "
|SELECT
| Спр.Code as Код,
| Спр.Descr as Наименование
|FROM
| $Справочник.Склады as Спр";
ТЗ = Запрос.Выполнить(Текст);
ТЗ.ВыбратьСтроку();
При реализации сложной логики расчетов часто требуется сохранить промежуточные результаты. В SQLite это делается стандартными средствами SQL. Проанализируем ситуацию создания временной таблицы для хранения списка документов:
// Создание временной таблицы в памяти
Запрос.ВыполнитьЗапрос("CREATE TEMP TABLE tmp_docs(d varchar(13) primary key not null)");
// Наполнение таблицы данными (пример)
Запрос.ВыполнитьЗапрос("INSERT INTO tmp_docs VALUES (' 1ZY ')");
Использование TEMP TABLE позволяет значительно ускорить последующие JOIN-операции, так как временная таблица индексируется и находится в оперативной памяти.
Многие программисты, перешедшие с 1С 8.x, страдают от отсутствия визуального конструктора запросов. Однако для 7.7 сообществом разработаны мощные инструменты. Рекомендуем найти и использовать следующие обработки:
SP123 для реквизита справочника).Подводя итог, можно сказать: использование прямых запросов через 1SQLite — это лучший способ вдохнуть новую жизнь в старую конфигурацию 7.7. Начните с простых выборок через dbeng, а затем переходите к использованию классов 1C++ для создания масштабируемых и быстрых решений.