Как выполнять прямые SQL-запросы в 1С 7.7 с помощью 1SQLite и 1C++?

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

При работе с высоконагруженными базами данных на платформе 1С 7.7 стандартные методы выборки данных (через объект Запрос или переборы справочников) часто оказываются слишком медленными. Решением становится использование «прямых запросов» к базе данных. Однако новички часто сталкиваются с ошибками вроде "no such table" или получают пустые таблицы значений. В данной статье мы разберем, как правильно настроить компоненту 1SQLite, как использовать возможности 1C++ и как сделать ваши запросы универсальными для файловых и SQL-версий.

Причина ошибки «no such table» и ручное создание виртуальных таблиц

Разберем ситуацию, с которой столкнулся автор темы. При попытке выполнить запрос к таблице $Справочник.Склады система выдает ошибку, так как SQLite «не знает», что такое метаданные 1С. В файловой версии базы данных таблицы хранятся в формате DBF, и SQLite должна создать виртуальную связь с этими файлами.

Проанализируем самый надежный способ решения проблемы — использование движка dbeng. Рассмотрим пример кода, который инициализирует базу в памяти и создает виртуальную таблицу для справочника:


БазаДанных = СоздатьОбъект("SQLiteBase");
БазаДанных.Открыть(":memory:");
Запрос = БазаДанных.НовыйЗапрос();

// Создаем виртуальную таблицу, связывая метаданные 1С с SQLite
Запрос.ВыполнитьЗапрос("create virtual table Склады using dbeng(Справочник.Склады)");

Текст = "SELECT
|  code Код,
|  id [Склад :Справочник.Склады]
|FROM Склады";

Попытка
    ТЗ = Запрос.ВыполнитьЗапрос(Текст);
    ТЗ.ВыбратьСтроку();
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

В этом примере команда create virtual table сообщает компоненте, что нужно использовать драйвер dbeng для доступа к физическому файлу справочника «Склады». Обратите внимание на конструкцию [Склад :Справочник.Склады] — это механизм типизации. Благодаря ему в колонке таблицы значений будут находиться не просто строки идентификаторов, а полноценные объекты 1С.

Автоматическое подключение таблиц в 1SQLite

Современные версии компоненты 1SQLite позволяют упростить процесс и не прописывать create virtual table для каждого объекта вручную. Разберем, как обратиться к метаданным напрямую через специальные синтаксические конструкции. Выясним, какие варианты написания понимает компонента:

  1. Использование квадратных скобок: FROM [Справочник.Склады]. В этом случае компонента сама находит нужный DBF-файл и подключает его «на лету».
  2. Использование нижнего подчеркивания: FROM Справочник_Склады. Этот вариант часто используется в автозаменах метаданных.

Посмотрим на пример упрощенного запроса:


ТекстЗапроса = "
|SELECT
|    Склад.Descr as Наименование
|FROM
|    [Справочник.Склады] AS Склад";
ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);

Универсальный подход: Класс «ПрямойЗапрос» из 1C++

Если ваша задача — написать код, который будет одинаково успешно работать как в файловой версии (через SQLite), так и на MS SQL Server, рекомендуем использовать класс ПрямойЗапрос. Это высокоуровневая обертка над 1SQLite и ODBCRecordset. Рассмотрим преимущества этого подхода:

Для использования этого метода необходимо наличие библиотеки 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 сообществом разработаны мощные инструменты. Рекомендуем найти и использовать следующие обработки:

  1. Консоль прямых запросов: Позволяет писать SQL-код, выполнять его и сразу видеть результат в таблице, а также замерять время выполнения.
  2. Обработки для генерации метаимен: Помогают быстро получить правильные имена таблиц и полей (например, SP123 для реквизита справочника).

Подводя итог, можно сказать: использование прямых запросов через 1SQLite — это лучший способ вдохнуть новую жизнь в старую конфигурацию 7.7. Начните с простых выборок через dbeng, а затем переходите к использованию классов 1C++ для создания масштабируемых и быстрых решений.

← На главную