📦 Data Module v1.0

A1sQ — Запросы

Мощная библиотека для работы с запросами в 1С. Fluent-интерфейс, Builder-паттерн, автоматические параметры и защита от SQL-инъекций.

60+
Методов
2
API режима
100%
Fluent
0
SQL-инъекций
🚀 Быстрый старт

Два способа работы

Выберите подход, который лучше подходит для вашей задачи

FluentAPI.bsl
// ✨ Fluent API — читается как предложение

// Простой запрос с фильтрами
ТЗ = A1sQ.On()
    .Select("Ссылка, Наименование, Код")
    .From("Справочник.Номенклатура")
    .Where("НЕ ПометкаУдаления")
    .WhereEq("Родитель", РодительСсылка)
    .OrderBy("Наименование")
    .Top(100)
    .Unload(); //↩ ТаблицаЗначений

// Поиск с LIKE (автоэкранирование!)
Товары = A1sQ.On()
    .Select("*")
    .From("Справочник.Номенклатура")
    .WhereLike("Наименование", "Молоко", "Contains")
    .Unload();

// Проверка существования (оптимизированно с TOP 1)
Если A1sQ.On()
    .Select("Ссылка")
    .From("Документ.Заказ")
    .WhereEq("Контрагент", КонтрагентСсылка)
    .Exists() Тогда
    // Заказы найдены
КонецЕсли;
StaticAPI.bsl
// 📦 Static API — классический подход

// Быстрый запрос с автопараметрами
ТЗ = A1sQ.Unload(
    "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ Родитель = &Parent",
    РодительСсылка  // Автоматически станет &Parent
);

// Получить скалярное значение
Количество = A1sQ.ValueQ(
    "ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Номенклатура",
    0  // Значение по умолчанию
);

// Проверка существования
Если A1sQ.ExistsQ(
    "ВЫБРАТЬ * ИЗ Документ.Заказ ГДЕ Контрагент = &C",
    КонтрагентСсылка
) Тогда
    // ...
КонецЕсли;

// Выгрузка в массив
МассивСсылок = A1sQ.ArrayQ(
    "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура",
    "Ссылка"
);
Задача ❌ Было (стандартный 1С) ✅ Стало (A1sQ)
Простой запрос Запрос = Новый Запрос;
Запрос.Текст = "...";
Запрос.УстановитьПараметр(...);
ТЗ = Запрос.Выполнить().Выгрузить();
ТЗ = A1sQ.Unload("...", Параметр);
Проверка существования Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1...";
...
Если НЕ Выборка.Следующий() Тогда
Если A1sQ.ExistsQ("...") Тогда
Получить число Запрос = Новый Запрос;
...
ТЗ = Запрос.Выполнить().Выгрузить();
Если ТЗ.Количество() > 0 Тогда
Результат = ТЗ[0][0];
Результат = A1sQ.ValueQ("...", 0);
Поиск LIKE // Нужно экранировать %, _, ~ вручную!
Шаблон = СтрЗаменить(Строка, "%", "~%");
...
.WhereLike("Поле", "Текст", "Contains")
// Автоэкранирование!
✨ Возможности

Почему A1sQ?

🔗

Fluent Interface

Цепочки вызовов, которые читаются как предложения. Код становится самодокументируемым.

🔢

Автопараметры

Параметры извлекаются из текста запроса автоматически. Передавайте значения по порядку.

🛡️

Безопасность

Автоматическое экранирование для LIKE. Защита от SQL-инъекций из коробки.

Оптимизация

Exists() автоматически добавляет TOP 1. Автосоздание TempTablesManager при ПОМЕСТИТЬ.

🔄

Преобразования

Результат сразу в нужном формате: Array, Map, JSON, ValueList, Structure.

📊

Builder Pattern

Собирайте запросы программно: Select → From → Where → OrderBy → Execute.

🔗 Fluent API

A1sDP_Q — Методы цепочек

Точка входа: A1sQ.On()

🔧 Трансформаторы (возвращают ЭтотОбъект)

Метод Описание
.Text(Текст) Устанавливает полный текст запроса
.Select(Поля) Поля для выборки: "Ссылка, Наименование"
.From(Таблица) Источник данных: "Справочник.Номенклатура"
.Where(Условие) Добавляет условие WHERE через И
.WhereEq(Поле, Значение) Добавляет Поле = &Поле с параметром
.WhereIn(Поле, Массив) Добавляет Поле В (&Массив)
.WhereLike(Поле, Шаблон, Режим) ПОДОБНО с автоэкранированием. Режимы: Contains, StartsWith, EndsWith
.WhereBetween(Поле, От, До) Добавляет Поле МЕЖДУ &От И &До
.WhereNull(Поле) Добавляет Поле ЕСТЬ NULL
.OrderBy(Поля) Сортировка: "Дата Убыв, Номер"
.GroupBy(Поля) Группировка
.Top(N) Ограничение ПЕРВЫЕ N
.Param(Имя, Значение) Добавляет параметр запроса
.Params(Структура) Добавляет несколько параметров из структуры
.WithTemps() Создаёт новый TempTablesManager
.UseTemps(TTM) Использует существующий TempTablesManager

✅ Терминаторы (возвращают результат)

Метод Возвращает Описание
.Unload() ValueTable Выгружает результат в ТаблицуЗначений
.Execute() Selection Выполняет запрос и возвращает выборку
.Value(Default) Variant Возвращает первое значение первой колонки
.FirstRow() Selection Первая строка результата
.Exists() Boolean Проверка существования (оптимизировано)
.IsEmpty() Boolean Проверка отсутствия записей
.Count() Number Количество записей
.Column(Имя) Array Выгружает колонку в массив
.ToArray() Array Массив структур
.ToMap(Ключ, Значение) Map Соответствие из двух колонок
.ToJSON() String JSON-представление результата
.ToValueList(Поле, Представление) ValueList СписокЗначений
.Build() Query Возвращает объект Query (не выполняя)
.GetText() String Текст собранного запроса
📦 Static API

A1sQ — Статические функции

🔨 Создание и выполнение

Функция Возвращает Описание
CreateQ(Текст, TTM) Query Создаёт объект Query
NewQ(Текст, TTM, V1...V8) Query Создаёт Query с параметрами
Q(Текст, V1...V8) Query Короткая версия NewQ с AutoTemps=True
BuildQ(Текст, V1...V8) Query Собирает Query с автопараметрами
ExecuteQ(Текст, V1...V8) Selection Выполняет и возвращает выборку
Unload(Текст, V1...V8) ValueTable Выполняет и выгружает в ТЗ

📊 Быстрые запросы

Функция Возвращает Описание
ValueQ(Текст, Default, V1...V8) Variant Скалярное значение из первой ячейки
FirstRowQ(Текст, V1...V8) Selection Первая строка или Undefined
ExistsQ(Текст, V1...V8) Boolean Есть ли записи (с TOP 1)
CountQ(Таблица, Условие) Number Количество записей
ArrayQ(Текст, Колонка, V1...V8) Array Массив значений колонки
MapQ(Текст, КлючПоле, ЗначПоле) Map Соответствие из двух колонок
ValuesQ(Текст, Поле, Представление) ValueList СписокЗначений

🗂️ Временные таблицы

Функция Описание
GetTemps() Создаёт новый TempTablesManager
UnloadTemp(TTM, Имя) Выгружает временную таблицу по имени
UnloadAllTemps(TTM) Выгружает все временные таблицы в структуру
TT_Create(TTM, ТЗ, Имя) Создаёт временную таблицу из ТЗ
TT_Exists(TTM, Имя) Проверяет существование временной таблицы
DestroyTemp(TTM, Имя) Удаляет временную таблицу
💡 Примеры

Практические сценарии

ПрактическиеПримеры.bsl
// ═══════════════════════════════════════════════════════════════════════════════
// ПРИМЕР 1: Поиск товаров с фильтрами
// ═══════════════════════════════════════════════════════════════════════════════

Товары = A1sQ.On()
    .Select("Ссылка, Наименование, Артикул, Цена")
    .From("Справочник.Номенклатура")
    .Where("НЕ ПометкаУдаления")
    .Where("НЕ ЭтоГруппа")
    .WhereEq("ВидНоменклатуры", ВидТовар)
    .WhereLike("Наименование", СтрокаПоиска, "Contains")
    .OrderBy("Наименование")
    .Top(50)
    .Unload();


// ═══════════════════════════════════════════════════════════════════════════════
// ПРИМЕР 2: Отчёт по продажам за период
// ═══════════════════════════════════════════════════════════════════════════════

Продажи = A1sQ.On()
    .Select("Номенклатура, СУММА(Количество) КАК Количество, СУММА(Сумма) КАК Сумма")
    .From("Документ.РеализацияТоваровУслуг.Товары")
    .WhereBetween("Ссылка.Дата", НачалоПериода, КонецПериода)
    .Where("Ссылка.Проведен")
    .WhereEq("Ссылка.Организация", Организация)
    .GroupBy("Номенклатура")
    .Having("СУММА(Сумма) > 10000")
    .OrderBy("Сумма Убыв")
    .Unload();


// ═══════════════════════════════════════════════════════════════════════════════
// ПРИМЕР 3: Работа с временными таблицами
// ═══════════════════════════════════════════════════════════════════════════════

TTM = A1sQ.GetTemps();

// Шаг 1: Создаём временную таблицу товаров
A1sQ.On(TTM)
    .Text("ВЫБРАТЬ Ссылка, Наименование ПОМЕСТИТЬ ВТ_Товары 
    |ИЗ Справочник.Номенклатура ГДЕ Родитель = &Parent")
    .Param("Parent", РодительСсылка)
    .Execute();

// Шаг 2: Используем временную таблицу
Результат = A1sQ.On(TTM)
    .Text("ВЫБРАТЬ * ИЗ ВТ_Товары ГДЕ Наименование ПОДОБНО &Pattern")
    .Param("Pattern", "%молоко%")
    .Unload();


// ═══════════════════════════════════════════════════════════════════════════════
// ПРИМЕР 4: Преобразование результата
// ═══════════════════════════════════════════════════════════════════════════════

// В Соответствие (для быстрого поиска)
КодыПоСсылкам = A1sQ.On()
    .Select("Ссылка, Код")
    .From("Справочник.Номенклатура")
    .Where("НЕ ПометкаУдаления")
    .ToMap("Ссылка", "Код");

// В СписокЗначений (для формы)
СписокВалют = A1sQ.On()
    .Select("Ссылка, Наименование")
    .From("Справочник.Валюты")
    .Where("НЕ ПометкаУдаления")
    .OrderBy("Наименование")
    .ToValueList("Ссылка", "Наименование");

// В JSON (для API)
JSON = A1sQ.On()
    .Select("Код, Наименование, Цена")
    .From("Справочник.Номенклатура")
    .Top(10)
    .ToJSON();


// ═══════════════════════════════════════════════════════════════════════════════
// ПРИМЕР 5: Пакетное выполнение
// ═══════════════════════════════════════════════════════════════════════════════

Запросы = Новый Структура;
Запросы.Вставить("Товары", "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ Родитель = &Parent");
Запросы.Вставить("Услуги", "ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ ВидНоменклатуры = &ServiceType");

Параметры = A1sDS.Of("Parent", РодительСсылка, "ServiceType", ВидУслуга);

Результаты = A1sQ.BatchUnload(Запросы, Параметры);
// Результаты.Товары — ТаблицаЗначений
// Результаты.Услуги — ТаблицаЗначений
💡 Совет

Используйте .GetText() для отладки — он покажет итоговый текст запроса без выполнения.